@opengeni/api-router 2.10.0-canary.6 → 2.11.0-canary.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/dist/app.js +1 -1
  2. package/dist/{chunk-NWSVDE7O.js → chunk-EAYCECQK.js} +30234 -29169
  3. package/dist/chunk-EAYCECQK.js.map +1 -0
  4. package/dist/codemode.d.ts +13 -0
  5. package/dist/index.js +1 -1
  6. package/dist/integrations/slack-interactions.d.ts +1 -1
  7. package/dist/interaction-agent-access.d.ts +19 -0
  8. package/dist/mcp/documents.d.ts +8 -1
  9. package/dist/mcp/first-party-tool-permissions.d.ts +572 -0
  10. package/dist/mcp/server.d.ts +12 -1
  11. package/dist/mcp/session-view.d.ts +2 -0
  12. package/dist/routes/api-keys.d.ts +16 -1
  13. package/dist/routes/feedback.d.ts +3 -0
  14. package/dist/routes/model-connection-access.d.ts +3 -0
  15. package/dist/routes/organization-sessions.d.ts +26 -0
  16. package/dist/routes/supergrok.d.ts +10 -1
  17. package/dist/site-session-origin.d.ts +6 -0
  18. package/dist/workspace-tool-gateway.d.ts +2 -1
  19. package/package.json +19 -19
  20. package/src/app.ts +39 -6
  21. package/src/codemode.ts +42 -6
  22. package/src/integrations/slack-interactions.ts +24 -13
  23. package/src/interaction-agent-access.ts +60 -0
  24. package/src/mcp/documents.ts +22 -1
  25. package/src/mcp/first-party-tool-permissions.ts +278 -0
  26. package/src/mcp/server.ts +240 -263
  27. package/src/routes/api-keys.ts +48 -4
  28. package/src/routes/browser-sessions.ts +9 -6
  29. package/src/routes/computer-sessions.ts +9 -6
  30. package/src/routes/documents.ts +12 -0
  31. package/src/routes/feedback.ts +113 -0
  32. package/src/routes/files.ts +37 -2
  33. package/src/routes/machines.ts +32 -1
  34. package/src/routes/model-connection-access.ts +161 -0
  35. package/src/routes/organization-sessions.ts +342 -0
  36. package/src/routes/sessions.ts +51 -2
  37. package/src/routes/supergrok.ts +183 -5
  38. package/src/routes/workspaces.ts +15 -4
  39. package/src/site-session-origin.ts +28 -0
  40. package/src/workspace-tool-gateway.ts +30 -2
  41. package/dist/chunk-NWSVDE7O.js.map +0 -1
@@ -1,5 +1,18 @@
1
1
  import { type AccessGrant, type AttemptToolCatalog, type CodemodeCallSubmission as CodemodeCallSubmissionValue, type CodemodeOperation } from "@opengeni/contracts";
2
2
  import type { ApiRouteDeps } from "@opengeni/core";
3
+ import { type Settings } from "@opengeni/config";
4
+ import { type Permission, type Session } from "@opengeni/contracts";
5
+ /** The REST authority a Codemode SDK proxy token may ever carry. */
6
+ export declare const CODEMODE_SESSION_PROXY_PERMISSION_CEILING: readonly ["workspace:read", "sessions:read", "sessions:create", "sessions:control"];
7
+ /**
8
+ * Proxy permissions = the session's effective first-party permissions, cut
9
+ * down to what its exact model-visible tool selection could actually
10
+ * exercise (plus workspace:read for the context routes), under the fixed
11
+ * ceiling above. A session whose selection has no session_* tool therefore
12
+ * gets only workspace:read and every proxied /sessions handler refuses it,
13
+ * exactly as its MCP surface would.
14
+ */
15
+ export declare function codemodeSessionProxyPermissions(settings: Pick<Settings, "defaultFirstPartyMcpTools" | "allowedFirstPartyMcpTools">, session: Pick<Session, "firstPartyMcpTools" | "firstPartyMcpPermissions">): Permission[];
3
16
  /** Reuse normal REST handlers, including their resource/command authorization.
4
17
  * The exact attempt is checked before issuing this internal-only credential. */
5
18
  export declare function codemodeSessionRequest(deps: ApiRouteDeps, grant: AccessGrant, request: Request, path: string): Promise<Request>;
