@opengeni/api-router 2.11.0-canary.0 → 2.11.2-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 (38) hide show
  1. package/dist/app.js +1 -1
  2. package/dist/{chunk-EAYCECQK.js → chunk-5X3XM6CE.js} +1841 -1528
  3. package/dist/chunk-5X3XM6CE.js.map +1 -0
  4. package/dist/http/sse.d.ts +4 -3
  5. package/dist/index.js +5 -3
  6. package/dist/index.js.map +1 -1
  7. package/dist/integrations/github-skill-source.d.ts +1 -5
  8. package/dist/mcp/remember.d.ts +1 -1
  9. package/dist/mcp/scheduled-task-view.d.ts +3 -3
  10. package/dist/mcp/server.d.ts +4 -4
  11. package/dist/routes/skill-content.d.ts +4 -0
  12. package/dist/routes/skill-install-authority.d.ts +6 -0
  13. package/dist/transcription/providers/xai-subscription.d.ts +1 -0
  14. package/dist/transcription/service.d.ts +2 -1
  15. package/package.json +19 -19
  16. package/src/app.ts +18 -0
  17. package/src/http/sse.ts +9 -25
  18. package/src/index.ts +3 -1
  19. package/src/integrations/github-skill-source.ts +2 -142
  20. package/src/mcp/company-brain-governed-writes.ts +15 -21
  21. package/src/mcp/remember.ts +14 -15
  22. package/src/mcp/server.ts +7 -4
  23. package/src/routes/automations.ts +35 -0
  24. package/src/routes/packs.ts +61 -8
  25. package/src/routes/plugins.ts +48 -5
  26. package/src/routes/preference-registry.ts +12 -93
  27. package/src/routes/sessions.ts +52 -20
  28. package/src/routes/skill-content.ts +226 -0
  29. package/src/routes/skill-install-authority.ts +64 -0
  30. package/src/routes/skills.ts +38 -3
  31. package/src/routes/transcription-recordings.ts +30 -1
  32. package/src/routes/transcriptions.ts +4 -0
  33. package/src/transcription/providers/codex-subscription.ts +2 -0
  34. package/src/transcription/providers/openai.ts +1 -0
  35. package/src/transcription/providers/xai-subscription.ts +49 -3
  36. package/src/transcription/service.ts +43 -6
  37. package/src/xai-subscription-auth.ts +9 -2
  38. package/dist/chunk-EAYCECQK.js.map +0 -1
