steps 5-8: deep gut — purge chat/notes/projects/providers from code
Some checks failed
CI/CD / detect-changes (push) Successful in 4s
CI/CD / test-frontend (push) Failing after 6s
CI/CD / test-sqlite (push) Failing after 25s
CI/CD / test-go-pg (push) Failing after 26s
CI/CD / build-and-deploy (push) Has been skipped

main.go: remove ~300 lines of stale routes referencing deleted handlers
  (channels, messages, folders, personas, notes, projects, memories,
   models, providers, tasks, roles, usage, routing, capabilities, etc.)
  Fix branding: "Chat Switchboard" → "Switchboard Core"

pages: remove chat/notes/projects surface manifests and templates
  Keep: admin, settings, team-admin, workflow, workflow-landing

frontend: delete chat/, notes/, projects/ surface directories (19 files)
  Delete 5 CSS files (4,144 lines): sw-chat-*, sw-notes-*, sw-projects-*
  SDK: strip gutted API domains (594→287 lines), remove chatPane/notesPane

tests: remove integration_test.go (5,194 lines, broken imports to deleted
  packages) and perm_enforcement_test.go (551 lines, depended on deleted
  test helpers). Fix testmain_test.go (remove providers import).

openapi.yaml: replace 12,491-line stale spec with kernel auth stub.
  Full ICD rebuild is Step 8 proper.

Auth (builtin, mTLS, OIDC) untouched throughout.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-03-26 09:47:32 +00:00
parent a9c652ff59
commit 45291860c5
36 changed files with 76 additions and 25937 deletions

View File

