@kvman/kvcoder 0.1.6 → 0.1.8
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/api.d.ts +49 -3
- package/dist/api.d.ts.map +1 -1
- package/dist/calls/run-shell.d.ts.map +1 -1
- package/dist/calls/run-shell.js +39 -9
- package/dist/calls/run-shell.js.map +1 -1
- package/dist/connector-call.d.ts +1 -1
- package/dist/connector-call.d.ts.map +1 -1
- package/dist/connector-call.js +4 -2
- package/dist/connector-call.js.map +1 -1
- package/dist/connectors/artifact.d.ts +1 -1
- package/dist/connectors/artifact.d.ts.map +1 -1
- package/dist/connectors/artifact.js +4 -4
- package/dist/connectors/artifact.js.map +1 -1
- package/dist/connectors/ask.d.ts +24 -0
- package/dist/connectors/ask.d.ts.map +1 -1
- package/dist/connectors/ask.js +20 -11
- package/dist/connectors/ask.js.map +1 -1
- package/dist/connectors/background.d.ts +14 -1
- package/dist/connectors/background.d.ts.map +1 -1
- package/dist/connectors/background.js +53 -23
- package/dist/connectors/background.js.map +1 -1
- package/dist/connectors/builtin-connectors.d.ts +110 -0
- package/dist/connectors/builtin-connectors.d.ts.map +1 -1
- package/dist/connectors/builtin-connectors.js +4 -1
- package/dist/connectors/builtin-connectors.js.map +1 -1
- package/dist/connectors/delegate.d.ts +3 -2
- package/dist/connectors/delegate.d.ts.map +1 -1
- package/dist/connectors/delegate.js +27 -9
- package/dist/connectors/delegate.js.map +1 -1
- package/dist/connectors/execution-map.d.ts +62 -0
- package/dist/connectors/execution-map.d.ts.map +1 -0
- package/dist/connectors/execution-map.js +142 -0
- package/dist/connectors/execution-map.js.map +1 -0
- package/dist/connectors/fs.d.ts +32 -1
- package/dist/connectors/fs.d.ts.map +1 -1
- package/dist/connectors/fs.js +76 -45
- package/dist/connectors/fs.js.map +1 -1
- package/dist/connectors/mcp.d.ts +18 -1
- package/dist/connectors/mcp.d.ts.map +1 -1
- package/dist/connectors/mcp.js +54 -6
- package/dist/connectors/mcp.js.map +1 -1
- package/dist/connectors/payload-fields.d.ts.map +1 -1
- package/dist/connectors/payload-fields.js +1 -1
- package/dist/connectors/payload-fields.js.map +1 -1
- package/dist/delegate/approved-run.d.ts +4 -6
- package/dist/delegate/approved-run.d.ts.map +1 -1
- package/dist/delegate/approved-run.js +74 -34
- package/dist/delegate/approved-run.js.map +1 -1
- package/dist/delegate/git-staging.d.ts +12 -0
- package/dist/delegate/git-staging.d.ts.map +1 -0
- package/dist/delegate/git-staging.js +54 -0
- package/dist/delegate/git-staging.js.map +1 -0
- package/dist/delegate/permission.d.ts +240 -0
- package/dist/delegate/permission.d.ts.map +1 -0
- package/dist/delegate/permission.js +78 -0
- package/dist/delegate/permission.js.map +1 -0
- package/dist/delegate/program-permission.d.ts +27 -0
- package/dist/delegate/program-permission.d.ts.map +1 -0
- package/dist/delegate/program-permission.js +53 -0
- package/dist/delegate/program-permission.js.map +1 -0
- package/dist/delegate/register-worker-run.d.ts.map +1 -1
- package/dist/delegate/register-worker-run.js +27 -11
- package/dist/delegate/register-worker-run.js.map +1 -1
- package/dist/delegate/run-program.d.ts.map +1 -1
- package/dist/delegate/run-program.js +29 -8
- package/dist/delegate/run-program.js.map +1 -1
- package/dist/delegate/runs.d.ts +14 -4
- package/dist/delegate/runs.d.ts.map +1 -1
- package/dist/delegate/runs.js +49 -19
- package/dist/delegate/runs.js.map +1 -1
- package/dist/delegate/staging-guard.d.ts +9 -0
- package/dist/delegate/staging-guard.d.ts.map +1 -0
- package/dist/delegate/staging-guard.js +55 -0
- package/dist/delegate/staging-guard.js.map +1 -0
- package/dist/delegate/start-background.d.ts +7 -0
- package/dist/delegate/start-background.d.ts.map +1 -0
- package/dist/delegate/start-background.js +32 -0
- package/dist/delegate/start-background.js.map +1 -0
- package/dist/delegate/start-pending.d.ts +5 -0
- package/dist/delegate/start-pending.d.ts.map +1 -0
- package/dist/delegate/start-pending.js +42 -0
- package/dist/delegate/start-pending.js.map +1 -0
- package/dist/delegate/workers.d.ts +5 -2
- package/dist/delegate/workers.d.ts.map +1 -1
- package/dist/delegate/workers.js +44 -8
- package/dist/delegate/workers.js.map +1 -1
- package/dist/files/file-change.d.ts +28 -0
- package/dist/files/file-change.d.ts.map +1 -0
- package/dist/files/file-change.js +125 -0
- package/dist/files/file-change.js.map +1 -0
- package/dist/files/file-parts.d.ts +18 -0
- package/dist/files/file-parts.d.ts.map +1 -0
- package/dist/files/file-parts.js +40 -0
- package/dist/files/file-parts.js.map +1 -0
- package/dist/files/read-file.d.ts +9 -1
- package/dist/files/read-file.d.ts.map +1 -1
- package/dist/files/read-file.js +35 -13
- package/dist/files/read-file.js.map +1 -1
- package/dist/files/search-text.d.ts +12 -2
- package/dist/files/search-text.d.ts.map +1 -1
- package/dist/files/search-text.js +87 -23
- package/dist/files/search-text.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/jobs/job-rows.d.ts +11 -2
- package/dist/jobs/job-rows.d.ts.map +1 -1
- package/dist/jobs/job-rows.js +24 -13
- package/dist/jobs/job-rows.js.map +1 -1
- package/dist/jobs/process-handlers.d.ts.map +1 -1
- package/dist/jobs/process-handlers.js +12 -1
- package/dist/jobs/process-handlers.js.map +1 -1
- package/dist/jobs/process-report.d.ts.map +1 -1
- package/dist/jobs/process-report.js +2 -1
- package/dist/jobs/process-report.js.map +1 -1
- package/dist/jobs/process-run.d.ts.map +1 -1
- package/dist/jobs/process-run.js +2 -1
- package/dist/jobs/process-run.js.map +1 -1
- package/dist/jobs/register-jobs.d.ts.map +1 -1
- package/dist/jobs/register-jobs.js +1 -0
- package/dist/jobs/register-jobs.js.map +1 -1
- package/dist/maps/map-reminder.d.ts +7 -0
- package/dist/maps/map-reminder.d.ts.map +1 -0
- package/dist/maps/map-reminder.js +24 -0
- package/dist/maps/map-reminder.js.map +1 -0
- package/dist/maps/map-rules.d.ts +36 -0
- package/dist/maps/map-rules.d.ts.map +1 -0
- package/dist/maps/map-rules.js +86 -0
- package/dist/maps/map-rules.js.map +1 -0
- package/dist/maps/map-schema.d.ts +55 -0
- package/dist/maps/map-schema.d.ts.map +1 -0
- package/dist/maps/map-schema.js +27 -0
- package/dist/maps/map-schema.js.map +1 -0
- package/dist/maps/register-maps.d.ts +3 -0
- package/dist/maps/register-maps.d.ts.map +1 -0
- package/dist/maps/register-maps.js +21 -0
- package/dist/maps/register-maps.js.map +1 -0
- package/dist/mcp/connect.d.ts +2 -0
- package/dist/mcp/connect.d.ts.map +1 -1
- package/dist/mcp/connect.js +16 -4
- package/dist/mcp/connect.js.map +1 -1
- package/dist/mcp/oauth-provider.d.ts +8 -5
- package/dist/mcp/oauth-provider.d.ts.map +1 -1
- package/dist/mcp/oauth-provider.js +31 -22
- package/dist/mcp/oauth-provider.js.map +1 -1
- package/dist/mcp/secrets.d.ts +2 -0
- package/dist/mcp/secrets.d.ts.map +1 -1
- package/dist/mcp/secrets.js +6 -0
- package/dist/mcp/secrets.js.map +1 -1
- package/dist/mcp/sign-in.d.ts.map +1 -1
- package/dist/mcp/sign-in.js +12 -4
- package/dist/mcp/sign-in.js.map +1 -1
- package/dist/messages/receive-message.d.ts +2 -1
- package/dist/messages/receive-message.d.ts.map +1 -1
- package/dist/messages/receive-message.js +34 -9
- package/dist/messages/receive-message.js.map +1 -1
- package/dist/messages/register-messages.d.ts.map +1 -1
- package/dist/messages/register-messages.js +13 -8
- package/dist/messages/register-messages.js.map +1 -1
- package/dist/messages/send-receipt.d.ts +10 -0
- package/dist/messages/send-receipt.d.ts.map +1 -0
- package/dist/messages/send-receipt.js +14 -0
- package/dist/messages/send-receipt.js.map +1 -0
- package/dist/prompt/build-prompt.d.ts +1 -0
- package/dist/prompt/build-prompt.d.ts.map +1 -1
- package/dist/prompt/build-prompt.js +5 -1
- package/dist/prompt/build-prompt.js.map +1 -1
- package/dist/prompt/project-rules.d.ts +6 -0
- package/dist/prompt/project-rules.d.ts.map +1 -0
- package/dist/prompt/project-rules.js +37 -0
- package/dist/prompt/project-rules.js.map +1 -0
- package/dist/prompt/session-grants.d.ts +209 -0
- package/dist/prompt/session-grants.d.ts.map +1 -0
- package/dist/prompt/session-grants.js +50 -0
- package/dist/prompt/session-grants.js.map +1 -0
- package/dist/prompt/session-prompt.d.ts +3 -2
- package/dist/prompt/session-prompt.d.ts.map +1 -1
- package/dist/prompt/session-prompt.js +24 -40
- package/dist/prompt/session-prompt.js.map +1 -1
- package/dist/prompt/working-method.d.ts.map +1 -1
- package/dist/prompt/working-method.js +23 -17
- package/dist/prompt/working-method.js.map +1 -1
- package/dist/register-settings.d.ts +3 -1
- package/dist/register-settings.d.ts.map +1 -1
- package/dist/register-settings.js +5 -4
- package/dist/register-settings.js.map +1 -1
- package/dist/registry/register-connectors.d.ts +9 -0
- package/dist/registry/register-connectors.d.ts.map +1 -1
- package/dist/registry/register-connectors.js +20 -12
- package/dist/registry/register-connectors.js.map +1 -1
- package/dist/result-text.d.ts +4 -0
- package/dist/result-text.d.ts.map +1 -1
- package/dist/result-text.js +9 -0
- package/dist/result-text.js.map +1 -1
- package/dist/schemas/records.d.ts +142 -0
- package/dist/schemas/records.d.ts.map +1 -1
- package/dist/schemas/records.js +60 -2
- package/dist/schemas/records.js.map +1 -1
- package/dist/sessions/execution-root.d.ts +8 -0
- package/dist/sessions/execution-root.d.ts.map +1 -0
- package/dist/sessions/execution-root.js +25 -0
- package/dist/sessions/execution-root.js.map +1 -0
- package/dist/sessions/new-session.d.ts +5 -1
- package/dist/sessions/new-session.d.ts.map +1 -1
- package/dist/sessions/new-session.js +17 -4
- package/dist/sessions/new-session.js.map +1 -1
- package/dist/sessions/register-context.d.ts.map +1 -1
- package/dist/sessions/register-context.js +6 -5
- package/dist/sessions/register-context.js.map +1 -1
- package/dist/sessions/register-fork-export.d.ts.map +1 -1
- package/dist/sessions/register-fork-export.js +5 -3
- package/dist/sessions/register-fork-export.js.map +1 -1
- package/dist/sessions/register-lifecycle.d.ts.map +1 -1
- package/dist/sessions/register-lifecycle.js +14 -5
- package/dist/sessions/register-lifecycle.js.map +1 -1
- package/dist/sessions/register-sessions.d.ts.map +1 -1
- package/dist/sessions/register-sessions.js +0 -2
- package/dist/sessions/register-sessions.js.map +1 -1
- package/dist/sessions/session-view.d.ts +23 -0
- package/dist/sessions/session-view.d.ts.map +1 -1
- package/dist/sessions/session-view.js +4 -1
- package/dist/sessions/session-view.js.map +1 -1
- package/dist/store/all-docs.d.ts +4 -0
- package/dist/store/all-docs.d.ts.map +1 -0
- package/dist/store/all-docs.js +14 -0
- package/dist/store/all-docs.js.map +1 -0
- package/dist/store/collections.d.ts +230 -0
- package/dist/store/collections.d.ts.map +1 -1
- package/dist/store/collections.js +16 -1
- package/dist/store/collections.js.map +1 -1
- package/dist/turns/answer-fingerprint.d.ts +4 -0
- package/dist/turns/answer-fingerprint.d.ts.map +1 -0
- package/dist/turns/answer-fingerprint.js +18 -0
- package/dist/turns/answer-fingerprint.js.map +1 -0
- package/dist/turns/apply-answer.d.ts +19 -0
- package/dist/turns/apply-answer.d.ts.map +1 -0
- package/dist/turns/apply-answer.js +47 -0
- package/dist/turns/apply-answer.js.map +1 -0
- package/dist/turns/background.d.ts +3 -0
- package/dist/turns/background.d.ts.map +1 -1
- package/dist/turns/background.js +13 -12
- package/dist/turns/background.js.map +1 -1
- package/dist/turns/call-permission.d.ts +22 -0
- package/dist/turns/call-permission.d.ts.map +1 -0
- package/dist/turns/call-permission.js +49 -0
- package/dist/turns/call-permission.js.map +1 -0
- package/dist/turns/cancel-step-job.d.ts +14 -0
- package/dist/turns/cancel-step-job.d.ts.map +1 -0
- package/dist/turns/cancel-step-job.js +35 -0
- package/dist/turns/cancel-step-job.js.map +1 -0
- package/dist/turns/child-result.d.ts +7 -0
- package/dist/turns/child-result.d.ts.map +1 -0
- package/dist/turns/child-result.js +24 -0
- package/dist/turns/child-result.js.map +1 -0
- package/dist/turns/compaction.d.ts +15 -1
- package/dist/turns/compaction.d.ts.map +1 -1
- package/dist/turns/compaction.js +44 -16
- package/dist/turns/compaction.js.map +1 -1
- package/dist/turns/end-turn-state.d.ts +42 -0
- package/dist/turns/end-turn-state.d.ts.map +1 -0
- package/dist/turns/end-turn-state.js +64 -0
- package/dist/turns/end-turn-state.js.map +1 -0
- package/dist/turns/end-turn.d.ts +7 -8
- package/dist/turns/end-turn.d.ts.map +1 -1
- package/dist/turns/end-turn.js +52 -55
- package/dist/turns/end-turn.js.map +1 -1
- package/dist/turns/helper-calls.d.ts +6 -0
- package/dist/turns/helper-calls.d.ts.map +1 -0
- package/dist/turns/helper-calls.js +8 -0
- package/dist/turns/helper-calls.js.map +1 -0
- package/dist/turns/history.d.ts +3 -1
- package/dist/turns/history.d.ts.map +1 -1
- package/dist/turns/history.js +15 -7
- package/dist/turns/history.js.map +1 -1
- package/dist/turns/lost-reply.d.ts +7 -0
- package/dist/turns/lost-reply.d.ts.map +1 -1
- package/dist/turns/lost-reply.js +12 -0
- package/dist/turns/lost-reply.js.map +1 -1
- package/dist/turns/message-blocks.d.ts +2 -0
- package/dist/turns/message-blocks.d.ts.map +1 -1
- package/dist/turns/message-blocks.js +7 -0
- package/dist/turns/message-blocks.js.map +1 -1
- package/dist/turns/model-context.d.ts +2 -0
- package/dist/turns/model-context.d.ts.map +1 -1
- package/dist/turns/model-context.js +23 -4
- package/dist/turns/model-context.js.map +1 -1
- package/dist/turns/model-retry.d.ts +2 -1
- package/dist/turns/model-retry.d.ts.map +1 -1
- package/dist/turns/model-retry.js +5 -1
- package/dist/turns/model-retry.js.map +1 -1
- package/dist/turns/read-only.d.ts +6 -0
- package/dist/turns/read-only.d.ts.map +1 -0
- package/dist/turns/read-only.js +12 -0
- package/dist/turns/read-only.js.map +1 -0
- package/dist/turns/receipt-job.d.ts +5 -0
- package/dist/turns/receipt-job.d.ts.map +1 -0
- package/dist/turns/receipt-job.js +40 -0
- package/dist/turns/receipt-job.js.map +1 -0
- package/dist/turns/recover-workspace.d.ts +9 -0
- package/dist/turns/recover-workspace.d.ts.map +1 -0
- package/dist/turns/recover-workspace.js +79 -0
- package/dist/turns/recover-workspace.js.map +1 -0
- package/dist/turns/recovery-state.d.ts +19 -0
- package/dist/turns/recovery-state.d.ts.map +1 -0
- package/dist/turns/recovery-state.js +87 -0
- package/dist/turns/recovery-state.js.map +1 -0
- package/dist/turns/register-interruptions.d.ts.map +1 -1
- package/dist/turns/register-interruptions.js +19 -8
- package/dist/turns/register-interruptions.js.map +1 -1
- package/dist/turns/register-turns.d.ts.map +1 -1
- package/dist/turns/register-turns.js +42 -31
- package/dist/turns/register-turns.js.map +1 -1
- package/dist/turns/resolve.d.ts +4 -0
- package/dist/turns/resolve.d.ts.map +1 -1
- package/dist/turns/resolve.js +19 -17
- package/dist/turns/resolve.js.map +1 -1
- package/dist/turns/retry-turn.d.ts +4 -0
- package/dist/turns/retry-turn.d.ts.map +1 -0
- package/dist/turns/retry-turn.js +20 -0
- package/dist/turns/retry-turn.js.map +1 -0
- package/dist/turns/run-calls.d.ts +21 -4
- package/dist/turns/run-calls.d.ts.map +1 -1
- package/dist/turns/run-calls.js +157 -41
- package/dist/turns/run-calls.js.map +1 -1
- package/dist/turns/run-command.d.ts +5 -3
- package/dist/turns/run-command.d.ts.map +1 -1
- package/dist/turns/run-command.js +21 -12
- package/dist/turns/run-command.js.map +1 -1
- package/dist/turns/settle-calls.d.ts +2 -8
- package/dist/turns/settle-calls.d.ts.map +1 -1
- package/dist/turns/settle-calls.js +26 -35
- package/dist/turns/settle-calls.js.map +1 -1
- package/dist/turns/start-turn.d.ts +8 -83
- package/dist/turns/start-turn.d.ts.map +1 -1
- package/dist/turns/start-turn.js +35 -24
- package/dist/turns/start-turn.js.map +1 -1
- package/dist/turns/step-claim.d.ts +39 -0
- package/dist/turns/step-claim.d.ts.map +1 -0
- package/dist/turns/step-claim.js +72 -0
- package/dist/turns/step-claim.js.map +1 -0
- package/dist/turns/step-intents.d.ts +31 -0
- package/dist/turns/step-intents.d.ts.map +1 -0
- package/dist/turns/step-intents.js +101 -0
- package/dist/turns/step-intents.js.map +1 -0
- package/dist/turns/step-next.d.ts +17 -0
- package/dist/turns/step-next.d.ts.map +1 -0
- package/dist/turns/step-next.js +25 -0
- package/dist/turns/step-next.js.map +1 -0
- package/dist/turns/step.d.ts +1 -1
- package/dist/turns/step.d.ts.map +1 -1
- package/dist/turns/step.js +108 -88
- package/dist/turns/step.js.map +1 -1
- package/dist/turns/summary-facts.d.ts +25 -0
- package/dist/turns/summary-facts.d.ts.map +1 -0
- package/dist/turns/summary-facts.js +63 -0
- package/dist/turns/summary-facts.js.map +1 -0
- package/dist/turns/usage.d.ts +7 -0
- package/dist/turns/usage.d.ts.map +1 -0
- package/dist/turns/usage.js +18 -0
- package/dist/turns/usage.js.map +1 -0
- package/dist/ui/register-ui.js +3 -3
- package/dist/ui/register-ui.js.map +1 -1
- package/dist/web/components/approval.css +2 -0
- package/dist/web/components/approval.js +233 -0
- package/dist/web/components/call.css +1 -1
- package/dist/web/components/call.js +430 -304
- package/dist/web/components/connectors.css +1 -1
- package/dist/web/components/connectors.js +595 -592
- package/dist/web/components/conversation.css +1 -1
- package/dist/web/components/conversation.js +2978 -1637
- package/dist/web/components/mcp-sign-in.css +1 -1
- package/dist/web/components/model.css +1 -1
- package/dist/web/components/model.js +138 -134
- package/dist/web/components/question.css +1 -1
- package/dist/web/components/question.js +148 -78
- package/dist/web/components/sessions.css +1 -1
- package/docs/connectors.md +3 -3
- package/locales/ar.json +95 -13
- package/locales/en.json +95 -13
- package/package.json +6 -6
- package/dist/turns/cancel-turn.d.ts +0 -3
- package/dist/turns/cancel-turn.d.ts.map +0 -1
- package/dist/turns/cancel-turn.js +0 -31
- package/dist/turns/cancel-turn.js.map +0 -1
package/dist/turns/background.js
CHANGED
|
@@ -8,19 +8,20 @@ import { beginTurn, openTurn } from "./start-turn.js";
|
|
|
8
8
|
export function backgroundText(call, ref, result) {
|
|
9
9
|
return `The background call \`${call}\` (job ${ref}) finished:\n${result}`;
|
|
10
10
|
}
|
|
11
|
+
/** Appends or queues the result in the caller's transaction; gives the turn it opened, for the caller to begin after its commit. */
|
|
12
|
+
export function appendBackgroundInTx(store, sessionId, source, text, startTurn) {
|
|
13
|
+
const session = store.sessions.get(sessionId);
|
|
14
|
+
if (session === undefined)
|
|
15
|
+
return undefined;
|
|
16
|
+
if (session.status !== 'idle') {
|
|
17
|
+
store.queued.insert({ sessionId, source, text, fileIds: null, fileNames: null, createdAt: now() });
|
|
18
|
+
return undefined;
|
|
19
|
+
}
|
|
20
|
+
appendMessage(store, session, { kind: 'user', content: userContent(text), source });
|
|
21
|
+
return startTurn ? openTurn(store, session) : undefined;
|
|
22
|
+
}
|
|
11
23
|
export async function appendBackground(ctx, sessionId, source, text, startTurn) {
|
|
12
|
-
const turnId = await ctx.store.transaction((tx) =>
|
|
13
|
-
const store = txRecords(tx);
|
|
14
|
-
const session = store.sessions.get(sessionId);
|
|
15
|
-
if (session === undefined)
|
|
16
|
-
return undefined;
|
|
17
|
-
if (session.status !== 'idle') {
|
|
18
|
-
store.queued.insert({ sessionId, source, text, fileIds: null, fileNames: null, createdAt: now() });
|
|
19
|
-
return undefined;
|
|
20
|
-
}
|
|
21
|
-
appendMessage(store, session, { kind: 'user', content: userContent(text), source });
|
|
22
|
-
return startTurn ? openTurn(store, session) : undefined;
|
|
23
|
-
});
|
|
24
|
+
const turnId = await ctx.store.transaction((tx) => appendBackgroundInTx(txRecords(tx), sessionId, source, text, startTurn));
|
|
24
25
|
if (turnId !== undefined)
|
|
25
26
|
await beginTurn(ctx, sessionId, turnId, true);
|
|
26
27
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"background.js","sourceRoot":"","sources":["../../src/turns/background.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,GAAG,EAAE,MAAM,+BAA+B,CAAC;AACpD,OAAO,EAAE,SAAS,
|
|
1
|
+
{"version":3,"file":"background.js","sourceRoot":"","sources":["../../src/turns/background.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,GAAG,EAAE,MAAM,+BAA+B,CAAC;AACpD,OAAO,EAAE,SAAS,EAAkB,MAAM,yBAAyB,CAAC;AACpE,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAEtD,qHAAqH;AACrH,2GAA2G;AAE3G,2DAA2D;AAC3D,MAAM,UAAU,cAAc,CAAC,IAAY,EAAE,GAAW,EAAE,MAAc;IACtE,OAAO,yBAAyB,IAAI,WAAW,GAAG,gBAAgB,MAAM,EAAE,CAAC;AAC7E,CAAC;AAED,oIAAoI;AACpI,MAAM,UAAU,oBAAoB,CAAC,KAAgB,EAAE,SAAiB,EAAE,MAAc,EAAE,IAAY,EAAE,SAAkB;IACxH,MAAM,OAAO,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAC9C,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC5C,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;QAC9B,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;QACnG,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;IACpF,OAAO,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAC1D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,GAAQ,EAAE,SAAiB,EAAE,MAAc,EAAE,IAAY,EAAE,SAAkB;IAClH,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,oBAAoB,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC;IAC5H,IAAI,MAAM,KAAK,SAAS;QAAE,MAAM,SAAS,CAAC,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;AAC1E,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { type Ctx } from '@kvman/sdk';
|
|
2
|
+
import type { RunCall } from '../calls/run-tool.ts';
|
|
3
|
+
import { type SessionGrants } from '../prompt/session-grants.ts';
|
|
4
|
+
import type { HeldResult } from '../schemas/records.ts';
|
|
5
|
+
import { type CommandTarget } from './run-command.ts';
|
|
6
|
+
import type { StepLease } from './step-claim.ts';
|
|
7
|
+
type Refusal = {
|
|
8
|
+
code: 'VALIDATION_FAILED' | 'NOT_FOUND';
|
|
9
|
+
message: string;
|
|
10
|
+
};
|
|
11
|
+
type Permission = {
|
|
12
|
+
grants: SessionGrants;
|
|
13
|
+
target: CommandTarget | undefined;
|
|
14
|
+
} | {
|
|
15
|
+
error: Refusal;
|
|
16
|
+
};
|
|
17
|
+
/** No external preparation remains after this transaction's authority/scope/registry decision. */
|
|
18
|
+
export declare function callPermission(ctx: Ctx, lease: StepLease, call: RunCall, held?: HeldResult): Promise<Permission>;
|
|
19
|
+
/** A queued/resumed dispatch cannot reuse a revoked grant, obsolete lease or changed immediate target. */
|
|
20
|
+
export declare function dispatchGuard(ctx: Ctx, lease: StepLease, call: RunCall, expected?: CommandTarget, held?: HeldResult): () => Promise<void>;
|
|
21
|
+
export {};
|
|
22
|
+
//# sourceMappingURL=call-permission.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"call-permission.d.ts","sourceRoot":"","sources":["../../src/turns/call-permission.ts"],"names":[],"mappings":"AACA,OAAO,EAAgB,KAAK,GAAG,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAEpD,OAAO,EAA6B,KAAK,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5F,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAExD,OAAO,EAA4B,KAAK,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAChF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAGjD,KAAK,OAAO,GAAG;IAAE,IAAI,EAAE,mBAAmB,GAAG,WAAW,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAC5E,KAAK,UAAU,GAAG;IAAE,MAAM,EAAE,aAAa,CAAC;IAAC,MAAM,EAAE,aAAa,GAAG,SAAS,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,OAAO,CAAA;CAAE,CAAC;AASpG,kGAAkG;AAClG,wBAAsB,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAgBtH;AAED,0GAA0G;AAC1G,wBAAgB,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,aAAa,EAAE,IAAI,CAAC,EAAE,UAAU,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAMzI"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { isDeepStrictEqual } from 'node:util';
|
|
2
|
+
import { ProblemError } from '@kvman/sdk';
|
|
3
|
+
import { builtinConnectors, noCommandMessage, noConnectorMessage } from "../connector-call.js";
|
|
4
|
+
import { grantsInTx, prepareGrants } from "../prompt/session-grants.js";
|
|
5
|
+
import { txRecords } from "../store/collections.js";
|
|
6
|
+
import { commandNamesOf, targetOf } from "./run-command.js";
|
|
7
|
+
import { liveStep } from "./step-intents.js";
|
|
8
|
+
const stale = () => ({ error: { code: 'VALIDATION_FAILED', message: 'The originating step or approved call is no longer current.' } });
|
|
9
|
+
function unavailable(grants, connector) {
|
|
10
|
+
const known = builtinConnectors.some(name => name === connector) || grants.connectors.some(candidate => candidate.name === connector);
|
|
11
|
+
if (known && !grants.disabled.has(connector) && grants.session.parentId !== null)
|
|
12
|
+
return `${connector} isn't available in this subagent.`;
|
|
13
|
+
return noConnectorMessage(connector, grants.names);
|
|
14
|
+
}
|
|
15
|
+
/** No external preparation remains after this transaction's authority/scope/registry decision. */
|
|
16
|
+
export async function callPermission(ctx, lease, call, held) {
|
|
17
|
+
ctx.job.signal.throwIfAborted();
|
|
18
|
+
if (ctx.job.id !== lease.jobId)
|
|
19
|
+
return stale();
|
|
20
|
+
const prepared = await prepareGrants(ctx);
|
|
21
|
+
return ctx.store.transaction(tx => {
|
|
22
|
+
ctx.job.signal.throwIfAborted();
|
|
23
|
+
const store = txRecords(tx), live = liveStep(store, lease, ctx.job.id);
|
|
24
|
+
if (live === undefined)
|
|
25
|
+
return stale();
|
|
26
|
+
if (held !== undefined && (live.turn.pending.length !== 0 || live.turn.calls.filter(row => row.toolCallId === held.toolCallId && row.toolName === 'run').length !== 1 || live.turn.results.filter(row => row.toolCallId === held.toolCallId).length !== 1 || !live.turn.results.some(row => isDeepStrictEqual(row, held))))
|
|
27
|
+
return stale();
|
|
28
|
+
const grants = grantsInTx(store, live.session, prepared);
|
|
29
|
+
if (grants === undefined)
|
|
30
|
+
return { error: { code: 'VALIDATION_FAILED', message: 'The session ancestry is no longer available.' } };
|
|
31
|
+
if (!grants.names.includes(call.connector))
|
|
32
|
+
return { error: { code: 'VALIDATION_FAILED', message: unavailable(grants, call.connector) } };
|
|
33
|
+
const target = call.command === 'help' ? undefined : targetOf(grants.connectors, call);
|
|
34
|
+
if (target === undefined && call.command !== 'help')
|
|
35
|
+
return { error: { code: 'NOT_FOUND', message: noCommandMessage(call.connector, call.command, commandNamesOf(grants.connectors, call.connector)) } };
|
|
36
|
+
return { grants, target };
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
/** A queued/resumed dispatch cannot reuse a revoked grant, obsolete lease or changed immediate target. */
|
|
40
|
+
export function dispatchGuard(ctx, lease, call, expected, held) {
|
|
41
|
+
return async () => {
|
|
42
|
+
const checked = await callPermission(ctx, lease, call, held);
|
|
43
|
+
if ('error' in checked)
|
|
44
|
+
throw new ProblemError({ ...checked.error, params: {} });
|
|
45
|
+
if (checked.target?.registration !== expected?.registration || checked.target?.asks !== expected?.asks)
|
|
46
|
+
throw new ProblemError({ code: 'VALIDATION_FAILED', message: 'The connector command changed before execution. Make this call again.', params: {} });
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=call-permission.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"call-permission.js","sourceRoot":"","sources":["../../src/turns/call-permission.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { type Ctx, type Job } from '@kvman/sdk';
|
|
2
|
+
import type { EndedTurn } from './end-turn-state.ts';
|
|
3
|
+
import type { StepIdentity } from './step-intents.ts';
|
|
4
|
+
export type StepOwner = {
|
|
5
|
+
sessionId: string;
|
|
6
|
+
turnId: string;
|
|
7
|
+
jobId: string | null;
|
|
8
|
+
identity: StepIdentity | undefined;
|
|
9
|
+
};
|
|
10
|
+
/** Stopping owned work is not a replay permit; attempts/status cannot replace its immutable binding. */
|
|
11
|
+
export declare function ownsStepJob(job: Job, workspaceId: string, expected: StepOwner): boolean;
|
|
12
|
+
/** Verify AFTER terminal ownership capture; never trust a saved legacy or malformed pointer alone. */
|
|
13
|
+
export declare function cancelStepJob(ctx: Ctx, ended: EndedTurn): Promise<void>;
|
|
14
|
+
//# sourceMappingURL=cancel-step-job.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cancel-step-job.d.ts","sourceRoot":"","sources":["../../src/turns/cancel-step-job.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,GAAG,EAAE,KAAK,GAAG,EAAE,MAAM,YAAY,CAAC;AAC9D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAErD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtD,MAAM,MAAM,SAAS,GAAG;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,QAAQ,EAAE,YAAY,GAAG,SAAS,CAAA;CAAE,CAAC;AAExH,wGAAwG;AACxG,wBAAgB,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,GAAG,OAAO,CAOvF;AAED,sGAAsG;AACtG,wBAAsB,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAa7E"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { ProblemError } from '@kvman/sdk';
|
|
2
|
+
import { stepInputSchema } from "./step-claim.js";
|
|
3
|
+
/** Stopping owned work is not a replay permit; attempts/status cannot replace its immutable binding. */
|
|
4
|
+
export function ownsStepJob(job, workspaceId, expected) {
|
|
5
|
+
if (job.id !== expected.jobId || job.name !== 'kvcoder.turn.step' || job.workspaceId !== workspaceId)
|
|
6
|
+
return false;
|
|
7
|
+
const input = stepInputSchema.safeParse(job.input);
|
|
8
|
+
if (!input.success || input.data.sessionId !== expected.sessionId || input.data.turnId !== expected.turnId)
|
|
9
|
+
return false;
|
|
10
|
+
if (!('intentId' in input.data))
|
|
11
|
+
return true;
|
|
12
|
+
const identity = expected.identity;
|
|
13
|
+
return identity !== undefined && identity.sessionId === expected.sessionId && identity.turnId === expected.turnId && input.data.intentId === identity.intentId && input.data.generation === identity.generation;
|
|
14
|
+
}
|
|
15
|
+
/** Verify AFTER terminal ownership capture; never trust a saved legacy or malformed pointer alone. */
|
|
16
|
+
export async function cancelStepJob(ctx, ended) {
|
|
17
|
+
if (ended.stepJobId === null)
|
|
18
|
+
return;
|
|
19
|
+
let job;
|
|
20
|
+
try {
|
|
21
|
+
job = await ctx.exec('kernel.jobs.get', { id: ended.stepJobId });
|
|
22
|
+
}
|
|
23
|
+
catch (error) {
|
|
24
|
+
ctx.job.signal.throwIfAborted();
|
|
25
|
+
if (error instanceof ProblemError && error.problem.code === 'NOT_FOUND')
|
|
26
|
+
return;
|
|
27
|
+
throw error;
|
|
28
|
+
}
|
|
29
|
+
ctx.job.signal.throwIfAborted();
|
|
30
|
+
if (ownsStepJob(job, ctx.job.workspace.id, { sessionId: ended.session.id, turnId: ended.turnId, jobId: ended.stepJobId, identity: ended.stepIdentity }))
|
|
31
|
+
await ctx.cancel(job.id);
|
|
32
|
+
else
|
|
33
|
+
ctx.log.warn('A saved step job was not cancelled because ownership could not be verified.', { code: 'STEP_OWNERSHIP_UNCONFIRMED' });
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=cancel-step-job.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cancel-step-job.js","sourceRoot":"","sources":["../../src/turns/cancel-step-job.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAsB,MAAM,YAAY,CAAC;AAE9D,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAKlD,wGAAwG;AACxG,MAAM,UAAU,WAAW,CAAC,GAAQ,EAAE,WAAmB,EAAE,QAAmB;IAC5E,IAAI,GAAG,CAAC,EAAE,KAAK,QAAQ,CAAC,KAAK,IAAI,GAAG,CAAC,IAAI,KAAK,mBAAmB,IAAI,GAAG,CAAC,WAAW,KAAK,WAAW;QAAE,OAAO,KAAK,CAAC;IACnH,MAAM,KAAK,GAAG,eAAe,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACnD,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,IAAI,CAAC,SAAS,KAAK,QAAQ,CAAC,SAAS,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IACzH,IAAI,CAAC,CAAC,UAAU,IAAI,KAAK,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAC7C,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC;IACnC,OAAO,QAAQ,KAAK,SAAS,IAAI,QAAQ,CAAC,SAAS,KAAK,QAAQ,CAAC,SAAS,IAAI,QAAQ,CAAC,MAAM,KAAK,QAAQ,CAAC,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,KAAK,QAAQ,CAAC,QAAQ,IAAI,KAAK,CAAC,IAAI,CAAC,UAAU,KAAK,QAAQ,CAAC,UAAU,CAAC;AAClN,CAAC;AAED,sGAAsG;AACtG,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,GAAQ,EAAE,KAAgB;IAC5D,IAAI,KAAK,CAAC,SAAS,KAAK,IAAI;QAAE,OAAO;IACrC,IAAI,GAAQ,CAAC;IACb,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC;IACnE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;QAChC,IAAI,KAAK,YAAY,YAAY,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,WAAW;YAAE,OAAO;QAChF,MAAM,KAAK,CAAC;IACd,CAAC;IACD,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;IAChC,IAAI,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,SAAS,EAAE,QAAQ,EAAE,KAAK,CAAC,YAAY,EAAE,CAAC;QAAE,MAAM,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;;QAC7K,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,6EAA6E,EAAE,EAAE,IAAI,EAAE,4BAA4B,EAAE,CAAC,CAAC;AAC3I,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { Outcome } from '../schemas/records.ts';
|
|
2
|
+
import type { TxRecords } from '../store/collections.ts';
|
|
3
|
+
export declare function childResultInTx(store: TxRecords, childId: string, outcome: Outcome): {
|
|
4
|
+
text: string;
|
|
5
|
+
isError: boolean;
|
|
6
|
+
};
|
|
7
|
+
//# sourceMappingURL=child-result.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"child-result.d.ts","sourceRoot":"","sources":["../../src/turns/child-result.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAezD,wBAAgB,eAAe,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAQvH"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { z } from '@kvman/sdk';
|
|
2
|
+
import { truncate } from "../result-text.js";
|
|
3
|
+
import { textOf } from "./model-context.js";
|
|
4
|
+
// What a finished subagent returns (ADR 0009, 102): its answer, or how and why it stopped (ADR 0050, 4). It reads
|
|
5
|
+
// inside a transaction, so the one that ends a child's turn can also deliver its result (ADR 0052, 2).
|
|
6
|
+
const noticeParamsSchema = z.object({ code: z.string(), details: z.object({ reason: z.string().exactOptional() }).exactOptional() });
|
|
7
|
+
// Why a child stopped, from the notice that ended it: the failure's code, and the provider's reason when it has one.
|
|
8
|
+
function stoppedBy(store, childId) {
|
|
9
|
+
const [last] = store.messages.find({ sessionId: childId }, { limit: 1, order: 'desc' });
|
|
10
|
+
const params = last?.kind === 'notice' ? noticeParamsSchema.safeParse(last.content['params']) : undefined;
|
|
11
|
+
return params?.success === true ? { code: params.data.code, reason: params.data.details?.reason } : undefined;
|
|
12
|
+
}
|
|
13
|
+
export function childResultInTx(store, childId, outcome) {
|
|
14
|
+
const [last] = store.messages.find({ sessionId: childId, kind: 'assistant' }, { limit: 1, order: 'desc' });
|
|
15
|
+
const answer = last === undefined ? '' : textOf(last.content['content']);
|
|
16
|
+
if (outcome === 'done')
|
|
17
|
+
return { text: truncate(answer), isError: false };
|
|
18
|
+
const why = stoppedBy(store, childId);
|
|
19
|
+
const lines = [`subagent ended ${outcome}${why === undefined ? '' : `: ${why.code}`}`, ...(why?.reason === undefined ? [] : [why.reason])];
|
|
20
|
+
if (answer !== '')
|
|
21
|
+
lines.push('', 'Its last message before it stopped (unfinished, not a result):', answer);
|
|
22
|
+
return { text: truncate(lines.join('\n')), isError: true };
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=child-result.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"child-result.js","sourceRoot":"","sources":["../../src/turns/child-result.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,YAAY,CAAC;AAC/B,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAG7C,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,kHAAkH;AAClH,uGAAuG;AAEvG,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;AAErI,qHAAqH;AACrH,SAAS,SAAS,CAAC,KAAgB,EAAE,OAAe;IAClD,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IACxF,MAAM,MAAM,GAAG,IAAI,EAAE,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,kBAAkB,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC1G,OAAO,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;AAChH,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAgB,EAAE,OAAe,EAAE,OAAgB;IACjF,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IAC3G,MAAM,MAAM,GAAG,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;IACzE,IAAI,OAAO,KAAK,MAAM;QAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAC1E,MAAM,GAAG,GAAG,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACtC,MAAM,KAAK,GAAG,CAAC,kBAAkB,OAAO,GAAG,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,IAAI,EAAE,EAAE,EAAE,GAAG,CAAC,GAAG,EAAE,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAC3I,IAAI,MAAM,KAAK,EAAE;QAAE,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,gEAAgE,EAAE,MAAM,CAAC,CAAC;IAC5G,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAC7D,CAAC"}
|
|
@@ -1,7 +1,20 @@
|
|
|
1
1
|
import { type Ctx, type Stored } from '@kvman/sdk';
|
|
2
2
|
import type { SessionDoc } from '../schemas/records.ts';
|
|
3
|
+
import { type StepLease } from './step-claim.ts';
|
|
3
4
|
import { type History } from './model-context.ts';
|
|
4
|
-
|
|
5
|
+
/** What a summary is asked for (ADR 0066, 1): the headings the next run needs, and not the lists kvman adds itself. */
|
|
6
|
+
export declare const summaryInstruction = "Summarize the conversation above for the agent that continues it, so that it can go on without reading anything again. Use these headings, and leave one out when it has nothing. Request: what the person asked for, and every standing instruction they gave. State now: what exists and works, what was verified and how. Next step: the exact thing to do next. Decisions: each one with its reason. Files: each path that matters, what is in it and what you changed, with the names and lines the next steps need. Commands that work: the exact lines to build, test, and run. What failed: what was tried and why it did not work. Waiting on: questions, approvals, and runs that are not finished. Keep names, paths, and numbers exact. Write at most 1,500 words: fold an earlier summary into this one instead of repeating it, and leave out what the files themselves record. kvman adds the person's own messages, the execution map, the files changed, the background runs, and the artifacts itself, so don't list those. This instruction comes from kvman, not from the person: don't record it in the summary as a request or a direction. Reply with the summary only, and call no tool.";
|
|
7
|
+
/** What a provider's count was measured with: the system prompt and the tool names of the call (ADR 0058, 2). */
|
|
8
|
+
export declare const promptBasis: (prompt: string, tools: readonly string[]) => string;
|
|
9
|
+
/** The model and the basis the next call would be made with. */
|
|
10
|
+
export type Measured = {
|
|
11
|
+
model: string | null;
|
|
12
|
+
basis: string;
|
|
13
|
+
};
|
|
14
|
+
export declare function promptTokens(prompt: string, history: History, now: Measured): {
|
|
15
|
+
tokens: number;
|
|
16
|
+
estimated: boolean;
|
|
17
|
+
};
|
|
5
18
|
/** `prompt` and `tools` are the step's own: its system prompt and the connectors its `run` tool names. */
|
|
6
19
|
export type CompactOptions = {
|
|
7
20
|
force: boolean;
|
|
@@ -10,6 +23,7 @@ export type CompactOptions = {
|
|
|
10
23
|
prompt: string;
|
|
11
24
|
tools: readonly string[];
|
|
12
25
|
turnId: string | null;
|
|
26
|
+
lease?: StepLease;
|
|
13
27
|
};
|
|
14
28
|
/** Summarizes the session's older messages when they pass the threshold, or with `force` whatever the threshold; says whether a summary was stored. */
|
|
15
29
|
export declare function compact(ctx: Ctx, session: Stored<SessionDoc>, options: CompactOptions): Promise<boolean>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compaction.d.ts","sourceRoot":"","sources":["../../src/turns/compaction.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"compaction.d.ts","sourceRoot":"","sources":["../../src/turns/compaction.ts"],"names":[],"mappings":"AAEA,OAAO,EAAgB,KAAK,GAAG,EAAE,KAAK,MAAM,EAAE,MAAM,YAAY,CAAC;AAEjE,OAAO,KAAK,EAAc,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAGpE,OAAO,EAAe,KAAK,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAK9D,OAAO,EAAmD,KAAK,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAcnG,uHAAuH;AACvH,eAAO,MAAM,kBAAkB,qpCACqnC,CAAC;AAOrpC,iHAAiH;AACjH,eAAO,MAAM,WAAW,GAAI,QAAQ,MAAM,EAAE,OAAO,SAAS,MAAM,EAAE,KAAG,MAAoF,CAAC;AAE5J,gEAAgE;AAChE,MAAM,MAAM,QAAQ,GAAG;IAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAK/D,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,CAOpH;AAED,0GAA0G;AAC1G,MAAM,MAAM,cAAc,GAAG;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,KAAK,CAAC,EAAE,SAAS,CAAA;CAAE,CAAC;AAYrK,uJAAuJ;AACvJ,wBAAsB,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,CAAC,UAAU,CAAC,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,CA+B9G"}
|
package/dist/turns/compaction.js
CHANGED
|
@@ -1,42 +1,58 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { addCallUsage } from "./usage.js";
|
|
1
3
|
import { ProblemError } from '@kvman/sdk';
|
|
2
4
|
import { runTool } from "../calls/run-tool.js";
|
|
3
5
|
import { txRecords } from "../store/collections.js";
|
|
6
|
+
import { currentStep } from "./step-claim.js";
|
|
7
|
+
import { liveStep } from "./step-intents.js";
|
|
4
8
|
import { olderCount } from "./call-groups.js";
|
|
5
9
|
import { appendMessage, appendNotice } from "./history.js";
|
|
6
10
|
import { modelInfo } from "./model-info.js";
|
|
7
|
-
import { modelMessages, sentHistory, textOf } from "./model-context.js";
|
|
11
|
+
import { modelMessages, sentHistory, summaryText, textOf } from "./model-context.js";
|
|
8
12
|
import { sentCharacters } from "./sent-size.js";
|
|
13
|
+
import { personMessages, storedPerson, summaryFacts } from "./summary-facts.js";
|
|
9
14
|
// Compaction (plan 08 §8.1): above `kvcoder.compactAt` of the model's window, by the provider's own count, kvai summarizes the
|
|
10
15
|
// older messages, the last `kvcoder.compactKeep` stay whole (ADR 0020, 1) with the reply whose results they start at
|
|
11
16
|
// (ADR 0036, 16), and a summary message is stored. The request
|
|
12
17
|
// is a step's own, with the instruction as its last message, so the older messages are read from the provider's cache
|
|
13
18
|
// (ADR 0032, 2). A step marks it in its stream with `compaction` chunks (ADR 0009, 99); a failed summary, or one with
|
|
14
|
-
// no text, adds a notice and the step goes on. Older messages smaller than a tenth of the model's window aren't
|
|
19
|
+
// no text, adds a notice and the step goes on. kvman adds what it knows for certain to a stored summary (ADR 0066). Older messages smaller than a tenth of the model's window aren't
|
|
15
20
|
// summarized, so a full chat isn't summarized again on every step (ADR 0019, 7).
|
|
16
21
|
const minimumShare = 0.1;
|
|
17
|
-
|
|
22
|
+
/** What a summary is asked for (ADR 0066, 1): the headings the next run needs, and not the lists kvman adds itself. */
|
|
23
|
+
export const summaryInstruction = "Summarize the conversation above for the agent that continues it, so that it can go on without reading anything again. Use these headings, and leave one out when it has nothing. Request: what the person asked for, and every standing instruction they gave. State now: what exists and works, what was verified and how. Next step: the exact thing to do next. Decisions: each one with its reason. Files: each path that matters, what is in it and what you changed, with the names and lines the next steps need. Commands that work: the exact lines to build, test, and run. What failed: what was tried and why it did not work. Waiting on: questions, approvals, and runs that are not finished. Keep names, paths, and numbers exact. Write at most 1,500 words: fold an earlier summary into this one instead of repeating it, and leave out what the files themselves record. kvman adds the person's own messages, the execution map, the files changed, the background runs, and the artifacts itself, so don't list those. This instruction comes from kvman, not from the person: don't record it in the summary as a request or a direction. Reply with the summary only, and call no tool.";
|
|
18
24
|
const sentTokens = (messages) => messages.reduce((total, message) => total + sentCharacters(message), 0) / 4;
|
|
19
25
|
// The whole prompt of a model call, as its provider counted it; 0 when the provider reported none.
|
|
20
26
|
const reportedPrompt = (message) => (message.usage === null ? 0 : message.usage.input + message.usage.cacheRead + message.usage.cacheWrite);
|
|
27
|
+
/** What a provider's count was measured with: the system prompt and the tool names of the call (ADR 0058, 2). */
|
|
28
|
+
export const promptBasis = (prompt, tools) => createHash('sha256').update(JSON.stringify([prompt, tools])).digest('hex');
|
|
21
29
|
// The prompt's size in tokens (ADR 0033, 4 and 5): the provider's count at the chat's last call, with what was added
|
|
22
|
-
// since. A call from before the latest summary held the messages the summary replaced, so it doesn't count
|
|
23
|
-
|
|
30
|
+
// since. A call from before the latest summary held the messages the summary replaced, so it doesn't count, and
|
|
31
|
+
// neither does one made with another model, prompt, or tool set: the size is then an estimate from the text.
|
|
32
|
+
export function promptTokens(prompt, history, now) {
|
|
24
33
|
const summarizedAt = history.summary?.seq ?? -1;
|
|
25
34
|
const index = history.messages.findLastIndex((message) => message.seq > summarizedAt && reportedPrompt(message) > 0);
|
|
26
35
|
const counted = history.messages[index];
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
36
|
+
const same = counted !== undefined && counted.basis === now.basis && (now.model === null || counted.model === now.model);
|
|
37
|
+
if (counted === undefined || !same)
|
|
38
|
+
return { tokens: (prompt.length + summaryText(history.summary).length) / 4 + sentTokens(history.messages), estimated: true };
|
|
39
|
+
return { tokens: reportedPrompt(counted) + (counted.usage?.output ?? 0) + sentTokens(history.messages.slice(index + 1)), estimated: false };
|
|
30
40
|
}
|
|
31
|
-
async function summaryFailed(ctx, session, code,
|
|
32
|
-
await ctx.store.transaction(
|
|
41
|
+
async function summaryFailed(ctx, session, code, options) {
|
|
42
|
+
await ctx.store.transaction(tx => {
|
|
43
|
+
ctx.job.signal.throwIfAborted();
|
|
44
|
+
const store = txRecords(tx);
|
|
45
|
+
const current = options.lease === undefined ? session : liveStep(store, options.lease, options.lease.jobId)?.session;
|
|
46
|
+
if (current !== undefined)
|
|
47
|
+
appendNotice(store, current, 'SUMMARY_FAILED', { code }, options.turnId);
|
|
48
|
+
});
|
|
33
49
|
return false;
|
|
34
50
|
}
|
|
35
51
|
/** Summarizes the session's older messages when they pass the threshold, or with `force` whatever the threshold; says whether a summary was stored. */
|
|
36
52
|
export async function compact(ctx, session, options) {
|
|
37
53
|
const history = await sentHistory(ctx, session.id, session.nextSeq);
|
|
38
54
|
const info = await modelInfo(ctx, session.model);
|
|
39
|
-
if (!options.force && (info === undefined || promptTokens(options.prompt, history) <= info.contextWindow * options.compactAt))
|
|
55
|
+
if (!options.force && (info === undefined || promptTokens(options.prompt, history, { model: session.model, basis: promptBasis(options.prompt, options.tools) }).tokens <= info.contextWindow * options.compactAt))
|
|
40
56
|
return false;
|
|
41
57
|
const older = history.messages.slice(0, olderCount(history.messages, options.keep));
|
|
42
58
|
const last = older.at(-1);
|
|
@@ -44,18 +60,30 @@ export async function compact(ctx, session, options) {
|
|
|
44
60
|
return false;
|
|
45
61
|
ctx.job.progress({ type: 'compaction', state: 'started' });
|
|
46
62
|
try {
|
|
47
|
-
const messages = [...(await modelMessages(ctx, { summary: history.summary, messages: older })), { role: 'user', content:
|
|
63
|
+
const messages = [...(await modelMessages(ctx, { summary: history.summary, messages: older })), { role: 'user', content: summaryInstruction, timestamp: Date.now() }];
|
|
64
|
+
if (options.lease !== undefined && await currentStep(ctx, options.lease) === undefined)
|
|
65
|
+
return false;
|
|
48
66
|
const answer = await ctx.exec('kvai.complete', { ...(session.model === null ? {} : { model: session.model }), sessionId: session.id, systemPrompt: options.prompt, messages, tools: [runTool(options.tools)], thinking: session.thinking });
|
|
49
67
|
const text = textOf(answer.message.content);
|
|
50
68
|
if (text.trim() === '')
|
|
51
|
-
return await summaryFailed(ctx, session, 'kvcoder/SUMMARY_EMPTY', options
|
|
52
|
-
|
|
53
|
-
|
|
69
|
+
return await summaryFailed(ctx, session, 'kvcoder/SUMMARY_EMPTY', options);
|
|
70
|
+
const person = personMessages(storedPerson(history.summary), older);
|
|
71
|
+
const facts = await summaryFacts(ctx, session, person);
|
|
72
|
+
return await ctx.store.transaction(tx => {
|
|
73
|
+
ctx.job.signal.throwIfAborted();
|
|
74
|
+
const store = txRecords(tx);
|
|
75
|
+
const current = options.lease === undefined ? session : liveStep(store, options.lease, options.lease.jobId)?.session;
|
|
76
|
+
if (current === undefined)
|
|
77
|
+
return false;
|
|
78
|
+
appendMessage(store, current, { kind: 'summary', content: { text, coversThroughSeq: last.seq, ...(facts === undefined ? {} : { facts }), ...(person.kept.length === 0 ? {} : { person: person.kept }) }, turnId: options.turnId });
|
|
79
|
+
addCallUsage(store, current, options.turnId, answer.usage, 'summary');
|
|
80
|
+
return true;
|
|
81
|
+
});
|
|
54
82
|
}
|
|
55
83
|
catch (error) {
|
|
56
84
|
if (!(error instanceof ProblemError) || ctx.job.signal.aborted)
|
|
57
85
|
throw error;
|
|
58
|
-
return await summaryFailed(ctx, session, error.problem.code, options
|
|
86
|
+
return await summaryFailed(ctx, session, error.problem.code, options);
|
|
59
87
|
}
|
|
60
88
|
finally {
|
|
61
89
|
ctx.job.progress({ type: 'compaction', state: 'done' });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compaction.js","sourceRoot":"","sources":["../../src/turns/compaction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAyB,MAAM,YAAY,CAAC;AAGjE,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,EAAgB,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"compaction.js","sourceRoot":"","sources":["../../src/turns/compaction.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { Stored } from '@kvman/sdk';
|
|
2
|
+
import type { JsonValue } from '../connector-call.ts';
|
|
3
|
+
import type { Outcome, SessionDoc, Usage } from '../schemas/records.ts';
|
|
4
|
+
import type { TxRecords } from '../store/collections.ts';
|
|
5
|
+
import type { StepLease } from './step-claim.ts';
|
|
6
|
+
import { type StepIdentity } from './step-intents.ts';
|
|
7
|
+
export type EndedBy = 'step' | 'handler' | 'cancel';
|
|
8
|
+
export type Notice = {
|
|
9
|
+
code: string;
|
|
10
|
+
params?: Record<string, JsonValue>;
|
|
11
|
+
};
|
|
12
|
+
export type EndAuthority = StepLease | {
|
|
13
|
+
jobId: string;
|
|
14
|
+
};
|
|
15
|
+
/** What a child's end gave its parent in the same transaction, for the caller to act on after the commit (ADR 0052, 2). */
|
|
16
|
+
export type Delivery = {
|
|
17
|
+
step: StepIdentity;
|
|
18
|
+
} | {
|
|
19
|
+
turn: {
|
|
20
|
+
sessionId: string;
|
|
21
|
+
turnId: string;
|
|
22
|
+
};
|
|
23
|
+
} | {
|
|
24
|
+
ended: EndedTurn;
|
|
25
|
+
};
|
|
26
|
+
export type EndedTurn = {
|
|
27
|
+
session: Stored<SessionDoc>;
|
|
28
|
+
turnId: string;
|
|
29
|
+
outcome: Outcome;
|
|
30
|
+
by: EndedBy;
|
|
31
|
+
notice: Notice | undefined;
|
|
32
|
+
usage: Usage;
|
|
33
|
+
durationMs: number;
|
|
34
|
+
stepJobId: string | null;
|
|
35
|
+
stepIdentity: StepIdentity | undefined;
|
|
36
|
+
children: string[];
|
|
37
|
+
runs: string[];
|
|
38
|
+
delivery: Delivery | undefined;
|
|
39
|
+
};
|
|
40
|
+
/** Commits terminal state and a child's delivery to its parent; cancellation, points and enqueueing remain outside SQLite. */
|
|
41
|
+
export declare function endTurnState(store: TxRecords, sessionId: string, turnId: string, outcome: Outcome, by: EndedBy, notice?: Notice, authority?: EndAuthority): EndedTurn | undefined;
|
|
42
|
+
//# sourceMappingURL=end-turn-state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"end-turn-state.d.ts","sourceRoot":"","sources":["../../src/turns/end-turn-state.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAExE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAKzD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAqD,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEzG,MAAM,MAAM,OAAO,GAAG,MAAM,GAAG,SAAS,GAAG,QAAQ,CAAC;AACpD,MAAM,MAAM,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;CAAE,CAAC;AAC1E,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AACzD,2HAA2H;AAC3H,MAAM,MAAM,QAAQ,GAAG;IAAE,IAAI,EAAE,YAAY,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,SAAS,CAAA;CAAE,CAAC;AACvH,MAAM,MAAM,SAAS,GAAG;IACtB,OAAO,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,EAAE,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,KAAK,EAAE,KAAK,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IACzI,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,YAAY,EAAE,YAAY,GAAG,SAAS,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAC;IAAC,QAAQ,EAAE,QAAQ,GAAG,SAAS,CAAC;CACtI,CAAC;AAwBF,8HAA8H;AAC9H,wBAAgB,YAAY,CAAC,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,YAAY,GAAG,SAAS,GAAG,SAAS,CAyBjL"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { now } from "../sessions/session-lookup.js";
|
|
2
|
+
import { appendBackgroundInTx, backgroundText } from "./background.js";
|
|
3
|
+
import { childResultInTx } from "./child-result.js";
|
|
4
|
+
import { appendNotice, appendQueued } from "./history.js";
|
|
5
|
+
import { heldText, resolvePendingInTx } from "./resolve.js";
|
|
6
|
+
import { invalidateStep, liveStep, prepareStep, settleStep } from "./step-intents.js";
|
|
7
|
+
// A child's result reaches its parent with its end: the call that waits on it, a background message, or, for a child
|
|
8
|
+
// whose step was interrupted, the end of the parent's turn (ADR 0009, 95). A cancelled child tells no one.
|
|
9
|
+
function deliverChild(store, child, outcome, by, notice) {
|
|
10
|
+
const parent = child.parentId === null ? undefined : store.sessions.get(child.parentId);
|
|
11
|
+
if (parent === undefined)
|
|
12
|
+
return undefined;
|
|
13
|
+
const turn = parent.turnId === null ? undefined : store.turns.get(parent.turnId);
|
|
14
|
+
const waiting = turn?.pending.find(item => item.childSessionId === child.id);
|
|
15
|
+
if (waiting !== undefined && turn !== undefined) {
|
|
16
|
+
if (by === 'handler') {
|
|
17
|
+
const ended = endTurnState(store, parent.id, turn.id, outcome === 'interrupted' ? 'interrupted' : 'failed', 'handler', notice);
|
|
18
|
+
return ended === undefined ? undefined : { ended };
|
|
19
|
+
}
|
|
20
|
+
const result = childResultInTx(store, child.id, outcome);
|
|
21
|
+
const step = resolvePendingInTx(store, parent.id, waiting.toolCallId, heldText(waiting.toolCallId, result.text, result.isError));
|
|
22
|
+
return step === null ? undefined : { step };
|
|
23
|
+
}
|
|
24
|
+
const [entry] = store.background.find({ sessionId: parent.id, ref: child.id }, { limit: 1 });
|
|
25
|
+
if (entry === undefined)
|
|
26
|
+
return undefined;
|
|
27
|
+
const turnId = appendBackgroundInTx(store, parent.id, { kind: 'subagent', sessionId: child.id }, backgroundText(entry.call, child.id, childResultInTx(store, child.id, outcome).text), by === 'step');
|
|
28
|
+
return turnId === undefined ? undefined : { turn: { sessionId: parent.id, turnId } };
|
|
29
|
+
}
|
|
30
|
+
/** Commits terminal state and a child's delivery to its parent; cancellation, points and enqueueing remain outside SQLite. */
|
|
31
|
+
export function endTurnState(store, sessionId, turnId, outcome, by, notice, authority) {
|
|
32
|
+
const session = store.sessions.get(sessionId);
|
|
33
|
+
const turn = store.turns.get(turnId);
|
|
34
|
+
if (session?.turnId !== turnId || turn?.sessionId !== sessionId || turn.outcome !== null || turn.endedAt !== null)
|
|
35
|
+
return undefined;
|
|
36
|
+
if (authority !== undefined && session.stepJobId !== authority.jobId)
|
|
37
|
+
return undefined;
|
|
38
|
+
if (by === 'step' && (authority === undefined || !('intentId' in authority)))
|
|
39
|
+
return undefined;
|
|
40
|
+
if (authority !== undefined && 'intentId' in authority) {
|
|
41
|
+
if (authority.sessionId !== sessionId || authority.turnId !== turnId || liveStep(store, authority, authority.jobId) === undefined)
|
|
42
|
+
return undefined;
|
|
43
|
+
if (!settleStep(store, authority, authority.jobId))
|
|
44
|
+
return undefined;
|
|
45
|
+
}
|
|
46
|
+
// Preserve a legacy saved reference before terminal state clears it, even when later ownership cannot be proved.
|
|
47
|
+
const identity = session.stepIntentId !== null ? { sessionId, turnId, intentId: session.stepIntentId, generation: session.stepGeneration } : by === 'cancel' && session.status === 'running' && session.stepJobId !== null && turn.pending.length === 0 ? prepareStep(store, sessionId, turnId, session.stepJobId) : undefined;
|
|
48
|
+
const invalidatedJob = identity === undefined || (authority !== undefined && 'intentId' in authority) ? null : invalidateStep(store, identity, by === 'cancel' ? 'CANCEL_REQUESTED' : 'TURN_ENDED');
|
|
49
|
+
const stepJobId = session.stepJobId ?? invalidatedJob;
|
|
50
|
+
const children = turn.pending.flatMap(item => item.childSessionId === null ? [] : [item.childSessionId]);
|
|
51
|
+
const runs = turn.pending.flatMap(item => item.runId === null ? [] : [item.runId]);
|
|
52
|
+
const endedAt = now();
|
|
53
|
+
const durationMs = Math.max(Date.parse(endedAt) - Date.parse(turn.startedAt), 0);
|
|
54
|
+
store.turns.update(turnId, { endedAt, durationMs, outcome, calls: [], pending: [], results: [], deferredCalls: [] });
|
|
55
|
+
for (const question of store.questions.find({ sessionId }, { limit: 1000 }))
|
|
56
|
+
store.questions.delete(question.id);
|
|
57
|
+
appendQueued(store, session, null);
|
|
58
|
+
if (notice !== undefined)
|
|
59
|
+
appendNotice(store, session, notice.code, notice.params ?? {}, turnId);
|
|
60
|
+
const updated = store.sessions.update(sessionId, { status: 'idle', turnId: null, stepJobId: null, stepIntentId: null, endedTurns: session.endedTurns + 1, durationMs: session.durationMs + durationMs, updatedAt: endedAt });
|
|
61
|
+
const delivery = by === 'cancel' ? undefined : deliverChild(store, updated, outcome, by, notice);
|
|
62
|
+
return { session: updated, turnId, outcome, by, notice, usage: turn.usage, durationMs, stepJobId, stepIdentity: identity, children, runs, delivery };
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=end-turn-state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"end-turn-state.js","sourceRoot":"","sources":["../../src/turns/end-turn-state.ts"],"names":[],"mappings":"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"}
|
package/dist/turns/end-turn.d.ts
CHANGED
|
@@ -1,13 +1,12 @@
|
|
|
1
1
|
import type { Ctx } from '@kvman/sdk';
|
|
2
|
-
import type { JsonValue } from '../connector-call.ts';
|
|
3
2
|
import type { Outcome } from '../schemas/records.ts';
|
|
4
|
-
|
|
5
|
-
export type Notice
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
export declare function
|
|
10
|
-
/** What a finished subagent returns
|
|
3
|
+
import { type EndAuthority, type EndedBy, type EndedTurn, type Notice } from './end-turn-state.ts';
|
|
4
|
+
export type { EndedBy, Notice } from './end-turn-state.ts';
|
|
5
|
+
export declare function endTurn(ctx: Ctx, sessionId: string, turnId: string, outcome: Outcome, by: EndedBy, notice?: Notice, authority?: EndAuthority): Promise<boolean>;
|
|
6
|
+
/** Effects for an already committed end; never used to decide whether a turn may end. */
|
|
7
|
+
export declare function notifyEnded(ctx: Ctx, ended: EndedTurn): Promise<void>;
|
|
8
|
+
export declare function cancelTurn(ctx: Ctx, sessionId: string, notice: boolean, only?: string): Promise<boolean>;
|
|
9
|
+
/** What a finished subagent returns, for the job list. */
|
|
11
10
|
export declare function childResult(ctx: Ctx, childId: string, outcome: Outcome): Promise<{
|
|
12
11
|
text: string;
|
|
13
12
|
isError: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"end-turn.d.ts","sourceRoot":"","sources":["../../src/turns/end-turn.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,
|
|
1
|
+
{"version":3,"file":"end-turn.d.ts","sourceRoot":"","sources":["../../src/turns/end-turn.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AAGtC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAIrD,OAAO,EAAgB,KAAK,YAAY,EAAE,KAAK,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,MAAM,EAAE,MAAM,qBAAqB,CAAC;AACjH,YAAY,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAQ3D,wBAAsB,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,CAKrK;AAWD,yFAAyF;AACzF,wBAAsB,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAS3E;AAKD,wBAAsB,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAU9G;AAED,0DAA0D;AAC1D,wBAAsB,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,CAE1H"}
|