@opengeni/api-router 2.4.2-canary.0 → 2.6.3-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 (63) hide show
  1. package/dist/app.js +1 -1
  2. package/dist/auth/managed-auth-attempt-context.d.ts +5 -1
  3. package/dist/auth/managed-auth.d.ts +24 -1
  4. package/dist/{chunk-L7GVVSSQ.js → chunk-XTLI3CBH.js} +2884 -483
  5. package/dist/chunk-XTLI3CBH.js.map +1 -0
  6. package/dist/http/sse.d.ts +9 -0
  7. package/dist/index.js +104 -4
  8. package/dist/index.js.map +1 -1
  9. package/dist/integrations/slack-interactions.d.ts +1 -1
  10. package/dist/interaction-metrics.d.ts +2 -0
  11. package/dist/mcp/company-brain-governed-writes.d.ts +1 -1
  12. package/dist/mcp/company-profile-agent-admin.d.ts +6 -6
  13. package/dist/mcp/remember.d.ts +2 -2
  14. package/dist/mcp/server.d.ts +34 -0
  15. package/dist/mcp/session-view.d.ts +1 -0
  16. package/dist/mcp/session-wait.d.ts +19 -0
  17. package/dist/routes/api-keys.d.ts +2 -0
  18. package/dist/routes/browser-sessions.d.ts +1 -0
  19. package/dist/routes/computer-sessions.d.ts +12 -0
  20. package/dist/routes/managed-auth-session-sets.d.ts +7 -0
  21. package/dist/routes/sessions.d.ts +17 -5
  22. package/dist/routes/workspaces.d.ts +1 -1
  23. package/dist/sandbox/metrics-ingestion.d.ts +16 -0
  24. package/dist/work-discovery-observability.d.ts +33 -0
  25. package/dist/workspace-delete-observability.d.ts +10 -0
  26. package/package.json +19 -19
  27. package/src/app.ts +172 -20
  28. package/src/auth/managed-auth-attempt-context.ts +40 -3
  29. package/src/auth/managed-auth-session-adapter.ts +1 -0
  30. package/src/auth/managed-auth.ts +164 -4
  31. package/src/http/sse.ts +279 -45
  32. package/src/integrations/oauth-client.ts +8 -1
  33. package/src/integrations/provider-oauth.ts +12 -2
  34. package/src/interaction-metrics.ts +30 -0
  35. package/src/mcp/company-brain-governed-writes.ts +38 -23
  36. package/src/mcp/company-profile-agent-admin.ts +7 -7
  37. package/src/mcp/remember.ts +19 -8
  38. package/src/mcp/server.ts +621 -54
  39. package/src/mcp/session-wait.ts +56 -8
  40. package/src/routes/api-integrations.ts +2 -2
  41. package/src/routes/api-keys.ts +149 -7
  42. package/src/routes/browser-sessions.ts +10 -2
  43. package/src/routes/capabilities.ts +3 -3
  44. package/src/routes/codex.ts +483 -74
  45. package/src/routes/company-profile.ts +64 -0
  46. package/src/routes/computer-sessions.ts +103 -1
  47. package/src/routes/integration-facets.ts +8 -5
  48. package/src/routes/interaction-resources.ts +7 -1
  49. package/src/routes/managed-auth-session-sets.ts +199 -2
  50. package/src/routes/organization-memberships.ts +28 -8
  51. package/src/routes/packs.ts +5 -5
  52. package/src/routes/plugins.ts +2 -2
  53. package/src/routes/scheduled-tasks.ts +9 -0
  54. package/src/routes/sessions.ts +380 -87
  55. package/src/routes/skills.ts +3 -3
  56. package/src/routes/workspaces.ts +293 -54
  57. package/src/sandbox/channel-a.ts +10 -4
  58. package/src/sandbox/machines.ts +13 -6
  59. package/src/sandbox/metrics-ingestion.ts +157 -3
  60. package/src/sandbox/viewer.ts +20 -1
  61. package/src/work-discovery-observability.ts +121 -0
  62. package/src/workspace-delete-observability.ts +75 -0
  63. package/dist/chunk-L7GVVSSQ.js.map +0 -1
