@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.
- package/dist/app.js +1 -1
- package/dist/{chunk-EAYCECQK.js → chunk-5X3XM6CE.js} +1841 -1528
- package/dist/chunk-5X3XM6CE.js.map +1 -0
- package/dist/http/sse.d.ts +4 -3
- package/dist/index.js +5 -3
- package/dist/index.js.map +1 -1
- package/dist/integrations/github-skill-source.d.ts +1 -5
- package/dist/mcp/remember.d.ts +1 -1
- package/dist/mcp/scheduled-task-view.d.ts +3 -3
- package/dist/mcp/server.d.ts +4 -4
- package/dist/routes/skill-content.d.ts +4 -0
- package/dist/routes/skill-install-authority.d.ts +6 -0
- package/dist/transcription/providers/xai-subscription.d.ts +1 -0
- package/dist/transcription/service.d.ts +2 -1
- package/package.json +19 -19
- package/src/app.ts +18 -0
- package/src/http/sse.ts +9 -25
- package/src/index.ts +3 -1
- package/src/integrations/github-skill-source.ts +2 -142
- package/src/mcp/company-brain-governed-writes.ts +15 -21
- package/src/mcp/remember.ts +14 -15
- package/src/mcp/server.ts +7 -4
- package/src/routes/automations.ts +35 -0
- package/src/routes/packs.ts +61 -8
- package/src/routes/plugins.ts +48 -5
- package/src/routes/preference-registry.ts +12 -93
- package/src/routes/sessions.ts +52 -20
- package/src/routes/skill-content.ts +226 -0
- package/src/routes/skill-install-authority.ts +64 -0
- package/src/routes/skills.ts +38 -3
- package/src/routes/transcription-recordings.ts +30 -1
- package/src/routes/transcriptions.ts +4 -0
- package/src/transcription/providers/codex-subscription.ts +2 -0
- package/src/transcription/providers/openai.ts +1 -0
- package/src/transcription/providers/xai-subscription.ts +49 -3
- package/src/transcription/service.ts +43 -6
- package/src/xai-subscription-auth.ts +9 -2
- package/dist/chunk-EAYCECQK.js.map +0 -1
|
@@ -1,5 +1 @@
|
|
|
1
|
-
|
|
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";
|
package/dist/mcp/remember.d.ts
CHANGED
|
@@ -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 (
|
|
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;
|
package/dist/mcp/server.d.ts
CHANGED
|
@@ -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,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;
|
|
@@ -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.
|
|
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.
|
|
47
|
-
"@opengeni/artifact-tool": "^0.3.
|
|
48
|
-
"@opengeni/capabilities": "^0.3.3-canary.
|
|
49
|
-
"@opengeni/codemode": "^0.5.
|
|
50
|
-
"@opengeni/codex": "^0.2.22-canary.
|
|
51
|
-
"@opengeni/config": "^1.0.
|
|
52
|
-
"@opengeni/contracts": "^2.
|
|
53
|
-
"@opengeni/core": "^2.8.
|
|
54
|
-
"@opengeni/db": "^4.1
|
|
55
|
-
"@opengeni/documents": "^0.8.
|
|
56
|
-
"@opengeni/events": "^0.4.
|
|
57
|
-
"@opengeni/github": "^0.7.
|
|
58
|
-
"@opengeni/network": "^0.3.1-canary.
|
|
59
|
-
"@opengeni/observability": "^0.8.
|
|
60
|
-
"@opengeni/runtime": "^2.4.
|
|
61
|
-
"@opengeni/storage": "^0.2.
|
|
62
|
-
"@opengeni/tool-gateway": "^0.1.
|
|
63
|
-
"@opengeni/xai-subscription": "^0.1.4-canary.
|
|
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
|
|
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:
|
|
70
|
-
*
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
135
|
+
onSignalAccepted?.();
|
|
136
|
+
return await markSessionWorkflowWakeDelivered(db, {
|
|
135
137
|
accountId,
|
|
136
138
|
workspaceId,
|
|
137
139
|
sessionId,
|
|
@@ -1,142 +1,2 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
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
|
-
"
|
|
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 (
|
|
185
|
+
async () => {
|
|
189
186
|
await input.authorize();
|
|
190
|
-
return
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
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
|
-
"
|
|
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 (
|
|
261
|
+
async () => {
|
|
268
262
|
await input.authorize();
|
|
269
|
-
return
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
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
|
}
|