@@ -1,7 +1,7 @@
// ==========================================
// Chat Switchboard — SDK: API Domain Namespaces
// Switchboard Core — SDK: API Domain Namespaces
// ==========================================
// 18 namespaced domain clients wrapping restClient.
// Namespaced domain clients wrapping restClient.
// Each domain is a plain object with typed methods.
//
// Factory: createDomains(restClient)
@@ -65,136 +65,13 @@ export function createDomains(restClient) {
logout: (refreshToken) => rc.post('/api/v1/auth/logout', { refresh_token: refreshToken }),
},
// ── 2. Channels ────────────────────────
channels: {
...crud(rc, '/api/v1/channels'),
messages: (id, opts) => rc.get(`/api/v1/channels/${id}/messages` + _qs(opts)),
send: (id, data) => rc.post(`/api/v1/channels/${id}/messages`, data),
complete: (data, signal) => rc.stream('/api/v1/chat/completions', data, signal),
regenerate: (id, msgId, data, signal) => rc.stream(`/api/v1/channels/${id}/messages/${msgId}/regenerate`, data, signal),
editMessage: (id, msgId, content) => rc.post(`/api/v1/channels/${id}/messages/${msgId}/edit`, { content }),
deleteMessage: (id, msgId) => rc.del(`/api/v1/channels/${id}/messages/${msgId}`),
siblings: (id, msgId) => rc.get(`/api/v1/channels/${id}/messages/${msgId}/siblings`),
path: (id) => rc.get(`/api/v1/channels/${id}/path`),
cursor: (id, leafId) => rc.put(`/api/v1/channels/${id}/cursor`, { active_leaf_id: leafId }),
markRead: (id) => rc.post(`/api/v1/channels/${id}/mark-read`, {}),
generateTitle: (id) => rc.post(`/api/v1/channels/${id}/generate-title`, {}),
summarize: (id) => rc.post(`/api/v1/channels/${id}/summarize`, {}),
// Participants
participants: (id) => rc.get(`/api/v1/channels/${id}/participants`),
addParticipant: (id, data) => rc.post(`/api/v1/channels/${id}/participants`, data),
updateParticipant: (id, pid, data) => rc.patch(`/api/v1/channels/${id}/participants/${pid}`, data),
removeParticipant: (id, pid) => rc.del(`/api/v1/channels/${id}/participants/${pid}`),
// Channel models
models: (id) => rc.get(`/api/v1/channels/${id}/models`),
addModel: (id, data) => rc.post(`/api/v1/channels/${id}/models`, data),
updateModel: (id, modelId, data) => rc.patch(`/api/v1/channels/${id}/models/${modelId}`, data),
removeModel: (id, modelId) => rc.del(`/api/v1/channels/${id}/models/${modelId}`),
// Knowledge bases
kbs: (id) => rc.get(`/api/v1/channels/${id}/knowledge-bases`),
setKbs: (id, kbIds) => rc.put(`/api/v1/channels/${id}/knowledge-bases`, { kb_ids: kbIds }),
// Files
files: (id, opts) => rc.get(`/api/v1/channels/${id}/files` + _qs(opts)),
uploadFile: (id, file) => rc.upload(`/api/v1/channels/${id}/files`, file),
},
// ── 3. Personas ────────────────────────
personas: {
...crud(rc, '/api/v1/personas'),
kbs: (id) => rc.get(`/api/v1/personas/${id}/knowledge-bases`),
setKbs: (id, data) => rc.put(`/api/v1/personas/${id}/knowledge-bases`, data),
},
// ── 4. Knowledge Bases ─────────────────
knowledge: {
...crud(rc, '/api/v1/knowledge-bases'),
discoverable: () => rc.get('/api/v1/knowledge-bases-discoverable'),
search: (id, query, limit) => rc.post(`/api/v1/knowledge-bases/${id}/search`, { query, limit }),
documents: (id) => rc.get(`/api/v1/knowledge-bases/${id}/documents`),
upload: (id, file) => rc.upload(`/api/v1/knowledge-bases/${id}/documents`, file),
docStatus: (id, docId) => rc.get(`/api/v1/knowledge-bases/${id}/documents/${docId}/status`),
delDoc: (id, docId) => rc.del(`/api/v1/knowledge-bases/${id}/documents/${docId}`),
},
// ── 5. Notes ───────────────────────────
notes: {
...crud(rc, '/api/v1/notes'),
search: (query, limit) => rc.get(`/api/v1/notes/search` + _qs({ q: query, limit })),
searchTitles: (query, limit) => rc.get(`/api/v1/notes/search-titles` + _qs({ q: query, limit })),
folders: () => rc.get('/api/v1/notes/folders'),
backlinks: (id) => rc.get(`/api/v1/notes/${id}/backlinks`),
graph: () => rc.get('/api/v1/notes/graph'),
bulkDelete: (ids) => rc.post('/api/v1/notes/bulk-delete', { ids }),
},
// ── 6. Projects ────────────────────────
projects: {
...crud(rc, '/api/v1/projects'),
channels: (id) => rc.get(`/api/v1/projects/${id}/channels`),
addChannel: (id, channelId, pos) => rc.post(`/api/v1/projects/${id}/channels`, { channel_id: channelId, position: pos || 0 }),
removeChannel: (id, channelId) => rc.del(`/api/v1/projects/${id}/channels/${channelId}`),
reorderChannels:(id, channelIds) => rc.put(`/api/v1/projects/${id}/channels/reorder`, { channel_ids: channelIds }),
kbs: (id) => rc.get(`/api/v1/projects/${id}/knowledge-bases`),
addKb: (id, kbId, autoSearch) => rc.post(`/api/v1/projects/${id}/knowledge-bases`, { kb_id: kbId, auto_search: autoSearch || false }),
removeKb: (id, kbId) => rc.del(`/api/v1/projects/${id}/knowledge-bases/${kbId}`),
notes: (id) => rc.get(`/api/v1/projects/${id}/notes`),
addNote: (id, noteId) => rc.post(`/api/v1/projects/${id}/notes`, { note_id: noteId }),
removeNote: (id, noteId) => rc.del(`/api/v1/projects/${id}/notes/${noteId}`),
files: (id, opts) => rc.get(`/api/v1/projects/${id}/files` + _qs(opts)),
uploadFile: (id, file, path) => rc.upload(`/api/v1/projects/${id}/files` + (path ? _qs({ path }) : ''), file),
deleteFile: (id, path) => rc.del(`/api/v1/projects/${id}/files` + _qs({ path })),
mkdir: (id, path) => rc.post(`/api/v1/projects/${id}/files/mkdir`, { path }),
uploadArchive: (id, file) => rc.upload(`/api/v1/projects/${id}/archive/upload`, file),
},
// ── 7. Workspaces ──────────────────────
workspaces: {
...crud(rc, '/api/v1/workspaces'),
update: (id, data) => rc.patch(`/api/v1/workspaces/${id}`, data),
getDefault: () => rc.get('/api/v1/workspaces/default'),
files: (id, opts) => rc.get(`/api/v1/workspaces/${id}/files` + _qs(opts)),
readFile: (id, path) => rc.get(`/api/v1/workspaces/${id}/files/read` + _qs({ path })),
writeFile: (id, path, content) => rc.put(`/api/v1/workspaces/${id}/files/write` + _qs({ path }), content),
deleteFile: (id, path) => rc.del(`/api/v1/workspaces/${id}/files/delete` + _qs({ path })),
mkdir: (id, path) => rc.post(`/api/v1/workspaces/${id}/files/mkdir`, { path }),
gitStatus: (id) => rc.get(`/api/v1/workspaces/${id}/git/status`),
gitBranches: (id) => rc.get(`/api/v1/workspaces/${id}/git/branches`),
credentials: () => rc.get('/api/v1/git-credentials'),
},
// ── 8. Memory ──────────────────────────
memory: {
list: (opts) => rc.get('/api/v1/memories' + _qs(opts)),
get: (id) => rc.get(`/api/v1/memories/${id}`),
update: (id, data) => rc.put(`/api/v1/memories/${id}`, data),
del: (id) => rc.del(`/api/v1/memories/${id}`),
count: () => rc.get('/api/v1/memories/count'),
approve: (id) => rc.post(`/api/v1/memories/${id}/approve`, {}),
reject: (id) => rc.post(`/api/v1/memories/${id}/reject`, {}),
},
// ── 9. Models ──────────────────────────
models: {
enabled: () => rc.get('/api/v1/models/enabled'),
preferences: () => rc.get('/api/v1/models/preferences'),
setPref: (modelId, provId, hidden) => rc.put('/api/v1/models/preferences', { model_id: modelId, provider_config_id: provId, hidden }),
bulkSetPref: (entries, hidden) => rc.post('/api/v1/models/preferences/bulk', { entries, hidden }),
},
// ── 10. Providers (user BYOK) ──────────
providers: {
...crud(rc, '/api/v1/api-configs'),
models: (id) => rc.get(`/api/v1/api-configs/${id}/models`),
fetchModels: (id) => rc.post(`/api/v1/api-configs/${id}/models/fetch`),
},
// ── 10b. Connections (v0.38.1) ────────
// ── 2. Connections ────────────────────
connections: {
...crud(rc, '/api/v1/connections'),
resolve: (type, name) => rc.get('/api/v1/connections/resolve' + _qs({ type, name })),
},
// ── 10c. Connection Types (v0.38.4) ──
// ── 3. Connection Types ────────────────
connectionTypes: {
list: () => rc.get('/api/v1/connection-types'),
},
@@ -239,30 +116,14 @@ export function createDomains(restClient) {
addMember: (id, userId, role) => rc.post(`/api/v1/teams/${id}/members`, { user_id: userId, role }),
updateMember:(id, memberId, role) => rc.put(`/api/v1/teams/${id}/members/${memberId}`, { role }),
removeMember:(id, memberId) => rc.del(`/api/v1/teams/${id}/members/${memberId}`),
personas: (id) => rc.get(`/api/v1/teams/${id}/personas`),
createPersona:(id, data) => rc.post(`/api/v1/teams/${id}/personas`, data),
updatePersona:(id, pid, data) => rc.put(`/api/v1/teams/${id}/personas/${pid}`, data),
deletePersona:(id, pid) => rc.del(`/api/v1/teams/${id}/personas/${pid}`),
personaKbs: (id, pid) => rc.get(`/api/v1/teams/${id}/personas/${pid}/knowledge-bases`),
setPersonaKbs:(id, pid, data) => rc.put(`/api/v1/teams/${id}/personas/${pid}/knowledge-bases`, data),
models: (id) => rc.get(`/api/v1/teams/${id}/models`),
groups: (id) => rc.get(`/api/v1/teams/${id}/groups`),
providers: (id) => rc.get(`/api/v1/teams/${id}/providers`),
createProvider:(id, data) => rc.post(`/api/v1/teams/${id}/providers`, data),
updateProvider:(id, pid, data) => rc.put(`/api/v1/teams/${id}/providers/${pid}`, data),
deleteProvider:(id, pid) => rc.del(`/api/v1/teams/${id}/providers/${pid}`),
providerModels:(id, pid) => rc.get(`/api/v1/teams/${id}/providers/${pid}/models`),
// Team connections (v0.38.1)
// Team connections
connections: (id) => rc.get(`/api/v1/teams/${id}/connections`),
createConnection: (id, data) => rc.post(`/api/v1/teams/${id}/connections`, data),
updateConnection: (id, cid, data) => rc.put(`/api/v1/teams/${id}/connections/${cid}`, data),
deleteConnection: (id, cid) => rc.del(`/api/v1/teams/${id}/connections/${cid}`),
roles: (id) => rc.get(`/api/v1/teams/${id}/roles`),
updateRole: (id, role, config) => rc.put(`/api/v1/teams/${id}/roles/${role}`, config),
deleteRole: (id, role) => rc.del(`/api/v1/teams/${id}/roles/${role}`),
audit: (id, opts) => rc.get(`/api/v1/teams/${id}/audit` + _qs(opts)),
auditActions:(id) => rc.get(`/api/v1/teams/${id}/audit/actions`),
usage: (id, opts) => rc.get(`/api/v1/teams/${id}/usage` + _qs(opts)),
// Team workflows
workflows: (id, opts) => rc.get(`/api/v1/teams/${id}/workflows` + _qs(opts)),
createWorkflow: (id, data) => rc.post(`/api/v1/teams/${id}/workflows`, data),
@@ -276,22 +137,9 @@ export function createDomains(restClient) {
updateWorkflowStage: (id, wfId, sid, data) => rc.put(`/api/v1/teams/${id}/workflows/${wfId}/stages/${sid}`, data),
deleteWorkflowStage: (id, wfId, sid) => rc.del(`/api/v1/teams/${id}/workflows/${wfId}/stages/${sid}`),
reorderWorkflowStages: (id, wfId, ids) => rc.patch(`/api/v1/teams/${id}/workflows/${wfId}/stages/reorder`, { ordered_ids: ids }),
// Team assignments + monitor (v0.37.15)
assignments: (id, opts) => rc.get(`/api/v1/teams/${id}/assignments` + _qs(opts)),
workflowInstances: (id) => rc.get(`/api/v1/teams/${id}/workflows/monitor/instances`),
cancelWorkflowInstance: (id, chId) => rc.post(`/api/v1/teams/${id}/workflows/monitor/instances/${chId}/cancel`, {}),
// Team tasks
tasks: (id, opts) => rc.get(`/api/v1/teams/${id}/tasks` + _qs(opts)),
createTask: (id, data) => rc.post(`/api/v1/teams/${id}/tasks`, data),
updateTask: (id, taskId, data) => rc.put(`/api/v1/teams/${id}/tasks/${taskId}`, data),
deleteTask: (id, taskId) => rc.del(`/api/v1/teams/${id}/tasks/${taskId}`),
runTask: (id, taskId) => rc.post(`/api/v1/teams/${id}/tasks/${taskId}/run`, {}),
killTask: (id, taskId) => rc.post(`/api/v1/teams/${id}/tasks/${taskId}/kill`, {}),
// Team knowledge bases
knowledgeBases:(id) => rc.get(`/api/v1/teams/${id}/knowledge-bases`),
},
// ── 15. Workflows ──────────────────────
// ── 9. Workflows ──────────────────────
workflows: {
...crud(rc, '/api/v1/workflows'),
update: (id, data) => rc.patch(`/api/v1/workflows/${id}`, data),
@@ -302,27 +150,7 @@ export function createDomains(restClient) {
cancel: (channelId) => rc.post(`/api/v1/channels/${channelId}/workflow/cancel`, {}),
},
// ── 15b. Workflow Assignments (v0.37.15)
workflowAssignments: {
mine: () => rc.get('/api/v1/workflow-assignments/mine'),
get: (id) => rc.get(`/api/v1/workflow-assignments/${id}`),
claim: (id) => rc.post(`/api/v1/workflow-assignments/${id}/claim`, {}),
unclaim: (id) => rc.post(`/api/v1/workflow-assignments/${id}/unclaim`, {}),
complete: (id) => rc.post(`/api/v1/workflow-assignments/${id}/complete`, {}),
reassign: (id, userId) => rc.post(`/api/v1/workflow-assignments/${id}/reassign`, { user_id: userId }),
cancel: (id) => rc.post(`/api/v1/workflow-assignments/${id}/cancel`, {}),
comment: (id, text) => rc.post(`/api/v1/workflow-assignments/${id}/comment`, { text }),
},
// ── 16. Tasks ──────────────────────────
tasks: {
...crud(rc, '/api/v1/tasks'),
runs: (id, opts) => rc.get(`/api/v1/tasks/${id}/runs` + _qs(opts)),
start: (id, data) => rc.post(`/api/v1/tasks/${id}/run`, data || {}),
stop: (id) => rc.post(`/api/v1/tasks/${id}/kill`, {}),
},
// ── 17. Surfaces ───────────────────────
// ── 10. Surfaces ─────────────────────
surfaces: {
list: (opts) => rc.get('/api/v1/surfaces' + _qs(opts)),
get: (id) => rc.get(`/api/v1/surfaces/${id}`),
@@ -332,7 +160,6 @@ export function createDomains(restClient) {
// ── 18. Admin ──────────────────────────
admin: {
stats: () => rc.get('/api/v1/admin/stats'),
dashboard: () => rc.get('/api/v1/admin/dashboard'),
users: {
list: (opts) => rc.get('/api/v1/admin/users' + _qs(opts)),
@@ -351,38 +178,6 @@ export function createDomains(restClient) {
public: () => rc.get('/api/v1/settings/public'),
},
configs: {
list: () => rc.get('/api/v1/admin/configs'),
create: (data) => rc.post('/api/v1/admin/configs', data),
update: (id, data) => rc.put(`/api/v1/admin/configs/${id}`, data),
del: (id) => rc.del(`/api/v1/admin/configs/${id}`),
},
models: {
list: () => rc.get('/api/v1/admin/models'),
fetch: () => rc.post('/api/v1/admin/models/fetch', {}),
update: (id, data) => rc.put(`/api/v1/admin/models/${id}`, data),
bulkUpdate: (visibility) => rc.put('/api/v1/admin/models/bulk', { visibility, is_enabled: visibility === 'enabled' }),
del: (id) => rc.del(`/api/v1/admin/models/${id}`),
capabilities: (modelId) => rc.get(`/api/v1/admin/models/${encodeURIComponent(modelId)}/capabilities`),
setCapability: (modelId, d) => rc.put(`/api/v1/admin/models/${encodeURIComponent(modelId)}/capabilities`, d),
delCapability: (modelId, oId) => rc.del(`/api/v1/admin/models/${encodeURIComponent(modelId)}/capabilities/${oId}`),
overrides: () => rc.get('/api/v1/admin/capability-overrides'),
},
personas: {
list: () => rc.get('/api/v1/admin/personas'),
create: (data) => rc.post('/api/v1/admin/personas', data),
update: (id, data) => rc.put(`/api/v1/admin/personas/${id}`, data),
del: (id) => rc.del(`/api/v1/admin/personas/${id}`),
avatar: (id, base64) => rc.post(`/api/v1/admin/personas/${id}/avatar`, { image: base64 }),
delAvatar: (id) => rc.del(`/api/v1/admin/personas/${id}/avatar`),
kbs: (id) => rc.get(`/api/v1/admin/personas/${id}/knowledge-bases`),
setKbs: (id, data) => rc.put(`/api/v1/admin/personas/${id}/knowledge-bases`, data),
toolGrants: (id) => rc.get(`/api/v1/admin/personas/${id}/tool-grants`),
setToolGrants: (id, data) => rc.put(`/api/v1/admin/personas/${id}/tool-grants`, data),
},
teams: {
list: () => rc.get('/api/v1/admin/teams'),
get: (id) => rc.get(`/api/v1/admin/teams/${id}`),
@@ -421,71 +216,19 @@ export function createDomains(restClient) {
actions: () => rc.get('/api/v1/admin/audit/actions'),
},
roles: {
list: () => rc.get('/api/v1/admin/roles'),
get: (role) => rc.get(`/api/v1/admin/roles/${role}`),
update: (role, config) => rc.put(`/api/v1/admin/roles/${role}`, config),
test: (role) => rc.post(`/api/v1/admin/roles/${role}/test`, {}),
},
usage: {
get: (opts) => rc.get('/api/v1/admin/usage' + _qs(opts)),
user: (id, opts) => rc.get(`/api/v1/admin/usage/users/${id}` + _qs(opts)),
team: (id, opts) => rc.get(`/api/v1/admin/usage/teams/${id}` + _qs(opts)),
},
pricing: {
list: () => rc.get('/api/v1/admin/pricing'),
upsert: (entry) => rc.put('/api/v1/admin/pricing', entry),
del: (provId, modelId) => rc.del(`/api/v1/admin/pricing/${provId}/${encodeURIComponent(modelId)}`),
},
providers: {
health: () => rc.get('/api/v1/admin/providers/health'),
healthOne: (id) => rc.get(`/api/v1/admin/providers/${id}/health`),
types: () => rc.get('/api/v1/admin/provider-types'),
},
routing: {
policies: () => rc.get('/api/v1/admin/routing/policies'),
getPolicy: (id) => rc.get(`/api/v1/admin/routing/policies/${id}`),
createPolicy:(data) => rc.post('/api/v1/admin/routing/policies', data),
updatePolicy:(id, data) => rc.put(`/api/v1/admin/routing/policies/${id}`, data),
deletePolicy:(id) => rc.del(`/api/v1/admin/routing/policies/${id}`),
test: (data) => rc.post('/api/v1/admin/routing/test', data),
},
storage: {
status: () => rc.get('/api/v1/admin/storage/status'),
orphans: () => rc.get('/api/v1/admin/storage/orphans'),
cleanup: () => rc.post('/api/v1/admin/storage/cleanup', {}),
extraction: () => rc.get('/api/v1/admin/storage/extraction'),
},
vault: {
status: () => rc.get('/api/v1/admin/vault/status'),
},
projects: {
list: (opts) => rc.get('/api/v1/admin/projects' + _qs(opts)),
del: (id) => rc.del(`/api/v1/admin/projects/${id}`),
},
memories: {
pending: () => rc.get('/api/v1/admin/memories/pending'),
bulkApprove: (ids) => rc.post('/api/v1/admin/memories/bulk-approve', { ids }),
},
notifications: {
testEmail: () => rc.post('/api/v1/admin/notifications/test-email', {}),
broadcast: (data) => rc.post('/api/v1/admin/notifications/broadcast', data),
},
channels: {
archived: (opts) => rc.get('/api/v1/admin/channels/archived' + _qs(opts)),
purge: (id) => rc.del(`/api/v1/admin/channels/${id}/purge`),
},
extensions: {
list: () => rc.get('/api/v1/admin/extensions'),
create: (data) => rc.post('/api/v1/admin/extensions', data),
@@ -516,13 +259,6 @@ export function createDomains(restClient) {
list: () => rc.get('/api/v1/admin/dependencies'),
},
tasks: {
list: () => rc.get('/api/v1/admin/tasks'),
run: (id) => rc.post(`/api/v1/admin/tasks/${id}/run`, {}),
kill: (id) => rc.post(`/api/v1/admin/tasks/${id}/kill`, {}),
del: (id) => rc.del(`/api/v1/admin/tasks/${id}`),
},
surfaces: {
list: () => rc.get('/api/v1/admin/surfaces'),
get: (id) => rc.get(`/api/v1/admin/surfaces/${id}`),
@@ -533,42 +269,6 @@ export function createDomains(restClient) {
},
},
// ── 19. Git Credentials ──────────────────
git: {
credentials: {
list: () => rc.get('/api/v1/git-credentials'),
create: (data) => rc.post('/api/v1/git-credentials', data),
del: (id) => rc.del(`/api/v1/git-credentials/${id}`),
},
},
// ── 20. Data Portability ─────────────────
dataPortability: {
exportMe: () => rc.get('/api/v1/export/me'),
deleteAccount: (data) => rc.post('/api/v1/profile/delete', data),
},
// ── Misc (not domain-specific) ─────────
folders: {
list: () => rc.get('/api/v1/folders'),
create: (name, opts) => rc.post('/api/v1/folders', { name, parent_id: opts?.parent_id || null, sort_order: opts?.sort_order || 0 }),
update: (id, data) => rc.put(`/api/v1/folders/${id}`, data),
del: (id) => rc.del(`/api/v1/folders/${id}`),
},
// NOTE: notifications is defined in the main domain block above (§11).
// The duplicate here was overwriting prefs/setPref/delPref methods.
// Removed — see line ~190 for the canonical definition.
files: {
get: (id) => rc.get(`/api/v1/files/${id}`),
del: (id) => rc.del(`/api/v1/files/${id}`),
},
tools: {
list: () => rc.get('/api/v1/tools'),
},
// ── Users ──────────────────────────────
users: {
search: (q) => rc.get('/api/v1/users/search' + _qs({ q })),
@@ -578,16 +278,10 @@ export function createDomains(restClient) {
heartbeat: () => rc.post('/api/v1/presence/heartbeat', {}),
},
usage: {
mine: (opts) => rc.get('/api/v1/usage' + _qs(opts)),
},
groups: {
mine: () => rc.get('/api/v1/groups/mine'),
},
health: () => rc.get('/api/v1/health'),
export: (content, format, filename) => rc.post('/api/v1/export', { content, format, filename }),
};
}

View File

@@ -1,5 +1,5 @@
// ==========================================
// Chat Switchboard — SDK Entry Point
// Switchboard Core — SDK Entry Point
// ==========================================
// Assembles all SDK modules into the `sw` object
// and runs the boot sequence.
@@ -129,28 +129,6 @@ export async function boot() {
});
};
// ChatPane render helper — surfaces call sw.chatPane(container, opts)
// Returns Promise<imperative handle> for backward-compat with old ChatPane API.
sw.chatPane = function (container, opts = {}) {
return import('../components/chat-pane/index.js').then(({ ChatPane }) => {
const handleRef = { current: null };
const { render } = preact;
render(html`<${ChatPane} handleRef=${handleRef} ...${opts} />`, container);
return handleRef.current;
});
};
// NotesPane render helper — surfaces call sw.notesPane(container, opts)
// Returns Promise<imperative handle>.
sw.notesPane = function (container, opts = {}) {
return import('../components/notes-pane/index.js').then(({ NotesPane }) => {
const handleRef = { current: null };
const { render } = preact;
render(html`<${NotesPane} handleRef=${handleRef} ...${opts} />`, container);
return handleRef.current;
});
};
// Marker for idempotency
sw._sdk = '0.38.1';