@@ -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_create" | "artifacts_get_source" | "artifacts_list" | "artifacts_publish" | "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" | "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_set" | "goal_update" | "goal_wait" | "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" | "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_create" | "artifacts_get_source" | "artifacts_list" | "artifacts_publish" | "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" | "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_set" | "goal_update" | "goal_wait" | "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" | "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;
@@ -1,9 +1,11 @@
1
1
  import type { AuthRunMutationResponse, BrowserActionReceipt, BrowserActionRequest, PublishBrowserRevisionResponse, BrowserSessionMutationResponse, ComputerActionReceipt, ComputerActionRequest, ComputerSessionMutationResponse, InteractionInterventionMutationResponse, ProtectedAuthFillResponse } from "@opengeni/contracts";
2
2
  import { type Observability } from "@opengeni/observability";
3
+ import type { ComputerFrameEvidenceMismatchReason } from "@opengeni/runtime/sandbox";
3
4
  type InteractionLifecycleMutation = BrowserSessionMutationResponse | ComputerSessionMutationResponse;
4
5
  type AuthMutation = AuthRunMutationResponse | ProtectedAuthFillResponse;
5
6
  export declare function observeBrowserActionResult(observability: Observability | null | undefined, startedAtMs: number, request: BrowserActionRequest, receipt: BrowserActionReceipt): void;
6
7
  export declare function observeComputerActionResult(observability: Observability | null | undefined, startedAtMs: number, request: ComputerActionRequest, receipt: ComputerActionReceipt): void;
8
+ export declare function observeComputerFrameEvidenceMismatch(observability: Observability | null | undefined, reason: ComputerFrameEvidenceMismatchReason): void;
7
9
  export declare function observeLifecycleResult(observability: Observability | null | undefined, startedAtMs: number, response: InteractionLifecycleMutation): void;
8
10
  export declare function observeBrowserRevisionPublication(observability: Observability | null | undefined, startedAtMs: number, response: PublishBrowserRevisionResponse): void;
9
11
  export declare function observeAuthMutation(observability: Observability | null | undefined, startedAtMs: number, response: AuthMutation): void;
@@ -1,6 +1,6 @@
1
1
  import { type CompanyBrainGovernedWriteAttempt } from "@opengeni/contracts";
2
2
  import { createCompanyBrainLearningPolicyRouter } from "@opengeni/core";
3
- import type { Database } from "@opengeni/db";
3
+ import { type Database } from "@opengeni/db";
4
4
  import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