package/dist/index.js CHANGED
@@ -7,7 +7,7 @@ import {
7
7
  createOpenGeniSlackBotInteractionClient,
8
8
  startSlackInteractionPump,
9
9
  startTemporalScheduleCleanupPump
10
- } from "./chunk-NWSVDE7O.js";
10
+ } from "./chunk-EAYCECQK.js";
11
11
 
12
12
  // src/index.ts
13
13
  import {
@@ -19,7 +19,7 @@ export declare const SLACK_SESSION_INSTRUCTIONS: string;
19
19
  * selection at session creation while keeping Slack mutations out of the model
20
20
  * surface; interaction delivery remains owned by the durable delivery pump.
21
21
  */
22
- export declare const SLACK_TASK_FIRST_PARTY_MCP_TOOLS: ("artifacts_archive" | "artifacts_create" | "artifacts_get_source" | "artifacts_list" | "artifacts_prepare_upload" | "artifacts_publish" | "artifacts_restore" | "artifacts_rollback" | "atlassian_get" | "atlassian_search" | "atlassian_sources_list" | "browser_act" | "browser_auth" | "browser_clipboard" | "browser_debug" | "browser_identity" | "browser_lifecycle" | "browser_observe" | "browser_open" | "browser_publish" | "browser_tabs" | "capability_authorization_request" | "capability_catalog_search" | "command_read" | "command_wait" | "company_profile_confirm" | "company_profile_propose" | "computer_act" | "computer_clipboard" | "computer_lifecycle" | "computer_observe" | "computer_open" | "computer_targets" | "connected_machine_remove" | "editable_artifact_apply" | "editable_artifact_create" | "editable_artifact_export" | "editable_artifact_export_status" | "editable_artifact_get" | "editable_artifact_import" | "editable_artifact_inspect" | "editable_artifact_list" | "environment_list" | "environment_set_variable" | "fiken_bank_accounts_list" | "fiken_companies_list" | "fiken_contact_create" | "fiken_contacts_list" | "fiken_invoice_draft_create" | "fiken_invoice_get" | "fiken_invoices_list" | "fiken_products_list" | "fiken_purchases_list" | "fiken_sales_list" | "github_connect_link" | "github_repositories_list" | "goal_complete" | "goal_pause" | "goal_progress" | "goal_resume" | "goal_set" | "goal_update" | "instruction_policy_propose" | "interaction_discover" | "interaction_request_human" | "knowledge_correct" | "knowledge_propose" | "memory_correct" | "memory_save" | "memory_search" | "preference_propose" | "preference_registry_get" | "preference_registry_summary" | "reddit_accounts_list" | "reddit_mentions_live" | "reddit_post_reply" | "reddit_posts_sync" | "reddit_search_live" | "reddit_thread_fetch" | "remember" | "remember_confirm" | "rig_get" | "rig_list" | "rig_promote" | "rig_propose_change" | "rig_verify" | "run_on" | "sandbox_attach" | "sandbox_file_publish" | "sandbox_provision" | "sandbox_swap" | "sandboxes_list" | "scheduled_task_runs_list" | "scheduled_tasks_create" | "scheduled_tasks_delete" | "scheduled_tasks_get" | "scheduled_tasks_list" | "scheduled_tasks_pause" | "scheduled_tasks_resume" | "scheduled_tasks_trigger" | "scheduled_tasks_update" | "session_create" | "session_events" | "session_get" | "session_human_input_respond" | "session_pause" | "session_resume" | "session_send_message" | "session_steer" | "session_wait" | "sessions_list" | "set_other_session_title" | "set_session_title" | "slack_bot_channel_history" | "slack_bot_delete_message" | "slack_bot_file_content" | "slack_bot_file_info" | "slack_bot_list_channels" | "slack_bot_list_files" | "slack_bot_list_users" | "slack_bot_post_message" | "slack_bot_search" | "slack_bot_thread_replies" | "social_connections_list" | "social_daily_analysis_context" | "social_mentions_live" | "social_post_reply" | "social_posts_recent" | "social_posts_sync" | "social_search_live" | "social_thread_fetch" | "task_note_archive" | "task_note_promote_instruction_policy" | "task_note_promote_knowledge" | "task_note_promote_preference" | "task_note_replace" | "task_note_save" | "task_notes_list" | "variable_set_get_variable" | "variable_set_list" | "variable_set_set_variable" | "wait_for_input" | "work_claim_release" | "work_claim_upsert" | "x_accounts_list" | "x_mentions_live" | "x_post_reply" | "x_posts_sync" | "x_search_live" | "x_thread_fetch")[];
22
+ export declare const SLACK_TASK_FIRST_PARTY_MCP_TOOLS: ("artifacts_archive" | "artifacts_create" | "artifacts_get_source" | "artifacts_list" | "artifacts_prepare_upload" | "artifacts_publish" | "artifacts_restore" | "artifacts_rollback" | "atlassian_get" | "atlassian_search" | "atlassian_sources_list" | "browser_act" | "browser_auth" | "browser_clipboard" | "browser_debug" | "browser_identity" | "browser_lifecycle" | "browser_observe" | "browser_open" | "browser_publish" | "browser_tabs" | "capability_authorization_request" | "capability_catalog_search" | "command_read" | "command_wait" | "company_profile_confirm" | "company_profile_propose" | "computer_act" | "computer_clipboard" | "computer_lifecycle" | "computer_observe" | "computer_open" | "computer_targets" | "connected_machine_remove" | "editable_artifact_apply" | "editable_artifact_create" | "editable_artifact_export" | "editable_artifact_export_status" | "editable_artifact_get" | "editable_artifact_import" | "editable_artifact_inspect" | "editable_artifact_list" | "environment_list" | "environment_set_variable" | "fiken_bank_accounts_list" | "fiken_companies_list" | "fiken_contact_create" | "fiken_contacts_list" | "fiken_invoice_draft_create" | "fiken_invoice_get" | "fiken_invoices_list" | "fiken_products_list" | "fiken_purchases_list" | "fiken_sales_list" | "github_connect_link" | "github_repositories_list" | "goal_complete" | "goal_pause" | "goal_progress" | "goal_resume" | "goal_set" | "goal_update" | "instruction_policy_propose" | "interaction_discover" | "interaction_request_human" | "knowledge_correct" | "knowledge_propose" | "memory_correct" | "memory_save" | "memory_search" | "preference_propose" | "preference_registry_get" | "preference_registry_summary" | "project_create" | "project_delete" | "project_get" | "project_list" | "project_reorder" | "project_update" | "reddit_accounts_list" | "reddit_mentions_live" | "reddit_post_reply" | "reddit_posts_sync" | "reddit_search_live" | "reddit_thread_fetch" | "remember" | "remember_confirm" | "rig_get" | "rig_list" | "rig_promote" | "rig_propose_change" | "rig_verify" | "run_on" | "sandbox_attach" | "sandbox_file_publish" | "sandbox_provision" | "sandbox_swap" | "sandboxes_list" | "scheduled_task_runs_list" | "scheduled_tasks_create" | "scheduled_tasks_delete" | "scheduled_tasks_get" | "scheduled_tasks_list" | "scheduled_tasks_pause" | "scheduled_tasks_resume" | "scheduled_tasks_trigger" | "scheduled_tasks_update" | "session_create" | "session_events" | "session_get" | "session_human_input_respond" | "session_pause" | "session_resume" | "session_send_message" | "session_set_project" | "session_steer" | "session_wait" | "sessions_list" | "set_other_session_title" | "set_session_title" | "slack_bot_channel_history" | "slack_bot_delete_message" | "slack_bot_file_content" | "slack_bot_file_info" | "slack_bot_list_channels" | "slack_bot_list_files" | "slack_bot_list_users" | "slack_bot_post_message" | "slack_bot_search" | "slack_bot_thread_replies" | "social_connections_list" | "social_daily_analysis_context" | "social_mentions_live" | "social_post_reply" | "social_posts_recent" | "social_posts_sync" | "social_search_live" | "social_thread_fetch" | "task_note_archive" | "task_note_promote_instruction_policy" | "task_note_promote_knowledge" | "task_note_promote_preference" | "task_note_replace" | "task_note_save" | "task_notes_list" | "variable_set_get_variable" | "variable_set_list" | "variable_set_set_variable" | "wait_for_input" | "work_claim_release" | "work_claim_upsert" | "x_accounts_list" | "x_mentions_live" | "x_post_reply" | "x_posts_sync" | "x_search_live" | "x_thread_fetch")[];
23
23
  export type NormalizedSlackInteraction = {
24
24
  providerEventId: string;
25
25
  providerMessageId: string;
@@ -0,0 +1,19 @@
1
+ import type { AccessGrant } from "@opengeni/contracts";
2
+ import { type ApiRouteDeps } from "@opengeni/core";
3
+ type AssociatedInteractionSession = {
4
+ associations: ReadonlyArray<{
5
+ sessionId: string;
6
+ }>;
7
+ };
8
+ /**
9
+ * Narrow a workspace-wide BrowserSession/ComputerSession inventory to the
10
+ * entries a live agent attempt may reach. Every attach-by-id route already
11
+ * authorizes the exact source session through the core seam; the list is the
12
+ * discovery surface behind `interaction_discover scope=workspace`, so it must
13
+ * apply the same seam (private sessions, Slack ownership, and the 0426
14
+ * agent-access scope) to each associated session instead of exposing every
15
+ * peer's identity. Humans, API keys, and service principals keep the complete
16
+ * workspace inventory exactly as before.
17
+ */
18
+ export declare function filterInteractionSessionsForGrant<T extends AssociatedInteractionSession>(deps: Pick<ApiRouteDeps, "db" | "sessionAuthorization">, grant: AccessGrant, sessions: readonly T[]): Promise<T[]>;
19
+ export {};
@@ -1,9 +1,16 @@
1
1
  import { type DocumentServices } from "@opengeni/documents";
2
- import { type Database } from "@opengeni/db";
2
+ import { type Database, type MemoryAgentScope } from "@opengeni/db";
3
3
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
4
4
  export declare function buildDocumentsMcpServer(db: Database, accountId: string, workspaceId: string, documentServices: DocumentServices, options: {
5
5
  createdBySessionId?: string | undefined;
6
6
  attemptId?: string | undefined;
7
7
  /** Immutable human subject whose agent is making this retrieval request. */
8
8
  initiatingSubjectId: string;
9
+ /**
10
+ * The bound session's typed Memory selector (migration 0427), resolved by
11
+ * the caller from the session row. `off` registers neither memory tool;
12
+ * `user`/`session` search the workspace layer plus the own private layer.
13
+ * Omitted keeps the workspace layer.
14
+ */
15
+ memory?: MemoryAgentScope | null | undefined;
9
16
  }): McpServer;
@@ -0,0 +1,572 @@
1
+ import { type FirstPartyMcpToolName, type Permission } from "@opengeni/contracts";
2
+ export type FirstPartyToolAuthorization = {
3
+ sessionRequired?: true;
4
+ allOf?: readonly Permission[];
5
+ anyOf?: readonly Permission[];
6
+ };
7
+ /**
8
+ * Authorization is deliberately complete and separate from visibility. The
9
+ * `satisfies Record` check makes every catalog addition choose an explicit
10
+ * registration predicate before it can compile.
11
+ */
12
+ export declare const FIRST_PARTY_TOOL_AUTHORIZATION: {
13
+ set_session_title: {
14
+ sessionRequired: true;
15
+ allOf: "sessions:control"[];
16
+ };
17
+ goal_set: {
18
+ sessionRequired: true;
19
+ allOf: "goals:manage"[];
20
+ };
21
+ goal_update: {
22
+ sessionRequired: true;
23
+ allOf: "goals:manage"[];
24
+ };
25
+ goal_progress: {
26
+ sessionRequired: true;
27
+ allOf: "goals:manage"[];
28
+ };
29
+ wait_for_input: {
30
+ sessionRequired: true;
31
+ allOf: "sessions:control"[];
32
+ };
33
+ goal_complete: {
34
+ sessionRequired: true;
35
+ allOf: "goals:manage"[];
36
+ };
37
+ goal_pause: {
38
+ sessionRequired: true;
39
+ allOf: "goals:manage"[];
40
+ };
41
+ goal_resume: {
42
+ sessionRequired: true;
43
+ allOf: "goals:manage"[];
44
+ };
45
+ memory_search: {
46
+ sessionRequired: true;
47
+ allOf: "documents:search"[];
48
+ };
49
+ memory_save: {
50
+ sessionRequired: true;
51
+ allOf: "documents:search"[];
52
+ };
53
+ memory_correct: {
54
+ sessionRequired: true;
55
+ allOf: "documents:search"[];
56
+ };
57
+ preference_registry_summary: {
58
+ sessionRequired: true;
59
+ allOf: "workspace:read"[];
60
+ };
61
+ preference_registry_get: {
62
+ sessionRequired: true;
63
+ allOf: "workspace:read"[];
64
+ };
65
+ task_notes_list: {
66
+ sessionRequired: true;
67
+ allOf: "sessions:read"[];
68
+ };
69
+ task_note_save: {
70
+ sessionRequired: true;
71
+ allOf: "sessions:control"[];
72
+ };
73
+ task_note_archive: {
74
+ sessionRequired: true;
75
+ allOf: "sessions:control"[];
76
+ };
77
+ task_note_replace: {
78
+ sessionRequired: true;
79
+ allOf: "sessions:control"[];
80
+ };
81
+ work_claim_upsert: {
82
+ sessionRequired: true;
83
+ allOf: "sessions:control"[];
84
+ };
85
+ work_claim_release: {
86
+ sessionRequired: true;
87
+ allOf: "sessions:control"[];
88
+ };
89
+ knowledge_propose: {
90
+ sessionRequired: true;
91
+ allOf: "documents:search"[];
92
+ };
93
+ knowledge_correct: {
94
+ sessionRequired: true;
95
+ allOf: "documents:search"[];
96
+ };
97
+ task_note_promote_knowledge: {
98
+ sessionRequired: true;
99
+ allOf: ("documents:search" | "sessions:control")[];
100
+ };
101
+ task_note_promote_instruction_policy: {
102
+ sessionRequired: true;
103
+ allOf: ("documents:search" | "sessions:control" | "workspace:read")[];
104
+ };
105
+ task_note_promote_preference: {
106
+ sessionRequired: true;
107
+ allOf: ("documents:search" | "sessions:control" | "workspace:read")[];
108
+ };
109
+ instruction_policy_propose: {
110
+ sessionRequired: true;
111
+ allOf: ("documents:search" | "workspace:read")[];
112
+ };
113
+ preference_propose: {
114
+ sessionRequired: true;
115
+ allOf: ("documents:search" | "workspace:read")[];
116
+ };
117
+ remember: {
118
+ sessionRequired: true;
119
+ allOf: ("documents:search" | "sessions:control" | "workspace:read")[];
120
+ };
121
+ remember_confirm: {
122
+ sessionRequired: true;
123
+ allOf: ("documents:search" | "sessions:control" | "workspace:read")[];
124
+ };
125
+ company_profile_propose: {
126
+ sessionRequired: true;
127
+ allOf: ("sessions:control" | "workspace:read")[];
128
+ };
129
+ company_profile_confirm: {
130
+ sessionRequired: true;
131
+ allOf: ("sessions:control" | "workspace:read")[];
132
+ };
133
+ sandboxes_list: {
134
+ sessionRequired: true;
135
+ allOf: "sessions:read"[];
136
+ };
137
+ sandbox_attach: {
138
+ sessionRequired: true;
139
+ allOf: "sessions:control"[];
140
+ };
141
+ sandbox_swap: {
142
+ sessionRequired: true;
143
+ allOf: "sessions:control"[];
144
+ };
145
+ run_on: {
146
+ sessionRequired: true;
147
+ allOf: "sessions:control"[];
148
+ };
149
+ sandbox_provision: {
150
+ sessionRequired: true;
151
+ allOf: "sessions:control"[];
152
+ };
153
+ connected_machine_remove: {
154
+ allOf: "enrollments:manage"[];
155
+ };
156
+ rig_list: {
157
+ allOf: "rigs:use"[];
158
+ };
159
+ rig_get: {
160
+ allOf: "rigs:use"[];
161
+ };
162
+ rig_propose_change: {
163
+ allOf: "rigs:use"[];
164
+ };
165
+ rig_verify: {
166
+ allOf: "rigs:use"[];
167
+ };
168
+ rig_promote: {
169
+ allOf: "rigs:manage"[];
170
+ };
171
+ sessions_list: {
172
+ allOf: "sessions:read"[];
173
+ };
174
+ session_get: {
175
+ allOf: "sessions:read"[];
176
+ };
177
+ session_events: {
178
+ allOf: "sessions:read"[];
179
+ };
180
+ session_wait: {
181
+ sessionRequired: true;
182
+ allOf: "sessions:read"[];
183
+ };
184
+ command_wait: {
185
+ sessionRequired: true;
186
+ allOf: "sessions:read"[];
187
+ };
188
+ command_read: {
189
+ sessionRequired: true;
190
+ allOf: "sessions:read"[];
191
+ };
192
+ session_create: {
193
+ allOf: "sessions:create"[];
194
+ };
195
+ session_send_message: {
196
+ allOf: "sessions:control"[];
197
+ };
198
+ session_pause: {
199
+ allOf: "sessions:control"[];
200
+ };
201
+ session_resume: {
202
+ allOf: "sessions:control"[];
203
+ };
204
+ session_steer: {
205
+ sessionRequired: true;
206
+ allOf: "sessions:control"[];
207
+ };
208
+ session_human_input_respond: {
209
+ sessionRequired: true;
210
+ allOf: "sessions:control"[];
211
+ };
212
+ set_other_session_title: {
213
+ allOf: "sessions:control"[];
214
+ };
215
+ interaction_discover: {
216
+ sessionRequired: true;
217
+ allOf: "sessions:read"[];
218
+ };
219
+ browser_open: {
220
+ sessionRequired: true;
221
+ allOf: "sessions:control"[];
222
+ };
223
+ browser_tabs: {
224
+ sessionRequired: true;
225
+ allOf: "sessions:control"[];
226
+ };
227
+ browser_observe: {
228
+ sessionRequired: true;
229
+ allOf: "sessions:read"[];
230
+ };
231
+ browser_act: {
232
+ sessionRequired: true;
233
+ allOf: "sessions:control"[];
234
+ };
235
+ browser_clipboard: {
236
+ sessionRequired: true;
237
+ allOf: "sessions:read"[];
238
+ };
239
+ browser_debug: {
240
+ sessionRequired: true;
241
+ allOf: "sessions:read"[];
242
+ };
243
+ browser_auth: {
244
+ sessionRequired: true;
245
+ allOf: "sessions:control"[];
246
+ };
247
+ interaction_request_human: {
248
+ sessionRequired: true;
249
+ allOf: "sessions:control"[];
250
+ };
251
+ browser_identity: {
252
+ sessionRequired: true;
253
+ allOf: "sessions:control"[];
254
+ };
255
+ browser_publish: {
256
+ sessionRequired: true;
257
+ allOf: "sessions:control"[];
258
+ };
259
+ browser_lifecycle: {
260
+ sessionRequired: true;
261
+ allOf: "sessions:control"[];
262
+ };
263
+ computer_open: {
264
+ sessionRequired: true;
265
+ allOf: "sessions:control"[];
266
+ };
267
+ computer_targets: {
268
+ sessionRequired: true;
269
+ allOf: "sessions:read"[];
270
+ };
271
+ computer_observe: {
272
+ sessionRequired: true;
273
+ allOf: "sessions:read"[];
274
+ };
275
+ computer_clipboard: {
276
+ sessionRequired: true;
277
+ allOf: "sessions:read"[];
278
+ };
279
+ computer_act: {
280
+ sessionRequired: true;
281
+ allOf: "sessions:control"[];
282
+ };
283
+ computer_lifecycle: {
284
+ sessionRequired: true;
285
+ allOf: "sessions:control"[];
286
+ };
287
+ variable_set_list: {
288
+ allOf: ("secrets:list" | "variable-sets:list")[];
289
+ };
290
+ environment_list: {
291
+ allOf: ("secrets:list" | "variable-sets:list")[];
292
+ };
293
+ variable_set_get_variable: {
294
+ sessionRequired: true;
295
+ allOf: ("secrets:read" | "variable-sets:read")[];
296
+ };
297
+ variable_set_set_variable: {
298
+ allOf: ("secrets:write" | "variable-sets:write")[];
299
+ };
300
+ environment_set_variable: {
301
+ allOf: ("secrets:write" | "variable-sets:write")[];
302
+ };
303
+ capability_catalog_search: {
304
+ sessionRequired: true;
305
+ allOf: "workspace:read"[];
306
+ };
307
+ capability_authorization_request: {
308
+ sessionRequired: true;
309
+ allOf: "workspace:read"[];
310
+ };
311
+ github_connect_link: {
312
+ allOf: "github:use"[];
313
+ };
314
+ github_repositories_list: {
315
+ allOf: "github:use"[];
316
+ };
317
+ social_connections_list: {
318
+ allOf: "connections:read"[];
319
+ };
320
+ social_posts_recent: {
321
+ allOf: "connections:read"[];
322
+ };
323
+ social_daily_analysis_context: {
324
+ allOf: "connections:read"[];
325
+ };
326
+ social_search_live: {
327
+ allOf: "connections:read"[];
328
+ };
329
+ social_mentions_live: {
330
+ allOf: "connections:read"[];
331
+ };
332
+ social_thread_fetch: {
333
+ allOf: "connections:read"[];
334
+ };
335
+ social_posts_sync: {
336
+ allOf: "connections:write"[];
337
+ };
338
+ social_post_reply: {
339
+ allOf: "connections:write"[];
340
+ };
341
+ x_accounts_list: {
342
+ allOf: "connections:read"[];
343
+ };
344
+ x_search_live: {
345
+ allOf: "connections:read"[];
346
+ };
347
+ x_mentions_live: {
348
+ allOf: "connections:read"[];
349
+ };
350
+ x_thread_fetch: {
351
+ allOf: "connections:read"[];
352
+ };
353
+ x_posts_sync: {
354
+ allOf: "connections:write"[];
355
+ };
356
+ x_post_reply: {
357
+ allOf: "connections:write"[];
358
+ };
359
+ reddit_accounts_list: {
360
+ allOf: "connections:read"[];
361
+ };
362
+ reddit_search_live: {
363
+ allOf: "connections:read"[];
364
+ };
365
+ reddit_mentions_live: {
366
+ allOf: "connections:read"[];
367
+ };
368
+ reddit_thread_fetch: {
369
+ allOf: "connections:read"[];
370
+ };
371
+ reddit_posts_sync: {
372
+ allOf: "connections:write"[];
373
+ };
374
+ reddit_post_reply: {
375
+ allOf: "connections:write"[];
376
+ };
377
+ scheduled_tasks_list: {
378
+ anyOf: ("scheduled_tasks:manage" | "scheduled_tasks:run")[];
379
+ };
380
+ scheduled_tasks_get: {
381
+ anyOf: ("scheduled_tasks:manage" | "scheduled_tasks:run")[];
382
+ };
383
+ scheduled_tasks_create: {
384
+ allOf: "scheduled_tasks:manage"[];
385
+ };
386
+ scheduled_tasks_update: {
387
+ allOf: "scheduled_tasks:manage"[];
388
+ };
389
+ scheduled_tasks_pause: {
390
+ allOf: "scheduled_tasks:manage"[];
391
+ };
392
+ scheduled_tasks_resume: {
393
+ allOf: "scheduled_tasks:manage"[];
394
+ };
395
+ scheduled_tasks_trigger: {
396
+ allOf: "scheduled_tasks:run"[];
397
+ };
398
+ scheduled_tasks_delete: {
399
+ allOf: "scheduled_tasks:manage"[];
400
+ };
401
+ scheduled_task_runs_list: {
402
+ anyOf: ("scheduled_tasks:manage" | "scheduled_tasks:run")[];
403
+ };
404
+ slack_bot_list_channels: {
405
+ allOf: "connections:read"[];
406
+ };
407
+ slack_bot_search: {
408
+ allOf: "connections:read"[];
409
+ };
410
+ slack_bot_channel_history: {
411
+ allOf: "connections:read"[];
412
+ };
413
+ slack_bot_thread_replies: {
414
+ allOf: "connections:read"[];
415
+ };
416
+ slack_bot_list_users: {
417
+ allOf: "connections:read"[];
418
+ };
419
+ slack_bot_list_files: {
420
+ allOf: "connections:read"[];
421
+ };
422
+ slack_bot_file_info: {
423
+ allOf: "connections:read"[];
424
+ };
425
+ slack_bot_file_content: {
426
+ allOf: "connections:read"[];
427
+ };
428
+ slack_bot_post_message: {
429
+ allOf: "connections:read"[];
430
+ };
431
+ slack_bot_delete_message: {
432
+ allOf: "connections:read"[];
433
+ };
434
+ fiken_companies_list: {
435
+ allOf: "connections:read"[];
436
+ };
437
+ fiken_contacts_list: {
438
+ allOf: "connections:read"[];
439
+ };
440
+ fiken_products_list: {
441
+ allOf: "connections:read"[];
442
+ };
443
+ fiken_invoices_list: {
444
+ allOf: "connections:read"[];
445
+ };
446
+ fiken_invoice_get: {
447
+ allOf: "connections:read"[];
448
+ };
449
+ fiken_bank_accounts_list: {
450
+ allOf: "connections:read"[];
451
+ };
452
+ fiken_purchases_list: {
453
+ allOf: "connections:read"[];
454
+ };
455
+ fiken_sales_list: {
456
+ allOf: "connections:read"[];
457
+ };
458
+ fiken_contact_create: {
459
+ allOf: "connections:write"[];
460
+ };
461
+ fiken_invoice_draft_create: {
462
+ allOf: "connections:write"[];
463
+ };
464
+ atlassian_sources_list: {
465
+ allOf: "connections:read"[];
466
+ };
467
+ atlassian_search: {
468
+ allOf: "connections:read"[];
469
+ };
470
+ atlassian_get: {
471
+ allOf: "connections:read"[];
472
+ };
473
+ artifacts_list: {
474
+ allOf: "artifacts:read"[];
475
+ };
476
+ artifacts_get_source: {
477
+ sessionRequired: true;
478
+ allOf: "artifacts:read"[];
479
+ };
480
+ artifacts_prepare_upload: {
481
+ sessionRequired: true;
482
+ allOf: "artifacts:publish"[];
483
+ };
484
+ artifacts_create: {
485
+ sessionRequired: true;
486
+ allOf: "artifacts:publish"[];
487
+ };
488
+ artifacts_publish: {
489
+ sessionRequired: true;
490
+ allOf: "artifacts:publish"[];
491
+ };
492
+ artifacts_rollback: {
493
+ sessionRequired: true;
494
+ allOf: "artifacts:publish"[];
495
+ };
496
+ artifacts_archive: {
497
+ sessionRequired: true;
498
+ allOf: "artifacts:publish"[];
499
+ };
500
+ artifacts_restore: {
501
+ sessionRequired: true;
502
+ allOf: "artifacts:publish"[];
503
+ };
504
+ sandbox_file_publish: {
505
+ sessionRequired: true;
506
+ allOf: ("files:read" | "files:upload")[];
507
+ };
508
+ editable_artifact_list: {
509
+ sessionRequired: true;
510
+ allOf: "artifacts:read"[];
511
+ };
512
+ editable_artifact_create: {
513
+ sessionRequired: true;
514
+ allOf: "artifacts:publish"[];
515
+ };
516
+ editable_artifact_import: {
517
+ sessionRequired: true;
518
+ allOf: ("artifacts:publish" | "files:read")[];
519
+ };
520
+ editable_artifact_get: {
521
+ sessionRequired: true;
522
+ allOf: "artifacts:read"[];
523
+ };
524
+ editable_artifact_inspect: {
525
+ sessionRequired: true;
526
+ allOf: "artifacts:read"[];
527
+ };
528
+ editable_artifact_apply: {
529
+ sessionRequired: true;
530
+ allOf: "artifacts:publish"[];
531
+ };
532
+ editable_artifact_export: {
533
+ sessionRequired: true;
534
+ allOf: "artifacts:read"[];
535
+ };
536
+ editable_artifact_export_status: {
537
+ sessionRequired: true;
538
+ allOf: ("artifacts:read" | "files:upload")[];
539
+ };
540
+ project_list: {
541
+ allOf: "sessions:read"[];
542
+ };
543
+ project_get: {
544
+ allOf: "sessions:read"[];
545
+ };
546
+ project_create: {
547
+ allOf: "sessions:create"[];
548
+ };
549
+ project_update: {
550
+ allOf: "sessions:create"[];
551
+ };
552
+ project_reorder: {
553
+ allOf: "sessions:create"[];
554
+ };
555
+ project_delete: {
556
+ allOf: "sessions:create"[];
557
+ };
558
+ session_set_project: {
559
+ allOf: "sessions:control"[];
560
+ };
561
+ };
562
+ /**
563
+ * The permissions a session's first-party tool selection can possibly
564
+ * exercise, derived from the same per-tool registration data that gates the
565
+ * MCP surface. A caller that only proxies REST handlers on behalf of a
566
+ * selection (the Codemode SDK proxy) must never hold more than this: a
567
+ * selection without any session_* orchestration tool cannot need
568
+ * sessions:create or sessions:control, so a delegated token for it must not
569
+ * carry them either. `anyOf` alternatives are all counted because any one of
570
+ * them could be the permission the selection actually holds.
571
+ */
572
+ export declare function permissionsRequiredByFirstPartyTools(tools: readonly FirstPartyMcpToolName[]): Permission[];