@@ -1,5 +1 @@
1
- import type { Settings } from "@opengeni/config";
2
- import type { GitHubSkillSourceClient } from "@opengeni/core";
3
- type GitHubJsonRequest = (path: string, maxBytes: number, label: string) => Promise<unknown>;
4
- export declare function createGitHubSkillSourceClient(settings: Settings, requestJson?: GitHubJsonRequest): GitHubSkillSourceClient;
5
- export {};
1
+ export { createGitHubSkillSourceClient } from "@opengeni/core";
@@ -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 (Skill or instruction under Automatic mode) or requires exactly one
22
+ * is either automatic (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.
@@ -82,8 +82,8 @@ export declare function scheduledTaskMcpSummary(task: ScheduledTask): {
82
82
  runMode: "existing_session" | "new_session_per_run" | "reusable_session";
83
83
  overlapPolicy: "allow_concurrent" | "buffer_one" | "skip";
84
84
  action: {
85
+ readonly sourceId?: never;
85
86
  kind: "agent_turn";
86
- sourceId?: never;
87
87
  sourceGeneration?: never;
88
88
  sourceLifecycleGeneration?: never;
89
89
  destination?: never;
@@ -205,8 +205,8 @@ export declare function boundScheduledTaskDetailMcp(task: ScheduledTask): {
205
205
  runMode: "existing_session" | "new_session_per_run" | "reusable_session";
206
206
  overlapPolicy: "allow_concurrent" | "buffer_one" | "skip";
207
207
  action: {
208
+ readonly sourceId?: never;
208
209
  kind: "agent_turn";
209
- sourceId?: never;
210
210
  sourceGeneration?: never;
211
211
  sourceLifecycleGeneration?: never;
212
212
  destination?: never;
@@ -389,8 +389,8 @@ export declare function boundScheduledTaskMcpPage(input: {
389
389
  runMode: "existing_session" | "new_session_per_run" | "reusable_session";
390
390
  overlapPolicy: "allow_concurrent" | "buffer_one" | "skip";
391
391
  action: {
392
+ readonly sourceId?: never;
392
393
  kind: "agent_turn";
393
- sourceId?: never;
394
394
  sourceGeneration?: never;
395
395
  sourceLifecycleGeneration?: never;
396
396
  destination?: never;
@@ -199,7 +199,7 @@ export declare function capSessionDiscoveryCompactPage(page: Awaited<ReturnType<
199
199
  updatedAt: string;
200
200
  queuedPromptCount?: number;
201
201
  latestMessage: {
202
- 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" | "session.wait.finished" | "session.wait.started" | "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";
202
+ 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.selection.changed" | "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" | "session.wait.finished" | "session.wait.started" | "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";
203
203
  previewOmitted: boolean;
204
204
  previewOmissionReason: "aggregatePreviewBudget";
205
205
  previewDrillDownTool: "session_events";
@@ -210,10 +210,10 @@ export declare function capSessionDiscoveryCompactPage(page: Awaited<ReturnType<
210
210
  mode: "monitoring";
211
211
  payloadMode: "summary";
212
212
  sessionId: string;
213
- includeTypes: ("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" | "session.wait.finished" | "session.wait.started" | "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")[];
213
+ includeTypes: ("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.selection.changed" | "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" | "session.wait.finished" | "session.wait.started" | "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")[];
214
214
  };
215
215
  } | {
216
- 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" | "session.wait.finished" | "session.wait.started" | "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";
216
+ 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.selection.changed" | "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" | "session.wait.finished" | "session.wait.started" | "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";
217
217
  preview: string | null;
218
218
  previewTruncated?: boolean;
219
219
  };
@@ -298,7 +298,7 @@ export declare function capSessionDiscoveryPage(page: Awaited<ReturnType<typeof
298
298
  noAdditionalAccess: true;
299
299
  };
300
300
  latestMessage?: {
301
- 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" | "session.wait.finished" | "session.wait.started" | "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";
301
+ 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.selection.changed" | "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" | "session.wait.finished" | "session.wait.started" | "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";
302
302
  preview: string | null;
303
303
  previewTruncated: boolean;
304
304
  } | null;
@@ -0,0 +1,4 @@
1
+ import type { Hono } from "hono";
2
+ import { type ApiRouteDeps } from "@opengeni/core";
3
+ /** Human folder editing and the legacy Skill admin share scope authorization. */
4
+ export declare function registerSkillContentRoutes(app: Hono, deps: ApiRouteDeps): void;
@@ -0,0 +1,6 @@
1
+ import { type SkillActor as SkillActorType } from "@opengeni/contracts";
2
+ import { type AccessGrantAuthorization } from "@opengeni/core";
3
+ /** Use authenticated request provenance, never a caller-supplied actor or subject alone. */
4
+ export declare function skillInstallerActor(access: AccessGrantAuthorization): SkillActorType;
5
+ /** Non-Skill component removals remain available to their existing callers. */
6
+ export declare function skillRemovalActor(access: AccessGrantAuthorization): SkillActorType | undefined;
@@ -6,3 +6,4 @@ export declare function createXaiSubscriptionTranscriptionProvider(input: {
6
6
  db: Database;
7
7
  fetch?: typeof fetch;
8
8
  }): TranscriptionProvider;
9
+ export declare function isXaiInvalidCredentialResponse(response: Response): Promise<boolean>;
@@ -1,5 +1,5 @@
1
1
  import { type Settings } from "@opengeni/config";
2
- import { type TranscriptionAvailabilityContext, type TranscriptionService } from "@opengeni/core";
2
+ import { type TranscriptionAvailabilityContext, type TranscriptionProvider, type TranscriptionService } from "@opengeni/core";
3
3
  import type { Database } from "@opengeni/db";
4
4
  export declare function createTranscriptionService(input: {
5
5
  settings: Settings;
@@ -13,3 +13,4 @@ export declare function createTranscriptionService(input: {
13
13
  now?: () => Date;
14
14
  }): TranscriptionService;
15
15
  export declare function remainingTranscriptionProviderRequestMilliseconds(providerDeadlineAt: Date, now: Date): number;
16
+ export declare function orderedProviders(providers: readonly TranscriptionProvider[], context: TranscriptionAvailabilityContext): TranscriptionProvider[];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@opengeni/api-router",
3
- "version": "2.11.0-canary.0",
3
+ "version": "2.11.2-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": {
@@ -43,24 +43,24 @@
43
43
  "@hono/zod-validator": "^0.7.6",
44
44
  "@llamaindex/liteparse": "2.14.2",
45
45
  "@modelcontextprotocol/sdk": "^1.29.0",
46
- "@opengeni/agent-proto": "^0.5.1-canary.18",
47
- "@opengeni/artifact-tool": "^0.3.20-canary.0",
48
- "@opengeni/capabilities": "^0.3.3-canary.0",
49
- "@opengeni/codemode": "^0.5.0-canary.0",
50
- "@opengeni/codex": "^0.2.22-canary.0",
51
- "@opengeni/config": "^1.0.1-canary.0",
52
- "@opengeni/contracts": "^2.14.0-canary.0",
53
- "@opengeni/core": "^2.8.0-canary.0",
54
- "@opengeni/db": "^4.1.0-canary.0",
55
- "@opengeni/documents": "^0.8.20-canary.0",
56
- "@opengeni/events": "^0.4.18-canary.0",
57
- "@opengeni/github": "^0.7.4-canary.0",
58
- "@opengeni/network": "^0.3.1-canary.0",
59
- "@opengeni/observability": "^0.8.20-canary.0",
60
- "@opengeni/runtime": "^2.4.0-canary.0",
61
- "@opengeni/storage": "^0.2.121-canary.0",
62
- "@opengeni/tool-gateway": "^0.1.1-canary.0",
63
- "@opengeni/xai-subscription": "^0.1.4-canary.0",
46
+ "@opengeni/agent-proto": "^0.5.1-canary.20",
47
+ "@opengeni/artifact-tool": "^0.3.22-canary.0",
48
+ "@opengeni/capabilities": "^0.3.3-canary.2",
49
+ "@opengeni/codemode": "^0.5.2-canary.0",
50
+ "@opengeni/codex": "^0.2.22-canary.2",
51
+ "@opengeni/config": "^1.0.3-canary.0",
52
+ "@opengeni/contracts": "^2.15.1-canary.0",
53
+ "@opengeni/core": "^2.8.2-canary.0",
54
+ "@opengeni/db": "^4.2.1-canary.0",
55
+ "@opengeni/documents": "^0.8.22-canary.0",
56
+ "@opengeni/events": "^0.4.20-canary.0",
57
+ "@opengeni/github": "^0.7.6-canary.0",
58
+ "@opengeni/network": "^0.3.1-canary.2",
59
+ "@opengeni/observability": "^0.8.22-canary.0",
60
+ "@opengeni/runtime": "^2.4.2-canary.0",
61
+ "@opengeni/storage": "^0.2.123-canary.0",
62
+ "@opengeni/tool-gateway": "^0.1.3-canary.0",
63
+ "@opengeni/xai-subscription": "^0.1.4-canary.2",
64
64
  "@temporalio/client": "^1.17.0",
65
65
  "better-auth": "^1.6.14",
66
66
  "hono": "^4.12.18",
package/src/app.ts CHANGED
@@ -8,6 +8,7 @@ import {
8
8
  configuredAllowedReasoningEfforts,
9
9
  configuredModels,
10
10
  resolveFirstPartyMcpToolPolicy,
11
+ resolveVoiceInputProviderRegistry,
11
12
  withCodexCatalogProvider,
12
13
  withXaiSubscriptionCatalogProvider,
13
14
  } from "@opengeni/config";
@@ -879,6 +880,9 @@ export function createAppComposition(deps: AppDependencies): {
879
880
  maxSizeBytes: objectStorage?.maxSinglePutSizeBytes ?? 5_000_000_000,
880
881
  },
881
882
  voiceInput: {
883
+ providers: resolveVoiceInputProviderRegistry(deps.settings).map(
884
+ (provider) => provider.id,
885
+ ),
882
886
  available: (await transcription?.available()) ?? false,
883
887
  maxDurationSeconds: deps.settings.voiceInputMaxDurationSeconds,
884
888
  maxSizeBytes: deps.settings.voiceInputMaxSizeBytes,
@@ -2564,6 +2568,20 @@ const routeLabelPatterns: Array<{
2564
2568
  ];
2565
2569
 
2566
2570
  export function routeLabel(pathname: string): string {
2571
+ if (/^\/v1\/workspaces\/[^/]+\/transcriptions$/.test(pathname))
2572
+ return "/v1/workspaces/:workspaceId/transcriptions";
2573
+ const transcription = pathname.match(
2574
+ /^\/v1\/workspaces\/[^/]+\/transcription-recordings(?:\/[^/]+(\/(?:finalize|process-next)|\/chunks\/\d+)?)?$/,
2575
+ );
2576
+ if (transcription) {
2577
+ const base = "/v1/workspaces/:workspaceId/transcription-recordings";
2578
+ if (pathname.split("/").length === 5) return base;
2579
+ return (
2580
+ base +
2581
+ "/:recordingId" +
2582
+ (transcription[1]?.startsWith("/chunks/") ? "/chunks/:chunkNumber" : (transcription[1] ?? ""))
2583
+ );
2584
+ }
2567
2585
  for (const candidate of routeLabelPatterns) {
2568
2586
  const match = pathname.match(candidate.pattern);
2569
2587
  if (match) {
package/src/http/sse.ts CHANGED
@@ -63,11 +63,12 @@ export type ByteBoundedSseStream = {
63
63
  * checking `desiredSize` can still accumulate an unbounded server-side queue.
64
64
  *
65
65
  * One writer is expected per stream. The Web Streams queue holds at most one
66
- * complete frame, and that frame must fit inside the byte cap. A second write
66
+ * complete frame. One oversized frame is delivered intact rather than lost;
67
+ * the byte budget is a batching target, not a content limit. A second write
67
68
  * waits for consumer pull only for a bounded interval; cancellation or a stalled
68
69
  * reader wakes it and terminates upstream delivery before another durable page is
69
- * read. One frame is deliberate: it makes both queued-frame count and queued
70
- * bytes independently bounded instead of relying on byte accounting alone.
70
+ * read. One frame is deliberate: queued memory is bounded by one event, not
71
+ * by the size of the session, without imposing a lossy per-message limit.
71
72
  */
72
73
  export function createByteBoundedSseStream(
73
74
  options: ByteBoundedSseStreamOptions = {},
@@ -149,19 +150,6 @@ export function createByteBoundedSseStream(
149
150
  stream,
150
151
  write: async (frame) => {
151
152
  const chunk = encoder.encode(frame);
152
- if (chunk.byteLength > maxQueuedBytes) {
153
- const error = new RangeError(
154
- `SSE frame cannot fit in the configured queue (${chunk.byteLength} > ${maxQueuedBytes} bytes)`,
155
- );
156
- options.onObservation?.({
157
- reason: "frame_too_large",
158
- desiredSize: controller.desiredSize,
159
- queuedFrames,
160
- queuedBytes,
161
- });
162
- stop(() => controller.error(error));
163
- throw error;
164
- }
165
153
  for (;;) {
166
154
  if (stopped) return false;
167
155
  const desired = controller.desiredSize;
@@ -380,7 +368,7 @@ export async function sseSessionStream(
380
368
  );
381
369
  }
382
370
  // The durable audit log remains exact. The browser transport combines
383
- // adjacent text deltas into bounded frames carrying `coalescedUntil`, so
371
+ // adjacent text deltas into lossless batches carrying `coalescedUntil`, so
384
372
  // a long answer cannot create thousands of React renders and starve
385
373
  // command acknowledgements behind its own token stream.
386
374
  const compactProjection = coalesceSessionEventDeltasWithCoverage(eligible);
@@ -394,7 +382,8 @@ export async function sseSessionStream(
394
382
  throw new Error(`Session event replay made no progress after sequence ${lastSent}`);
395
383
  }
396
384
  if (targetSequence !== undefined && lastSent >= targetSequence) return;
397
- if (targetSequence === undefined && page.length < limit) return;
385
+ // A byte-selected page may contain fewer rows than requested, especially
386
+ // when one large message travels alone. Only an empty read proves EOF.
398
387
  }
399
388
  };
400
389
  let durableDeliveryTail = Promise.resolve();
@@ -1116,12 +1105,7 @@ function finiteSseBatchResponse(frames: readonly string[], options: SseDeliveryO
1116
1105
  let length = 0;
1117
1106
  for (const frame of frames) {
1118
1107
  const chunk = encoder.encode(frame);
1119
- if (chunk.byteLength > maxBytes) {
1120
- throw new RangeError(
1121
- `SSE frame cannot fit in the finite browser batch (${chunk.byteLength} > ${maxBytes} bytes)`,
1122
- );
1123
- }
1124
- if (length + chunk.byteLength > maxBytes) break;
1108
+ if (chunks.length > 0 && length + chunk.byteLength > maxBytes) break;
1125
1109
  chunks.push(chunk);
1126
1110
  length += chunk.byteLength;
1127
1111
  }
@@ -1154,7 +1138,7 @@ async function collectFiniteSseBatch(
1154
1138
  if (next.done) break;
1155
1139
  // Each source chunk is one complete SSE frame. End before an overflowing
1156
1140
  // frame so reconnect replay starts from the consumer's last whole cursor.
1157
- if (length + next.value.byteLength > maxBytes) {
1141
+ if (chunks.length > 0 && length + next.value.byteLength > maxBytes) {
1158
1142
  await reader.cancel("finite SSE batch reached its byte limit");
1159
1143
  break;
1160
1144
  }
package/src/index.ts CHANGED
@@ -123,6 +123,7 @@ export async function createTemporalWorkflowClient(
123
123
  workflowId,
124
124
  wakeRevision,
125
125
  interruptionRequested,
126
+ onSignalAccepted,
126
127
  }) => {
127
128
  await temporal.workflow.signalWithStart("sessionWorkflow", {
128
129
  taskQueue: settings.temporalTaskQueue,
@@ -131,7 +132,8 @@ export async function createTemporalWorkflowClient(
131
132
  args: [{ accountId, workspaceId, sessionId }],
132
133
  signal: interruptionRequested ? "sessionControl" : "queueChanged",
133
134
  });
134
- await markSessionWorkflowWakeDelivered(db, {
135
+ onSignalAccepted?.();
136
+ return await markSessionWorkflowWakeDelivered(db, {
135
137
  accountId,
136
138
  workspaceId,
137
139
  sessionId,
@@ -1,142 +1,2 @@
1
- import type { Settings } from "@opengeni/config";
2
- import type { GitHubSkillSourceClient, GitHubSkillTreeEntry } from "@opengeni/core";
3
- import { pinnedFetch, readResponseJsonBounded, readResponseTextBounded } from "@opengeni/network";
4
-
5
- const githubApiBase = "https://api.github.com";
6
- const githubRequestTimeoutMs = 15_000;
7
- const githubMetadataMaxBytes = 4 * 1024 * 1024;
8
- const githubBlobResponseMaxBytes = 512 * 1024;
9
-
10
- type GitHubJsonRequest = (path: string, maxBytes: number, label: string) => Promise<unknown>;
11
-
12
- export function createGitHubSkillSourceClient(
13
- settings: Settings,
14
- requestJson: GitHubJsonRequest = (path, maxBytes, label) =>
15
- githubJson(settings, path, maxBytes, label),
16
- ): GitHubSkillSourceClient {
17
- return {
18
- resolveCommit: async (owner, repository, ref) => {
19
- const payload = recordValue(
20
- await requestJson(
21
- `/repos/${encodeURIComponent(owner)}/${encodeURIComponent(repository)}/commits/${encodeURIComponent(ref)}`,
22
- githubMetadataMaxBytes,
23
- "GitHub Skill commit",
24
- ),
25
- "GitHub commit",
26
- );
27
- const sha = stringValue(payload.sha);
28
- if (!sha) throw new Error("GitHub commit response omitted sha");
29
- return sha.toLowerCase();
30
- },
31
- listTree: async (owner, repository, commit) => {
32
- const payload = recordValue(
33
- await requestJson(
34
- `/repos/${encodeURIComponent(owner)}/${encodeURIComponent(repository)}/git/trees/${encodeURIComponent(commit)}?recursive=1`,
35
- githubMetadataMaxBytes,
36
- "GitHub Skill tree",
37
- ),
38
- "GitHub tree",
39
- );
40
- if (payload.truncated === true) {
41
- throw new Error("GitHub repository tree is too large to import safely");
42
- }
43
- if (!Array.isArray(payload.tree)) throw new Error("GitHub tree response omitted entries");
44
- return payload.tree.map((entry, index): GitHubSkillTreeEntry => {
45
- const record = recordValue(entry, `GitHub tree entry ${index}`);
46
- const path = stringValue(record.path);
47
- const type = stringValue(record.type);
48
- const mode = stringValue(record.mode);
49
- const sha = stringValue(record.sha);
50
- const size = record.size;
51
- if (
52
- !path ||
53
- (type !== "blob" && type !== "tree" && type !== "commit") ||
54
- !mode ||
55
- !sha ||
56
- (size !== undefined &&
57
- size !== null &&
58
- (typeof size !== "number" || !Number.isSafeInteger(size) || size < 0))
59
- ) {
60
- throw new Error(`GitHub tree entry ${index} is invalid`);
61
- }
62
- return { path, type, mode, sha, size: typeof size === "number" ? size : null };
63
- });
64
- },
65
- readBlob: async (owner, repository, sha) => {
66
- const payload = recordValue(
67
- await requestJson(
68
- `/repos/${encodeURIComponent(owner)}/${encodeURIComponent(repository)}/git/blobs/${encodeURIComponent(sha)}`,
69
- githubBlobResponseMaxBytes,
70
- "GitHub Skill file",
71
- ),
72
- "GitHub blob",
73
- );
74
- if (payload.encoding !== "base64" || typeof payload.content !== "string") {
75
- throw new Error("GitHub Skill file did not use base64 encoding");
76
- }
77
- const normalized = payload.content.replace(/\s+/gu, "");
78
- if (!/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/u.test(normalized)) {
79
- throw new Error("GitHub Skill file contained invalid base64");
80
- }
81
- const bytes = Uint8Array.from(Buffer.from(normalized, "base64"));
82
- if (
83
- typeof payload.size === "number" &&
84
- Number.isSafeInteger(payload.size) &&
85
- payload.size !== bytes.byteLength
86
- ) {
87
- throw new Error("GitHub Skill file size did not match its payload");
88
- }
89
- return bytes;
90
- },
91
- };
92
- }
93
-
94
- async function githubJson(
95
- settings: Settings,
96
- path: string,
97
- maxBytes: number,
98
- label: string,
99
- ): Promise<unknown> {
100
- const controller = new AbortController();
101
- const timeout = setTimeout(() => controller.abort(), githubRequestTimeoutMs);
102
- try {
103
- const response = await pinnedFetch(
104
- `${githubApiBase}${path}`,
105
- {
106
- method: "GET",
107
- headers: {
108
- accept: "application/vnd.github+json",
109
- "user-agent": "OpenGeni-Capabilities",
110
- "x-github-api-version": "2022-11-28",
111
- },
112
- signal: controller.signal,
113
- },
114
- settings,
115
- { label, requireHttpsOutsideLocalTest: true },
116
- );
117
- if (!response.ok) {
118
- await readResponseTextBounded(response, 8_192, `${label} error`).catch(() => undefined);
119
- if (response.status === 404) throw new Error(`${label} was not found or is not public`);
120
- if (response.status === 403 || response.status === 429) {
121
- throw new Error(`${label} is temporarily unavailable because GitHub limited the request`);
122
- }
123
- throw new Error(`${label} failed with HTTP ${response.status}`);
124
- }
125
- return await readResponseJsonBounded(response, maxBytes, label, {
126
- signal: controller.signal,
127
- });
128
- } finally {
129
- clearTimeout(timeout);
130
- }
131
- }
132
-
133
- function recordValue(value: unknown, label: string): Record<string, unknown> {
134
- if (!value || typeof value !== "object" || Array.isArray(value)) {
135
- throw new Error(`${label} response is invalid`);
136
- }
137
- return value as Record<string, unknown>;
138
- }
139
-
140
- function stringValue(value: unknown): string | null {
141
- return typeof value === "string" && value.trim().length > 0 ? value.trim() : null;
142
- }
1
+ // Compatibility import for existing API consumers; API and worker share one adapter.
2
+ export { createGitHubSkillSourceClient } from "@opengeni/core";
@@ -4,7 +4,6 @@ import {
4
4
  AGENT_AUTHORED_INSTRUCTION_POLICY_STYLE,
5
5
  AGENT_AUTHORED_PREFERENCE_CONTENT_MAX_CHARS,
6
6
  AGENT_AUTHORED_PREFERENCE_CONTENT_TOO_LONG_MESSAGE,
7
- AGENT_AUTHORED_SKILL_STYLE,
8
7
  PREFERENCE_REGISTRY_DESCRIPTOR_DESCRIPTION_MAX_CHARS,
9
8
  PREFERENCE_REGISTRY_STABLE_KEY_MAX_CHARS,
10
9
  PREFERENCE_REGISTRY_TITLE_MAX_CHARS,
@@ -164,9 +163,7 @@ export function registerCompanyBrainGovernedWriteTools(
164
163
  "task_note_promote_preference",
165
164
  {
166
165
  description:
167
- "Atomically promote one still-active note from this exact root task tree into a workspace Skill proposal backed by the structured preference authority. Use this for reusable conditional how-to guidance, never for an incident, fact, decision, outcome, or universal always-on rule. The note bytes remain exact evidence and full proposal content. " +
168
- `The title and description you supply are what gets composed into every session prompt, so write them as one short imperative statement; the note content is retrieved on demand and a note over ${AGENT_AUTHORED_PREFERENCE_CONTENT_MAX_CHARS} characters is rejected here rather than truncated. ` +
169
- "Under Suggest the proposal waits for human review; under Automatic an eligible decision is activated through the preference lifecycle and remains undoable. This never widens scope.",
166
+ "Legacy Skill promotion entry point. Returns a redirect without changing the note or writing a Skill. Read the note, then use skill_save for reusable guidance governed directly by Learning mode. Read opengeni-skills with skill_read for instructions.",
170
167
  inputSchema: {
171
168
  ...taskNotePromotion,
172
169
  stableKey: z.string().trim().min(1).max(PREFERENCE_REGISTRY_STABLE_KEY_MAX_CHARS),
@@ -185,14 +182,13 @@ export function registerCompanyBrainGovernedWriteTools(
185
182
  expiresAt: z.string().datetime({ offset: true }).nullable().optional().default(null),
186
183
  },
187
184
  },
188
- async (request) => {
185
+ async () => {
189
186
  await input.authorize();
190
- return writeResult(() =>
191
- router.write({
192
- attempt: input.attempt,
193
- request: { kind: "promote_task_note_preference", ...request },
194
- }),
195
- );
187
+ return input.json({
188
+ status: "not_saved",
189
+ code: "use_skill_save",
190
+ message: "Read the task note, then use skill_save. The note has not been changed.",
191
+ });
196
192
  },
197
193
  );
198
194
 
@@ -234,9 +230,7 @@ export function registerCompanyBrainGovernedWriteTools(
234
230
  "preference_propose",
235
231
  {
236
232
  description:
237
- "Materialize an evidence-backed workspace Skill proposal in the structured preference authority. Use this only for reusable conditional how-to guidance, never for an incident, fact, decision, outcome, or universal always-on rule. " +
238
- `Its short title and description are what get composed into every session prompt; the content is retrieved on demand, so its length is retrieval cost rather than standing prompt cost. Keep the content under ${AGENT_AUTHORED_PREFERENCE_CONTENT_MAX_CHARS} characters. ${AGENT_AUTHORED_SKILL_STYLE} ` +
239
- "Under Suggest it stays inactive for human review; under Automatic an eligible decision is activated through the governed preference lifecycle with an undoable receipt. It never creates mandatory authority.",
233
+ "Legacy Skill proposal entry point. Returns a redirect without writing. Use skill_read to read opengeni-skills, then discover skill_save for shared Skill file changes governed directly by Learning mode.",
240
234
  inputSchema: {
241
235
  ...evidence,
242
236
  stableKey: z.string().trim().min(1).max(PREFERENCE_REGISTRY_STABLE_KEY_MAX_CHARS),
@@ -264,14 +258,14 @@ export function registerCompanyBrainGovernedWriteTools(
264
258
  reason,
265
259
  },
266
260
  },
267
- async (request) => {
261
+ async () => {
268
262
  await input.authorize();
269
- return writeResult(() =>
270
- router.write({
271
- attempt: input.attempt,
272
- request: { kind: "propose_preference", ...request },
273
- }),
274
- );
263
+ return input.json({
264
+ status: "not_saved",
265
+ code: "use_skill_save",
266
+ message:
267
+ "Use skill_save for Skill changes. This legacy entry point made no durable change.",
268
+ });
275
269
  },
276
270
  );
277
271
  }