5
5
  type JsonResult = (value: unknown) => {
6
6
  content: {
@@ -33,12 +33,12 @@ export declare function deriveCompanyProfileStableKey(content: string): string;
33
33
  */
34
34
  export declare function resolveCompanyProfileEntries(input: readonly EntryInput[]): CompanyProfileEntry[];
35
35
  /**
36
- * Register the explicit owner-confirmed organization profile path. This is
37
- * administration, not derived learning: workspace learning mode is never
38
- * consulted, the initiating human must be the organization's active owner (the
39
- * same authority as the manual `account:admin` route), and the proposal cannot
40
- * become active without the exact bound human-input response returned by the
41
- * first call.
36
+ * Register the organization profile administration path. This is not derived
37
+ * workspace learning: the initiating human must be the organization's active
38
+ * owner (the same authority as the manual `account:admin` route). The separate
39
+ * organization policy either blocks the proposal, keeps the exact bound
40
+ * human-confirmation path, or permits immediate activation through the native
41
+ * company-profile lifecycle.
42
42
  */
43
43
  export declare function registerCompanyProfileAgentAdminTools(input: RegisterCompanyProfileAgentAdminToolsInput): void;
44
44
  export {};
@@ -1,6 +1,6 @@
1
1
  import { type CompanyBrainGovernedWriteAttempt } from "@opengeni/contracts";
2
2
  import { createRememberRouter } from "@opengeni/core";
3
- import type { Database } from "@opengeni/db";
3
+ import { type Database } from "@opengeni/db";
4
4
  import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
5
5
  type JsonResult = (value: unknown) => {
6
6
  content: {
@@ -19,7 +19,7 @@ export type RegisterRememberToolsInput = {
19
19
  /**
20
20
  * Explicit user-directed remember. Content becomes exact task-note evidence,
21
21
  * promotion runs through the frozen workspace learning policy, and activation
22
- * is either automatic (preference under Automatic mode) or requires exactly one
22
+ * is either automatic (Skill or instruction under Automatic mode) or requires exactly one
23
23
  * bound human confirmation through the built-in `request_human_input` tool.
24
24
  * Tool input cannot select scope beyond the workspace, active authority, or
25
25
  * another learning-policy source.
@@ -90,10 +90,44 @@ export declare function capSessionDiscoveryPage(page: Awaited<ReturnType<typeof
90
90
  pausedDescendants: number;
91
91
  failedDescendants: number;
92
92
  unreadDescendants?: number | undefined;
93
+ unreadFailedDescendants?: number | undefined;
93
94
  activelyWorkingDescendants?: number | undefined;
94
95
  attentionSince?: string | null | undefined;
95
96
  truncated: boolean;
96
97
  };
98
+ relatedWork: {
99
+ claims: {
100
+ id: string;
101
+ sessionId: string;
102
+ subject: {
103
+ namespace: string;
104
+ type: "artifact" | "branch" | "ci_run" | "issue" | "other" | "pull_request" | "release" | "repository";
105
+ canonicalKey: string;
106
+ displayLabel: string | null;
107
+ };
108
+ role: "delivering" | "monitoring" | "reviewing" | "working";
109
+ state: "active" | "released" | "stale" | "superseded";
110
+ revision: number;
111
+ provenance: "explicit_agent" | "session_resource" | "system_lifecycle" | "trusted_integration" | "user_api";
112
+ version: {
113
+ kind: "artifact_version" | "branch_head" | "ci_run" | "git_commit" | "other" | "pull_request_head" | "release_version";
114
+ value: string;
115
+ } | null;
116
+ observedAt: string;
117
+ updatedAt: string;
118
+ settledAt: string | null;
119
+ }[];
120
+ claimsTruncated: boolean;
121
+ match: {
122
+ class: "exact_subject" | "fuzzy" | "goal" | "title";
123
+ field: "claim_key" | "claim_label" | "goal" | "subject" | "title";
124
+ scoreBand: "exact" | "related" | "strong";
125
+ claimId: string | null;
126
+ } | null;
127
+ possibleOverlap: boolean;
128
+ advisoryOnly: true;
129
+ noAdditionalAccess: true;
130
+ };
97
131
  latestMessage?: {
98
132
  type: "agent.message.completed" | "agent.message.delta" | "agent.model.request" | "agent.model.usage" | "agent.reasoning.delta" | "agent.toolCall.created" | "agent.toolCall.output" | "agent.updated" | "artifact.created" | "codex.account.switched" | "codex.capacity.resumed" | "codex.capacity.superseded" | "codex.capacity.waiting" | "codex.credential.selected" | "codex.fleet.decision" | "credential.auth_needed" | "fs.changed" | "git.changed" | "goal.cleared" | "goal.completed" | "goal.continuation" | "goal.held" | "goal.paused" | "goal.progress" | "goal.resumed" | "goal.rewrite.proposed" | "goal.rewrite.rejected" | "goal.set" | "goal.updated" | "machine.link.lost" | "machine.link.restored" | "machine.op.failed" | "machine.op.recovered" | "machine.runner.restarted" | "memory.corrected" | "memory.saved" | "recording.available" | "recording.failed" | "recording.started" | "rig.setup.completed" | "rig.setup.failed" | "rig.setup.skipped" | "rig.setup.started" | "sandbox.box.created" | "sandbox.box.lost" | "sandbox.box.snapshot" | "sandbox.box.terminated" | "sandbox.command.output.delta" | "sandbox.env.drift" | "sandbox.operation.completed" | "sandbox.operation.failed" | "sandbox.operation.started" | "session.command.backgrounded" | "session.command.finished" | "session.context.cleared" | "session.context.compacted" | "session.context.compaction.requested" | "session.context.compaction.skipped" | "session.context.compaction.started" | "session.control.paused" | "session.control.resumed" | "session.control.steer_requested" | "session.created" | "session.event.envelope_omitted" | "session.humanInput.requested" | "session.mcp.approval_policy.updated" | "session.personal_resources.attached" | "session.queue.changed" | "session.queue.history" | "session.queue.prompt.cancelled" | "session.realtime.ended" | "session.realtime.started" | "session.requiresAction" | "session.route.reconciled" | "session.runtime.configured" | "session.status.changed" | "session.title_set" | "session.tool_policy.updated" | "session.variable_sets.updated" | "session.visibility.changed" | "stream.closed" | "stream.opened" | "stream.revoked" | "stream.url.rotated" | "system.update.cancelled" | "system.update.delivered" | "system.update.pending" | "system.update.settled" | "system.update.superseded" | "terminal.pty.exited" | "terminal.pty.output.delta" | "terminal.pty.started" | "tool.auth_needed" | "turn.cancelled" | "turn.capacity_waiting" | "turn.completed" | "turn.event.rejected_late" | "turn.failed" | "turn.queued" | "turn.recovery.requested" | "turn.started" | "turn.startup.phase.completed" | "turn.startup.phase.failed" | "turn.startup.phase.started" | "turn.superseded" | "user.approvalDecision" | "user.humanInputResponse" | "user.message" | "user.pause" | "workspace.inference.paused" | "workspace.inference.resumed" | "workspace.revision.captured" | "workspace.revision.degraded";
99
133
  preview: string | null;
@@ -121,6 +121,7 @@ export declare function boundSessionDetailMcp(session: Session, effectiveControl
121
121
  pausedDescendants: number;
122
122
  failedDescendants: number;
123
123
  unreadDescendants?: number | undefined;
124
+ unreadFailedDescendants?: number | undefined;
124
125
  activelyWorkingDescendants?: number | undefined;
125
126
  attentionSince?: string | null | undefined;
126
127
  truncated: boolean;
@@ -40,6 +40,21 @@ export declare const SESSION_WAIT_EVENTS_PER_TARGET = 20;
40
40
  * noise never wake a waiter; `session_events` remains the drill-down for them.
41
41
  */
42
42
  export declare const SESSION_WAIT_EVENT_TYPES: readonly ["turn.started", "turn.completed", "turn.failed", "turn.cancelled", "turn.superseded", "turn.capacity_waiting", "agent.message.completed", "session.status.changed", "session.requiresAction", "session.humanInput.requested", "session.control.paused", "session.control.resumed", "tool.auth_needed", "credential.auth_needed", "rig.setup.failed", "goal.set", "goal.updated", "goal.progress", "goal.rewrite.proposed", "goal.rewrite.rejected", "goal.completed", "goal.paused", "goal.resumed", "goal.cleared", "goal.continuation"];
43
+ /**
44
+ * Settlement and blocking events that make a child result usable.
45
+ * Goal facts are deliberately absent: an agent can complete its durable goal
46
+ * before it emits the final assistant message and settles the turn. Completed
47
+ * agent messages are also absent because commentary messages use the same
48
+ * event type; an ordinary result-bearing `turn.completed` carries the
49
+ * authoritative final output.
50
+ */
51
+ export declare const SESSION_WAIT_COMPLETION_EVENT_TYPES: readonly ["turn.completed", "turn.failed", "turn.cancelled", "turn.superseded", "turn.capacity_waiting", "session.requiresAction", "session.humanInput.requested", "session.control.paused", "tool.auth_needed", "credential.auth_needed", "rig.setup.failed", "goal.paused"];
52
+ /**
53
+ * A completed turn is result-bearing only when it carries the ordinary final
54
+ * output. Segment-limit and maintenance turns settle one execution segment
55
+ * while the session still has work to do, so they must not release a parent.
56
+ */
57
+ export declare function sessionWaitCompletionEventMatches(event: SessionEvent): boolean;
43
58
  /** The self-session event that announces a newly pending machine input. */
44
59
  export declare const SESSION_WAIT_OWN_PENDING_EVENT_TYPE = "system.update.pending";
45
60
  /**
@@ -120,6 +135,10 @@ export type SessionWaitInput = {
120
135
  targets: readonly SessionWaitTarget[];
121
136
  ownSessionId: string | null;
122
137
  maxWaitMs: number;
138
+ /** Target events that end the wait. Defaults to the ordinary activity set. */
139
+ targetEventTypes?: readonly SessionEventType[] | undefined;
140
+ /** Optional payload-aware refinement applied after the event-type filter. */
141
+ targetEventMatches?: ((event: SessionEvent) => boolean) | undefined;
123
142
  source: SessionWaitSource;
124
143
  signal?: AbortSignal | undefined;
125
144
  now?: (() => number) | undefined;
@@ -1,3 +1,5 @@
1
+ import { Permission } from "@opengeni/contracts";
1
2
  import type { Hono } from "hono";
2
3
  import type { ApiRouteDeps } from "@opengeni/core";
4
+ export declare const organizationApiKeyPermissions: Permission[];
3
5
  export declare function registerApiKeyRoutes(app: Hono, deps: ApiRouteDeps): void;
@@ -5,6 +5,7 @@ export declare function registerBrowserSessionRoutes(app: Hono, deps: ApiRouteDe
5
5
  export declare function browserNeedsStandaloneDisplayStack(input: {
6
6
  headless: boolean;
7
7
  linkedComputer: boolean;
8
+ nativeBrowserControl: boolean;
8
9
  }): boolean;
9
10
  export declare function interactionActorForGrant(grant: AccessGrant): ReturnType<typeof InteractionActor.parse>;
10
11
  /** Resolve Drive authority from the same immutable session authorization that
@@ -1,6 +1,18 @@
1
1
  import { type ApiRouteDeps } from "@opengeni/core";
2
+ import { type ComputerControlFrame, type ExpectedComputerFrameEvidence } from "@opengeni/runtime/sandbox";
2
3
  import type { Hono } from "hono";
4
+ type ComputerFrameCaptureClient = {
5
+ capture(targetId: string, options: {
6
+ format?: "jpeg" | "png";
7
+ quality?: number;
8
+ maxWidth?: number;
9
+ maxHeight?: number;
10
+ }): Promise<ComputerControlFrame>;
11
+ };
12
+ export declare function validateComputerFrameForApi(frame: Pick<ComputerControlFrame, "data" | "mediaType" | "metadataHeader">, expected: ExpectedComputerFrameEvidence): ComputerControlFrame;
13
+ export declare function captureModelComputerFrame(sessionClient: ComputerFrameCaptureClient, expected: ExpectedComputerFrameEvidence): Promise<ComputerControlFrame>;
3
14
  /** Public ComputerSession resource surface. Physical app/window authority stays
4
15
  * in the same placement controller used by BrowserSession; this route owns only
5
16
  * durable authorization, placement fencing, lifecycle receipts, and routing. */
6
17
  export declare function registerComputerSessionRoutes(app: Hono, deps: ApiRouteDeps): void;
18
+ export {};
@@ -1,6 +1,12 @@
1
1
  import { type ApiRouteDeps } from "@opengeni/core";
2
2
  import type { Hono } from "hono";
3
3
  export declare function registerManagedAuthSessionSetRoutes(app: Hono, deps: ApiRouteDeps): void;
4
+ export declare function validatedManagedAuthSocialAuthorizationUrl(input: {
5
+ provider: "google" | "github";
6
+ rawUrl: unknown;
7
+ expectedClientId: string;
8
+ expectedCallbackUrl: string;
9
+ }): string;
4
10
  /**
5
11
  * Better Auth 1.6.26 provider lifecycle routes retained while session-set mode
6
12
  * owns all selected-session reads, enumeration, revocation, and user mutation.
@@ -11,6 +17,7 @@ export declare function requireManagedAuthProviderRouteAllowed(method: string, p
11
17
  /** Remove provider bearer/session material and enforce browser-auth cache/cookie policy. */
12
18
  export declare function scrubManagedAuthProviderResponse(response: Response, options?: {
13
19
  replacementCookies?: readonly string[] | undefined;
20
+ preserveCookieNames?: readonly string[] | undefined;
14
21
  }): Promise<Response>;
15
22
  export declare function parseSupportedDeepLink(path: string): {
16
23
  workspaceId: string | null;
@@ -1,4 +1,4 @@
1
- import { ClientSessionEvent, SteerSessionMessageRequest, type SessionGoalRevision, type SessionAuthorizationOperation } from "@opengeni/contracts";
1
+ import { ClientSessionEvent, SteerSessionMessageRequest, type SessionStatus, type WorkClaimSubjectFilter, type SessionGoalRevision, type SessionAuthorizationOperation } from "@opengeni/contracts";
2
2
  import { type SessionDiscoveryCursor } from "@opengeni/db";
3
3
  import type { Context, Hono } from "hono";
4
4
  import type { ApiRouteDeps } from "@opengeni/core";
@@ -15,14 +15,26 @@ export declare function sessionAuthorizationOperationForHttp(method: string, pat
15
15
  export declare function sessionTenancyHttpError(error: unknown): Error;
16
16
  export type AgentTopologyCursorEnvelope = {
17
17
  cursor: SessionDiscoveryCursor;
18
- parentSessionId: string | null;
19
- search: string | null;
18
+ parentSessionId: string | null | "all";
19
+ rootSessionId: string | null;
20
+ query: string | null;
21
+ statuses: SessionStatus[];
22
+ activeOnly: boolean;
23
+ recentHours: number | null;
24
+ subject: WorkClaimSubjectFilter | null;
25
+ claimLimit: number | null;
20
26
  };
21
27
  export declare function encodeAgentTopologyCursor(value: AgentTopologyCursorEnvelope): string;
22
28
  export declare function agentTopologyQuery(query: Record<string, string>): {
23
29
  limit: number;
24
- parentSessionId: string | null;
25
- search: string | undefined;
30
+ parentSessionId: string | null | undefined;
31
+ rootSessionId: string | undefined;
32
+ query: string | undefined;
33
+ statuses: SessionStatus[] | undefined;
34
+ activeOnly: boolean;
35
+ recentHours: number | undefined;
36
+ subject: WorkClaimSubjectFilter | undefined;
37
+ claimLimit: number | undefined;
26
38
  cursor: SessionDiscoveryCursor | undefined;
27
39
  };
28
40
  /** Stable, value-free JSON errors for only the create-session boundary. */
@@ -16,7 +16,7 @@ export declare function workspaceMembersResponse(members: readonly WorkspaceMemb
16
16
  subjectId: string;
17
17
  subjectLabel: string | null;
18
18
  role: string;
19
- permissions: ("account:admin" | "account:read" | "api_keys:manage" | "artifacts:publish" | "artifacts:read" | "billing:manage" | "billing:read" | "codemode:call" | "connections:read" | "connections:write" | "documents:manage" | "documents:search" | "enrollments:manage" | "enrollments:read" | "environments:manage" | "environments:use" | "files:read" | "files:upload" | "files:write" | "github:manage" | "github:use" | "goals:manage" | "mcp_servers:attach" | "members:manage" | "rigs:manage" | "rigs:use" | "scheduled_tasks:manage" | "scheduled_tasks:run" | "secrets:list" | "secrets:read" | "secrets:write" | "sessions:control" | "sessions:create" | "sessions:read" | "stream:acknowledge" | "stream:control" | "stream:view" | "terminal:attach" | "variable-sets:attach" | "variable-sets:list" | "variable-sets:manage" | "variable-sets:read" | "variable-sets:use" | "variable-sets:write" | "workspace:admin" | "workspace:create" | "workspace:read")[];
19
+ permissions: ("account:admin" | "account:read" | "api_keys:manage" | "artifacts:publish" | "artifacts:read" | "billing:manage" | "billing:read" | "capabilities:manage" | "codemode:call" | "connections:read" | "connections:write" | "documents:manage" | "documents:search" | "enrollments:manage" | "enrollments:read" | "environments:manage" | "environments:use" | "files:read" | "files:upload" | "files:write" | "github:manage" | "github:use" | "goals:manage" | "mcp_servers:attach" | "members:manage" | "rigs:manage" | "rigs:use" | "scheduled_tasks:manage" | "scheduled_tasks:run" | "secrets:list" | "secrets:read" | "secrets:write" | "sessions:control" | "sessions:create" | "sessions:read" | "stream:acknowledge" | "stream:control" | "stream:view" | "terminal:attach" | "variable-sets:attach" | "variable-sets:list" | "variable-sets:manage" | "variable-sets:read" | "variable-sets:use" | "variable-sets:write" | "workspace:admin" | "workspace:create" | "workspace:read")[];
20
20
  createdAt: string;
21
21
  }[];
22
22
  };
@@ -7,6 +7,22 @@ import { Hello, type AttachedBrowserInventorySnapshot as WireAttachedBrowserInve
7
7
  export declare const AGENT_EVENTS_SUBJECT = "agent.*.*.connection.*.events";
8
8
  /** The wildcard subject the agent publishes its connect Hello on. */
9
9
  export declare const AGENT_HELLO_SUBJECT = "agent.*.*.connection.*.hello";
10
+ export type AgentEventIngestionScheduler = {
11
+ enqueue: (payload: Uint8Array, subject: string) => void;
12
+ whenIdle: () => Promise<void>;
13
+ close: () => void;
14
+ };
15
+ /**
16
+ * Drain agent events without making every Connected Machine wait behind one
17
+ * deployment-wide serial DB queue. Each exact process subject retains FIFO order;
18
+ * separate subjects drain concurrently. Consecutive pending heartbeats for one
19
+ * subject are latest-wins because they are point-in-time liveness/metrics samples,
20
+ * while GoingOffline and update-progress events remain ordered barriers.
21
+ */
22
+ export declare function createAgentEventIngestionScheduler(handler: (payload: Uint8Array, subject: string) => void | Promise<void>, options?: {
23
+ maxConcurrentSubjects?: number;
24
+ onHeartbeatCoalesced?: () => void;
25
+ }): AgentEventIngestionScheduler;
10
26
  /** Parse the exact process events subject (heartbeat plane). */
11
27
  export declare function parseAgentEventSubject(subject: string): {
12
28
  workspaceId: string;
@@ -0,0 +1,33 @@
1
+ import type { WorkDiscoveryMatchClass } from "@opengeni/contracts";
2
+ import type { Observability } from "@opengeni/observability";
3
+ export type WorkDiscoverySurface = "first_party_mcp" | "agent_topology";
4
+ export type WorkDiscoveryMode = "browse" | "query" | "subject";
5
+ export type WorkDiscoveryOutcome = "ok" | "empty" | "disabled" | "error";
6
+ export type WorkDiscoveryAuthorizationScope = "workspace" | "scoped";
7
+ export type WorkDiscoveryObservation = {
8
+ surface: WorkDiscoverySurface;
9
+ mode: WorkDiscoveryMode;
10
+ outcome: WorkDiscoveryOutcome;
11
+ authorizationScope: WorkDiscoveryAuthorizationScope;
12
+ durationMs: number;
13
+ responseBytes: number;
14
+ resultCount: number;
15
+ overlapCount: number;
16
+ matchCounts: Partial<Record<WorkDiscoveryMatchClass, number>>;
17
+ };
18
+ type WorkDiscoveryObservedRow = {
19
+ relatedWork: {
20
+ match: {
21
+ class: WorkDiscoveryMatchClass;
22
+ } | null;
23
+ possibleOverlap: boolean;
24
+ };
25
+ };
26
+ export declare function summarizeWorkDiscoveryRows(rows: readonly WorkDiscoveryObservedRow[]): Pick<WorkDiscoveryObservation, "resultCount" | "overlapCount" | "matchCounts">;
27
+ /**
28
+ * Low-cardinality work-discovery telemetry. Identifiers, search text, subject
29
+ * keys, titles, goals, claim labels, versions, and provenance are excluded by
30
+ * construction. An observability failure never changes product behavior.
31
+ */
32
+ export declare function observeWorkDiscovery(observability: Observability | null | undefined, observation: WorkDiscoveryObservation): void;
33
+ export {};
@@ -0,0 +1,10 @@
1
+ import type { WorkspaceDeleteObserver } from "@opengeni/db";
2
+ import type { Observability } from "@opengeni/observability";
3
+ /**
4
+ * Retain exact workspace deletion timing and inventory without putting tenant
5
+ * identifiers in metric labels. Observer failures never change deletion truth.
6
+ */
7
+ export declare function workspaceDeleteObserver(observability: Observability | null | undefined, identity: {
8
+ accountId: string;
9
+ workspaceId: string;
10
+ }): WorkspaceDeleteObserver | undefined;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@opengeni/api-router",
3
- "version": "2.4.2-canary.0",
3
+ "version": "2.6.3-canary.0",
4
4
  "description": "OpenGeni HTTP surface: the Hono adapter/router (createApp), routes, MCP HTTP transport, and HTTP access adapters over @opengeni/core. An engine-distribution surface — its runtime closure includes engine-internal packages.",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {
@@ -41,25 +41,25 @@
41
41
  "@aws-sdk/client-s3": "^3.1044.0",
42
42
  "@aws-sdk/s3-request-presigner": "^3.1044.0",
43
43
  "@hono/zod-validator": "^0.7.6",
44
- "@llamaindex/liteparse": "^1.5.3",
44
+ "@llamaindex/liteparse": "2.14.2",
45
45
  "@modelcontextprotocol/sdk": "^1.29.0",
46
- "@opengeni/agent-proto": "^0.5.1-canary.5",
47
- "@opengeni/artifact-tool": "^0.3.8-canary.0",
48
- "@opengeni/capabilities": "^0.3.1-canary.4",
49
- "@opengeni/codemode": "^0.4.16-canary.0",
50
- "@opengeni/codex": "^0.2.19-canary.4",
51
- "@opengeni/config": "^0.21.0-canary.0",
52
- "@opengeni/contracts": "^2.6.0-canary.0",
53
- "@opengeni/core": "^2.5.2-canary.0",
54
- "@opengeni/db": "^3.5.2-canary.0",
55
- "@opengeni/documents": "^0.8.5-canary.0",
56
- "@opengeni/events": "^0.4.3-canary.0",
57
- "@opengeni/github": "^0.6.0-canary.0",
58
- "@opengeni/network": "^0.2.3-canary.4",
59
- "@opengeni/observability": "^0.8.8-canary.0",
60
- "@opengeni/runtime": "^1.4.1-canary.0",
61
- "@opengeni/storage": "^0.2.109-canary.0",
62
- "@opengeni/xai-subscription": "^0.1.2-canary.4",
46
+ "@opengeni/agent-proto": "^0.5.1-canary.6",
47
+ "@opengeni/artifact-tool": "^0.3.14-canary.0",
48
+ "@opengeni/capabilities": "^0.3.1-canary.5",
49
+ "@opengeni/codemode": "^0.4.22-canary.0",
50
+ "@opengeni/codex": "^0.2.20-canary.0",
51
+ "@opengeni/config": "^0.22.5-canary.0",
52
+ "@opengeni/contracts": "^2.9.2-canary.0",
53
+ "@opengeni/core": "^2.6.3-canary.0",
54
+ "@opengeni/db": "^3.7.3-canary.0",
55
+ "@opengeni/documents": "^0.8.13-canary.0",
56
+ "@opengeni/events": "^0.4.11-canary.0",
57
+ "@opengeni/github": "^0.6.7-canary.0",
58
+ "@opengeni/network": "^0.2.3-canary.5",
59
+ "@opengeni/observability": "^0.8.14-canary.0",
60
+ "@opengeni/runtime": "^2.0.1-canary.0",
61
+ "@opengeni/storage": "^0.2.115-canary.0",
62
+ "@opengeni/xai-subscription": "^0.1.2-canary.5",
63
63
  "@temporalio/client": "^1.17.0",
64
64
  "better-auth": "^1.6.14",
65
65
  "hono": "^4.12.18",