@kvman/kvcoder 0.1.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/LICENSE +21 -0
- package/README.md +9 -0
- package/dist/api.d.ts +386 -0
- package/dist/api.d.ts.map +1 -0
- package/dist/api.js +2 -0
- package/dist/api.js.map +1 -0
- package/dist/artifacts/artifact-format.d.ts +9 -0
- package/dist/artifacts/artifact-format.d.ts.map +1 -0
- package/dist/artifacts/artifact-format.js +32 -0
- package/dist/artifacts/artifact-format.js.map +1 -0
- package/dist/artifacts/artifact-records.d.ts +12 -0
- package/dist/artifacts/artifact-records.d.ts.map +1 -0
- package/dist/artifacts/artifact-records.js +17 -0
- package/dist/artifacts/artifact-records.js.map +1 -0
- package/dist/artifacts/register-artifacts.d.ts +3 -0
- package/dist/artifacts/register-artifacts.d.ts.map +1 -0
- package/dist/artifacts/register-artifacts.js +37 -0
- package/dist/artifacts/register-artifacts.js.map +1 -0
- package/dist/calls/binary-checks.d.ts +8 -0
- package/dist/calls/binary-checks.d.ts.map +1 -0
- package/dist/calls/binary-checks.js +12 -0
- package/dist/calls/binary-checks.js.map +1 -0
- package/dist/calls/connector-help.d.ts +3 -0
- package/dist/calls/connector-help.d.ts.map +1 -0
- package/dist/calls/connector-help.js +73 -0
- package/dist/calls/connector-help.js.map +1 -0
- package/dist/calls/help-text.d.ts +19 -0
- package/dist/calls/help-text.d.ts.map +1 -0
- package/dist/calls/help-text.js +22 -0
- package/dist/calls/help-text.js.map +1 -0
- package/dist/calls/line-run.d.ts +33 -0
- package/dist/calls/line-run.d.ts.map +1 -0
- package/dist/calls/line-run.js +56 -0
- package/dist/calls/line-run.js.map +1 -0
- package/dist/calls/run-shell.d.ts +12 -0
- package/dist/calls/run-shell.d.ts.map +1 -0
- package/dist/calls/run-shell.js +88 -0
- package/dist/calls/run-shell.js.map +1 -0
- package/dist/calls/run-tool.d.ts +49 -0
- package/dist/calls/run-tool.d.ts.map +1 -0
- package/dist/calls/run-tool.js +66 -0
- package/dist/calls/run-tool.js.map +1 -0
- package/dist/calls/shell-command.d.ts +25 -0
- package/dist/calls/shell-command.d.ts.map +1 -0
- package/dist/calls/shell-command.js +31 -0
- package/dist/calls/shell-command.js.map +1 -0
- package/dist/calls/shell-program.d.ts +5 -0
- package/dist/calls/shell-program.d.ts.map +1 -0
- package/dist/calls/shell-program.js +8 -0
- package/dist/calls/shell-program.js.map +1 -0
- package/dist/connector-call.d.ts +66 -0
- package/dist/connector-call.d.ts.map +1 -0
- package/dist/connector-call.js +133 -0
- package/dist/connector-call.js.map +1 -0
- package/dist/connectors/artifact.d.ts +51 -0
- package/dist/connectors/artifact.d.ts.map +1 -0
- package/dist/connectors/artifact.js +101 -0
- package/dist/connectors/artifact.js.map +1 -0
- package/dist/connectors/ask.d.ts +58 -0
- package/dist/connectors/ask.d.ts.map +1 -0
- package/dist/connectors/ask.js +85 -0
- package/dist/connectors/ask.js.map +1 -0
- package/dist/connectors/background.d.ts +29 -0
- package/dist/connectors/background.d.ts.map +1 -0
- package/dist/connectors/background.js +56 -0
- package/dist/connectors/background.js.map +1 -0
- package/dist/connectors/binary.d.ts +5 -0
- package/dist/connectors/binary.d.ts.map +1 -0
- package/dist/connectors/binary.js +27 -0
- package/dist/connectors/binary.js.map +1 -0
- package/dist/connectors/builtin-connectors.d.ts +217 -0
- package/dist/connectors/builtin-connectors.d.ts.map +1 -0
- package/dist/connectors/builtin-connectors.js +49 -0
- package/dist/connectors/builtin-connectors.js.map +1 -0
- package/dist/connectors/connector-command.d.ts +26 -0
- package/dist/connectors/connector-command.d.ts.map +1 -0
- package/dist/connectors/connector-command.js +17 -0
- package/dist/connectors/connector-command.js.map +1 -0
- package/dist/connectors/delegate.d.ts +32 -0
- package/dist/connectors/delegate.d.ts.map +1 -0
- package/dist/connectors/delegate.js +82 -0
- package/dist/connectors/delegate.js.map +1 -0
- package/dist/connectors/fs.d.ts +60 -0
- package/dist/connectors/fs.d.ts.map +1 -0
- package/dist/connectors/fs.js +132 -0
- package/dist/connectors/fs.js.map +1 -0
- package/dist/connectors/mcp.d.ts +37 -0
- package/dist/connectors/mcp.d.ts.map +1 -0
- package/dist/connectors/mcp.js +69 -0
- package/dist/connectors/mcp.js.map +1 -0
- package/dist/connectors/payload-fields.d.ts +9 -0
- package/dist/connectors/payload-fields.d.ts.map +1 -0
- package/dist/connectors/payload-fields.js +13 -0
- package/dist/connectors/payload-fields.js.map +1 -0
- package/dist/connectors/shell.d.ts +19 -0
- package/dist/connectors/shell.d.ts.map +1 -0
- package/dist/connectors/shell.js +22 -0
- package/dist/connectors/shell.js.map +1 -0
- package/dist/delay.d.ts +3 -0
- package/dist/delay.d.ts.map +1 -0
- package/dist/delay.js +11 -0
- package/dist/delay.js.map +1 -0
- package/dist/delegate/approved-run.d.ts +13 -0
- package/dist/delegate/approved-run.d.ts.map +1 -0
- package/dist/delegate/approved-run.js +54 -0
- package/dist/delegate/approved-run.js.map +1 -0
- package/dist/delegate/programs.d.ts +32 -0
- package/dist/delegate/programs.d.ts.map +1 -0
- package/dist/delegate/programs.js +67 -0
- package/dist/delegate/programs.js.map +1 -0
- package/dist/delegate/register-worker-run.d.ts +9 -0
- package/dist/delegate/register-worker-run.d.ts.map +1 -0
- package/dist/delegate/register-worker-run.js +70 -0
- package/dist/delegate/register-worker-run.js.map +1 -0
- package/dist/delegate/run-program.d.ts +9 -0
- package/dist/delegate/run-program.d.ts.map +1 -0
- package/dist/delegate/run-program.js +59 -0
- package/dist/delegate/run-program.js.map +1 -0
- package/dist/delegate/runs.d.ts +27 -0
- package/dist/delegate/runs.d.ts.map +1 -0
- package/dist/delegate/runs.js +68 -0
- package/dist/delegate/runs.js.map +1 -0
- package/dist/delegate/workers.d.ts +266 -0
- package/dist/delegate/workers.d.ts.map +1 -0
- package/dist/delegate/workers.js +80 -0
- package/dist/delegate/workers.js.map +1 -0
- package/dist/docs.d.ts +14 -0
- package/dist/docs.d.ts.map +1 -0
- package/dist/docs.js +59 -0
- package/dist/docs.js.map +1 -0
- package/dist/files/edit-text.d.ts +13 -0
- package/dist/files/edit-text.d.ts.map +1 -0
- package/dist/files/edit-text.js +46 -0
- package/dist/files/edit-text.js.map +1 -0
- package/dist/files/file-queue.d.ts +3 -0
- package/dist/files/file-queue.d.ts.map +1 -0
- package/dist/files/file-queue.js +17 -0
- package/dist/files/file-queue.js.map +1 -0
- package/dist/files/list-entries.d.ts +14 -0
- package/dist/files/list-entries.d.ts.map +1 -0
- package/dist/files/list-entries.js +40 -0
- package/dist/files/list-entries.js.map +1 -0
- package/dist/files/read-file.d.ts +17 -0
- package/dist/files/read-file.d.ts.map +1 -0
- package/dist/files/read-file.js +53 -0
- package/dist/files/read-file.js.map +1 -0
- package/dist/files/search-text.d.ts +14 -0
- package/dist/files/search-text.d.ts.map +1 -0
- package/dist/files/search-text.js +62 -0
- package/dist/files/search-text.js.map +1 -0
- package/dist/files/workspace-path.d.ts +5 -0
- package/dist/files/workspace-path.d.ts.map +1 -0
- package/dist/files/workspace-path.js +37 -0
- package/dist/files/workspace-path.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +68 -0
- package/dist/index.js.map +1 -0
- package/dist/jobs/job-rows.d.ts +24 -0
- package/dist/jobs/job-rows.d.ts.map +1 -0
- package/dist/jobs/job-rows.js +74 -0
- package/dist/jobs/job-rows.js.map +1 -0
- package/dist/jobs/process-handlers.d.ts +8 -0
- package/dist/jobs/process-handlers.d.ts.map +1 -0
- package/dist/jobs/process-handlers.js +43 -0
- package/dist/jobs/process-handlers.js.map +1 -0
- package/dist/jobs/process-records.d.ts +15 -0
- package/dist/jobs/process-records.d.ts.map +1 -0
- package/dist/jobs/process-records.js +30 -0
- package/dist/jobs/process-records.js.map +1 -0
- package/dist/jobs/process-report.d.ts +8 -0
- package/dist/jobs/process-report.d.ts.map +1 -0
- package/dist/jobs/process-report.js +44 -0
- package/dist/jobs/process-report.js.map +1 -0
- package/dist/jobs/process-run.d.ts +26 -0
- package/dist/jobs/process-run.d.ts.map +1 -0
- package/dist/jobs/process-run.js +70 -0
- package/dist/jobs/process-run.js.map +1 -0
- package/dist/jobs/process-text.d.ts +5 -0
- package/dist/jobs/process-text.d.ts.map +1 -0
- package/dist/jobs/process-text.js +11 -0
- package/dist/jobs/process-text.js.map +1 -0
- package/dist/jobs/register-jobs.d.ts +3 -0
- package/dist/jobs/register-jobs.d.ts.map +1 -0
- package/dist/jobs/register-jobs.js +61 -0
- package/dist/jobs/register-jobs.js.map +1 -0
- package/dist/mcp/command-transport.d.ts +17 -0
- package/dist/mcp/command-transport.d.ts.map +1 -0
- package/dist/mcp/command-transport.js +60 -0
- package/dist/mcp/command-transport.js.map +1 -0
- package/dist/mcp/connect.d.ts +12 -0
- package/dist/mcp/connect.d.ts.map +1 -0
- package/dist/mcp/connect.js +54 -0
- package/dist/mcp/connect.js.map +1 -0
- package/dist/mcp/oauth-provider.d.ts +25 -0
- package/dist/mcp/oauth-provider.d.ts.map +1 -0
- package/dist/mcp/oauth-provider.js +59 -0
- package/dist/mcp/oauth-provider.js.map +1 -0
- package/dist/mcp/register-mcp.d.ts +3 -0
- package/dist/mcp/register-mcp.d.ts.map +1 -0
- package/dist/mcp/register-mcp.js +61 -0
- package/dist/mcp/register-mcp.js.map +1 -0
- package/dist/mcp/secrets.d.ts +7 -0
- package/dist/mcp/secrets.d.ts.map +1 -0
- package/dist/mcp/secrets.js +20 -0
- package/dist/mcp/secrets.js.map +1 -0
- package/dist/mcp/servers.d.ts +33 -0
- package/dist/mcp/servers.d.ts.map +1 -0
- package/dist/mcp/servers.js +31 -0
- package/dist/mcp/servers.js.map +1 -0
- package/dist/mcp/sign-in-record.d.ts +10 -0
- package/dist/mcp/sign-in-record.d.ts.map +1 -0
- package/dist/mcp/sign-in-record.js +4 -0
- package/dist/mcp/sign-in-record.js.map +1 -0
- package/dist/mcp/sign-in.d.ts +12 -0
- package/dist/mcp/sign-in.d.ts.map +1 -0
- package/dist/mcp/sign-in.js +75 -0
- package/dist/mcp/sign-in.js.map +1 -0
- package/dist/mcp/tools.d.ts +19 -0
- package/dist/mcp/tools.d.ts.map +1 -0
- package/dist/mcp/tools.js +31 -0
- package/dist/mcp/tools.js.map +1 -0
- package/dist/messages/attachments.d.ts +8 -0
- package/dist/messages/attachments.d.ts.map +1 -0
- package/dist/messages/attachments.js +48 -0
- package/dist/messages/attachments.js.map +1 -0
- package/dist/messages/receive-message.d.ts +15 -0
- package/dist/messages/receive-message.d.ts.map +1 -0
- package/dist/messages/receive-message.js +60 -0
- package/dist/messages/receive-message.js.map +1 -0
- package/dist/messages/register-messages.d.ts +3 -0
- package/dist/messages/register-messages.d.ts.map +1 -0
- package/dist/messages/register-messages.js +63 -0
- package/dist/messages/register-messages.js.map +1 -0
- package/dist/problems.d.ts +8 -0
- package/dist/problems.d.ts.map +1 -0
- package/dist/problems.js +14 -0
- package/dist/problems.js.map +1 -0
- package/dist/prompt/build-prompt.d.ts +29 -0
- package/dist/prompt/build-prompt.d.ts.map +1 -0
- package/dist/prompt/build-prompt.js +60 -0
- package/dist/prompt/build-prompt.js.map +1 -0
- package/dist/prompt/register-prompt.d.ts +3 -0
- package/dist/prompt/register-prompt.d.ts.map +1 -0
- package/dist/prompt/register-prompt.js +29 -0
- package/dist/prompt/register-prompt.js.map +1 -0
- package/dist/prompt/session-prompt.d.ts +24 -0
- package/dist/prompt/session-prompt.d.ts.map +1 -0
- package/dist/prompt/session-prompt.js +50 -0
- package/dist/prompt/session-prompt.js.map +1 -0
- package/dist/prompt/working-method.d.ts +7 -0
- package/dist/prompt/working-method.d.ts.map +1 -0
- package/dist/prompt/working-method.js +51 -0
- package/dist/prompt/working-method.js.map +1 -0
- package/dist/register-settings.d.ts +142 -0
- package/dist/register-settings.d.ts.map +1 -0
- package/dist/register-settings.js +51 -0
- package/dist/register-settings.js.map +1 -0
- package/dist/registry/loaded.d.ts +32 -0
- package/dist/registry/loaded.d.ts.map +1 -0
- package/dist/registry/loaded.js +41 -0
- package/dist/registry/loaded.js.map +1 -0
- package/dist/registry/register-connectors.d.ts +32 -0
- package/dist/registry/register-connectors.d.ts.map +1 -0
- package/dist/registry/register-connectors.js +126 -0
- package/dist/registry/register-connectors.js.map +1 -0
- package/dist/registry/register-sections.d.ts +18 -0
- package/dist/registry/register-sections.d.ts.map +1 -0
- package/dist/registry/register-sections.js +99 -0
- package/dist/registry/register-sections.js.map +1 -0
- package/dist/registry/session-points.d.ts +11 -0
- package/dist/registry/session-points.d.ts.map +1 -0
- package/dist/registry/session-points.js +89 -0
- package/dist/registry/session-points.js.map +1 -0
- package/dist/result-text.d.ts +11 -0
- package/dist/result-text.d.ts.map +1 -0
- package/dist/result-text.js +21 -0
- package/dist/result-text.js.map +1 -0
- package/dist/schemas/records.d.ts +357 -0
- package/dist/schemas/records.d.ts.map +1 -0
- package/dist/schemas/records.js +159 -0
- package/dist/schemas/records.js.map +1 -0
- package/dist/schemas/registry.d.ts +160 -0
- package/dist/schemas/registry.d.ts.map +1 -0
- package/dist/schemas/registry.js +37 -0
- package/dist/schemas/registry.js.map +1 -0
- package/dist/sessions/new-session.d.ts +6 -0
- package/dist/sessions/new-session.d.ts.map +1 -0
- package/dist/sessions/new-session.js +52 -0
- package/dist/sessions/new-session.js.map +1 -0
- package/dist/sessions/register-fork-export.d.ts +5 -0
- package/dist/sessions/register-fork-export.d.ts.map +1 -0
- package/dist/sessions/register-fork-export.js +62 -0
- package/dist/sessions/register-fork-export.js.map +1 -0
- package/dist/sessions/register-lifecycle.d.ts +3 -0
- package/dist/sessions/register-lifecycle.d.ts.map +1 -0
- package/dist/sessions/register-lifecycle.js +59 -0
- package/dist/sessions/register-lifecycle.js.map +1 -0
- package/dist/sessions/register-sessions.d.ts +3 -0
- package/dist/sessions/register-sessions.d.ts.map +1 -0
- package/dist/sessions/register-sessions.js +93 -0
- package/dist/sessions/register-sessions.js.map +1 -0
- package/dist/sessions/session-lookup.d.ts +10 -0
- package/dist/sessions/session-lookup.d.ts.map +1 -0
- package/dist/sessions/session-lookup.js +25 -0
- package/dist/sessions/session-lookup.js.map +1 -0
- package/dist/sessions/session-view.d.ts +118 -0
- package/dist/sessions/session-view.d.ts.map +1 -0
- package/dist/sessions/session-view.js +105 -0
- package/dist/sessions/session-view.js.map +1 -0
- package/dist/store/collections.d.ts +471 -0
- package/dist/store/collections.d.ts.map +1 -0
- package/dist/store/collections.js +46 -0
- package/dist/store/collections.js.map +1 -0
- package/dist/turns/background.d.ts +6 -0
- package/dist/turns/background.d.ts.map +1 -0
- package/dist/turns/background.js +27 -0
- package/dist/turns/background.js.map +1 -0
- package/dist/turns/cancel-turn.d.ts +3 -0
- package/dist/turns/cancel-turn.d.ts.map +1 -0
- package/dist/turns/cancel-turn.js +31 -0
- package/dist/turns/cancel-turn.js.map +1 -0
- package/dist/turns/compaction.d.ts +12 -0
- package/dist/turns/compaction.d.ts.map +1 -0
- package/dist/turns/compaction.js +55 -0
- package/dist/turns/compaction.js.map +1 -0
- package/dist/turns/end-turn.d.ts +15 -0
- package/dist/turns/end-turn.d.ts.map +1 -0
- package/dist/turns/end-turn.js +67 -0
- package/dist/turns/end-turn.js.map +1 -0
- package/dist/turns/history.d.ts +28 -0
- package/dist/turns/history.d.ts.map +1 -0
- package/dist/turns/history.js +47 -0
- package/dist/turns/history.js.map +1 -0
- package/dist/turns/lost-reply.d.ts +31 -0
- package/dist/turns/lost-reply.d.ts.map +1 -0
- package/dist/turns/lost-reply.js +43 -0
- package/dist/turns/lost-reply.js.map +1 -0
- package/dist/turns/message-blocks.d.ts +9 -0
- package/dist/turns/message-blocks.d.ts.map +1 -0
- package/dist/turns/message-blocks.js +25 -0
- package/dist/turns/message-blocks.js.map +1 -0
- package/dist/turns/model-context.d.ts +81 -0
- package/dist/turns/model-context.d.ts.map +1 -0
- package/dist/turns/model-context.js +46 -0
- package/dist/turns/model-context.js.map +1 -0
- package/dist/turns/model-info.d.ts +7 -0
- package/dist/turns/model-info.d.ts.map +1 -0
- package/dist/turns/model-info.js +10 -0
- package/dist/turns/model-info.js.map +1 -0
- package/dist/turns/model-retry.d.ts +3 -0
- package/dist/turns/model-retry.d.ts.map +1 -0
- package/dist/turns/model-retry.js +23 -0
- package/dist/turns/model-retry.js.map +1 -0
- package/dist/turns/register-interruptions.d.ts +3 -0
- package/dist/turns/register-interruptions.d.ts.map +1 -0
- package/dist/turns/register-interruptions.js +31 -0
- package/dist/turns/register-interruptions.js.map +1 -0
- package/dist/turns/register-turns.d.ts +3 -0
- package/dist/turns/register-turns.d.ts.map +1 -0
- package/dist/turns/register-turns.js +66 -0
- package/dist/turns/register-turns.js.map +1 -0
- package/dist/turns/resolve.d.ts +7 -0
- package/dist/turns/resolve.d.ts.map +1 -0
- package/dist/turns/resolve.js +29 -0
- package/dist/turns/resolve.js.map +1 -0
- package/dist/turns/run-calls.d.ts +34 -0
- package/dist/turns/run-calls.d.ts.map +1 -0
- package/dist/turns/run-calls.js +99 -0
- package/dist/turns/run-calls.js.map +1 -0
- package/dist/turns/run-command.d.ts +26 -0
- package/dist/turns/run-command.d.ts.map +1 -0
- package/dist/turns/run-command.js +118 -0
- package/dist/turns/run-command.js.map +1 -0
- package/dist/turns/settle-calls.d.ts +17 -0
- package/dist/turns/settle-calls.d.ts.map +1 -0
- package/dist/turns/settle-calls.js +98 -0
- package/dist/turns/settle-calls.js.map +1 -0
- package/dist/turns/start-turn.d.ts +87 -0
- package/dist/turns/start-turn.d.ts.map +1 -0
- package/dist/turns/start-turn.js +40 -0
- package/dist/turns/start-turn.js.map +1 -0
- package/dist/turns/step.d.ts +8 -0
- package/dist/turns/step.d.ts.map +1 -0
- package/dist/turns/step.js +168 -0
- package/dist/turns/step.js.map +1 -0
- package/dist/ui/register-ui.d.ts +3 -0
- package/dist/ui/register-ui.d.ts.map +1 -0
- package/dist/ui/register-ui.js +75 -0
- package/dist/ui/register-ui.js.map +1 -0
- package/dist/web/components/call.css +2 -0
- package/dist/web/components/call.js +386 -0
- package/dist/web/components/connectors.css +2 -0
- package/dist/web/components/connectors.js +2403 -0
- package/dist/web/components/conversation.css +2 -0
- package/dist/web/components/conversation.js +4319 -0
- package/dist/web/components/mcp-sign-in.css +2 -0
- package/dist/web/components/mcp-sign-in.js +265 -0
- package/dist/web/components/model.css +2 -0
- package/dist/web/components/model.js +545 -0
- package/dist/web/components/question.css +2 -0
- package/dist/web/components/question.js +321 -0
- package/dist/web/components/sessions.css +2 -0
- package/dist/web/components/sessions.js +264 -0
- package/docs/connectors.md +86 -0
- package/docs/sections.md +27 -0
- package/locales/ar.json +418 -0
- package/locales/en.json +418 -0
- package/package.json +70 -0
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { runLost } from "../delegate/register-worker-run.js";
|
|
2
|
+
import { records } from "../store/collections.js";
|
|
3
|
+
import { endTurn } from "./end-turn.js";
|
|
4
|
+
// Steps that end without finishing (plan 08 §8.1, ADR 0009, 95): a step cut off by a stop, a crash, or a timeout ends
|
|
5
|
+
// its turn with a notice. These handlers queue nothing, since their jobs carry the `fromHandler` mark.
|
|
6
|
+
async function stepEnded(ctx, jobId, outcome, code) {
|
|
7
|
+
const [session] = await records(ctx.store).sessions.find({ stepJobId: jobId }, { limit: 1 });
|
|
8
|
+
if (session === undefined || session.turnId === null)
|
|
9
|
+
return;
|
|
10
|
+
const notice = outcome === 'cancelled' ? { code: 'CANCELLED' } : { code: outcome === 'interrupted' ? 'INTERRUPTED' : 'STEP_FAILED', params: { code } };
|
|
11
|
+
await endTurn(ctx, session.id, session.turnId, outcome, 'handler', notice);
|
|
12
|
+
}
|
|
13
|
+
export function registerInterruptions(ctx) {
|
|
14
|
+
ctx.registerHandler('kernel.job.failed', {
|
|
15
|
+
description: "Ends the turn of a step that failed, or of a program worker's run that was lost.",
|
|
16
|
+
handle: async ({ jobId, name, problem }) => {
|
|
17
|
+
if (name === 'kvcoder.delegate.worker.run')
|
|
18
|
+
await runLost(ctx, jobId, problem.code);
|
|
19
|
+
if (name === 'kvcoder.turn.step')
|
|
20
|
+
await stepEnded(ctx, jobId, problem.code === 'INTERRUPTED' ? 'interrupted' : 'failed', problem.code);
|
|
21
|
+
},
|
|
22
|
+
});
|
|
23
|
+
ctx.registerHandler('kernel.job.cancelled', {
|
|
24
|
+
description: 'Ends the turn of a cancelled step.',
|
|
25
|
+
handle: async ({ jobId, name }) => {
|
|
26
|
+
if (name === 'kvcoder.turn.step')
|
|
27
|
+
await stepEnded(ctx, jobId, 'cancelled', 'CANCELLED');
|
|
28
|
+
},
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=register-interruptions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"register-interruptions.js","sourceRoot":"","sources":["../../src/turns/register-interruptions.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,oCAAoC,CAAC;AAC7D,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAExC,sHAAsH;AACtH,uGAAuG;AAEvG,KAAK,UAAU,SAAS,CAAC,GAAQ,EAAE,KAAa,EAAE,OAA+C,EAAE,IAAY;IAC7G,MAAM,CAAC,OAAO,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;IAC7F,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,CAAC,MAAM,KAAK,IAAI;QAAE,OAAO;IAC7D,MAAM,MAAM,GAAG,OAAO,KAAK,WAAW,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,KAAK,aAAa,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,aAAa,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC;IACvJ,MAAM,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;AAC7E,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,GAAQ;IAC5C,GAAG,CAAC,eAAe,CAAC,mBAAmB,EAAE;QACvC,WAAW,EAAE,kFAAkF;QAC/F,MAAM,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE;YACzC,IAAI,IAAI,KAAK,6BAA6B;gBAAE,MAAM,OAAO,CAAC,GAAG,EAAE,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;YACpF,IAAI,IAAI,KAAK,mBAAmB;gBAAE,MAAM,SAAS,CAAC,GAAG,EAAE,KAAK,EAAE,OAAO,CAAC,IAAI,KAAK,aAAa,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QACzI,CAAC;KACF,CAAC,CAAC;IACH,GAAG,CAAC,eAAe,CAAC,sBAAsB,EAAE;QAC1C,WAAW,EAAE,oCAAoC;QACjD,MAAM,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE;YAChC,IAAI,IAAI,KAAK,mBAAmB;gBAAE,MAAM,SAAS,CAAC,GAAG,EAAE,KAAK,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;QAC1F,CAAC;KACF,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"register-turns.d.ts","sourceRoot":"","sources":["../../src/turns/register-turns.ts"],"names":[],"mappings":"AAAA,OAAO,EAAK,KAAK,GAAG,EAAE,MAAM,YAAY,CAAC;AAYzC,wBAAgB,aAAa,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI,CAmD5C"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { z } from '@kvman/sdk';
|
|
2
|
+
import { isDelegateRun, startApprovedRun } from "../delegate/approved-run.js";
|
|
3
|
+
import { checkedAnswer } from "../connectors/ask.js";
|
|
4
|
+
import { runCallSchema } from "../schemas/records.js";
|
|
5
|
+
import { findSession, ownSession, userOnly } from "../sessions/session-lookup.js";
|
|
6
|
+
import { turnSchema, turnView } from "../sessions/session-view.js";
|
|
7
|
+
import { records, txRecords } from "../store/collections.js";
|
|
8
|
+
import { cancelTurn } from "./cancel-turn.js";
|
|
9
|
+
import { heldText, resolvePending } from "./resolve.js";
|
|
10
|
+
// Turns (plan 08 §8.6): cancel, list, and the person's answer to a question or approval.
|
|
11
|
+
export function registerTurns(ctx) {
|
|
12
|
+
ctx.registerCommand('kvcoder.turn.cancel', {
|
|
13
|
+
description: "Cancels a session's turn: its step, its subagents' turns, and its questions.",
|
|
14
|
+
input: z.object({ sessionId: z.string() }),
|
|
15
|
+
output: z.object({}),
|
|
16
|
+
public: true,
|
|
17
|
+
handle: async ({ sessionId }) => {
|
|
18
|
+
await ownSession(ctx, sessionId);
|
|
19
|
+
await cancelTurn(ctx, sessionId, true);
|
|
20
|
+
return {};
|
|
21
|
+
},
|
|
22
|
+
});
|
|
23
|
+
ctx.registerQuery('kvcoder.turn.list', {
|
|
24
|
+
description: "Lists a session's turns, newest first.",
|
|
25
|
+
input: z.object({ sessionId: z.string(), limit: z.number().int().positive().max(1000) }),
|
|
26
|
+
output: z.array(turnSchema),
|
|
27
|
+
public: true,
|
|
28
|
+
handle: async ({ sessionId, limit }) => {
|
|
29
|
+
await findSession(ctx, sessionId);
|
|
30
|
+
return (await records(ctx.store).turns.find({ sessionId }, { limit, order: 'desc' })).map(turnView);
|
|
31
|
+
},
|
|
32
|
+
});
|
|
33
|
+
ctx.registerCommand('kvcoder.question.answer', {
|
|
34
|
+
description: "Answers a pending question or approval; returns the next step's job id once nothing else is pending.",
|
|
35
|
+
input: z.object({ questionId: z.string(), answer: z.json() }),
|
|
36
|
+
output: z.object({ jobId: z.string().nullable() }),
|
|
37
|
+
public: true,
|
|
38
|
+
retries: 0,
|
|
39
|
+
handle: async ({ questionId, answer }) => {
|
|
40
|
+
userOnly(ctx, 'kvcoder.question.answer');
|
|
41
|
+
const question = await records(ctx.store).questions.get(questionId);
|
|
42
|
+
if (question === undefined)
|
|
43
|
+
throw ctx.problem('kvcoder/QUESTION_NOT_FOUND', { questionId });
|
|
44
|
+
const checked = checkedAnswer(question, answer);
|
|
45
|
+
const taken = await ctx.store.transaction((tx) => {
|
|
46
|
+
const { questions } = txRecords(tx);
|
|
47
|
+
if (questions.get(questionId) === undefined)
|
|
48
|
+
return false;
|
|
49
|
+
questions.delete(questionId);
|
|
50
|
+
return true;
|
|
51
|
+
});
|
|
52
|
+
if (!taken)
|
|
53
|
+
throw ctx.problem('kvcoder/QUESTION_NOT_FOUND', { questionId });
|
|
54
|
+
const approvedCall = checked.kind !== 'result' && checked.approved ? runCallSchema.parse(question.question) : undefined;
|
|
55
|
+
if (approvedCall !== undefined && isDelegateRun(approvedCall))
|
|
56
|
+
return { jobId: await startApprovedRun(ctx, { sessionId: question.sessionId, toolCallId: question.toolCallId, call: approvedCall }) };
|
|
57
|
+
const held = checked.kind === 'result'
|
|
58
|
+
? heldText(question.toolCallId, checked.text, false)
|
|
59
|
+
: checked.approved
|
|
60
|
+
? { toolCallId: question.toolCallId, text: '', details: null, isError: false, run: runCallSchema.parse(question.question) }
|
|
61
|
+
: heldText(question.toolCallId, 'denied by the user', true);
|
|
62
|
+
return { jobId: await resolvePending(ctx, question.sessionId, question.toolCallId, held, false) };
|
|
63
|
+
},
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=register-turns.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"register-turns.js","sourceRoot":"","sources":["../../src/turns/register-turns.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { Ctx } from '@kvman/sdk';
|
|
2
|
+
import type { HeldResult } from '../schemas/records.ts';
|
|
3
|
+
/** Holds a result for a pending call; resolves to the next step's job id when it was the last, else `null`. */
|
|
4
|
+
export declare function resolvePending(ctx: Ctx, sessionId: string, toolCallId: string, held: HeldResult, follow: boolean): Promise<string | null>;
|
|
5
|
+
/** A result that is plain text. */
|
|
6
|
+
export declare function heldText(toolCallId: string, text: string, isError: boolean): HeldResult;
|
|
7
|
+
//# sourceMappingURL=resolve.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../src/turns/resolve.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAQxD,+GAA+G;AAC/G,wBAAsB,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAc/I;AAED,mCAAmC;AACnC,wBAAgB,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,UAAU,CAEvF"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { now } from "../sessions/session-lookup.js";
|
|
2
|
+
import { txRecords } from "../store/collections.js";
|
|
3
|
+
import { queueStep } from "./start-turn.js";
|
|
4
|
+
// Resolving a pending call (plan 08 §8.1): its result is held in the turn; when the last one resolves, the session runs
|
|
5
|
+
// again and the next step appends every result in the model's call order before it calls the model.
|
|
6
|
+
/** Holds a result for a pending call; resolves to the next step's job id when it was the last, else `null`. */
|
|
7
|
+
export async function resolvePending(ctx, sessionId, toolCallId, held, follow) {
|
|
8
|
+
const turnId = await ctx.store.transaction((tx) => {
|
|
9
|
+
const store = txRecords(tx);
|
|
10
|
+
const session = store.sessions.get(sessionId);
|
|
11
|
+
if (session === undefined || session.turnId === null)
|
|
12
|
+
return null;
|
|
13
|
+
const turn = store.turns.get(session.turnId);
|
|
14
|
+
if (turn === undefined || !turn.pending.some((item) => item.toolCallId === toolCallId))
|
|
15
|
+
return null;
|
|
16
|
+
const pending = turn.pending.filter((item) => item.toolCallId !== toolCallId);
|
|
17
|
+
store.turns.update(turn.id, { pending, results: [...turn.results, held] });
|
|
18
|
+
if (pending.length > 0)
|
|
19
|
+
return null;
|
|
20
|
+
store.sessions.update(sessionId, { status: 'running', updatedAt: now() });
|
|
21
|
+
return turn.id;
|
|
22
|
+
});
|
|
23
|
+
return turnId === null ? null : queueStep(ctx, sessionId, turnId, follow);
|
|
24
|
+
}
|
|
25
|
+
/** A result that is plain text. */
|
|
26
|
+
export function heldText(toolCallId, text, isError) {
|
|
27
|
+
return { toolCallId, text, details: null, isError, run: null };
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=resolve.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve.js","sourceRoot":"","sources":["../../src/turns/resolve.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,GAAG,EAAE,MAAM,+BAA+B,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,wHAAwH;AACxH,oGAAoG;AAEpG,+GAA+G;AAC/G,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,GAAQ,EAAE,SAAiB,EAAE,UAAkB,EAAE,IAAgB,EAAE,MAAe;IACrH,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE;QAChD,MAAM,KAAK,GAAG,SAAS,CAAC,EAAE,CAAC,CAAC;QAC5B,MAAM,OAAO,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC9C,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,CAAC,MAAM,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC;QAClE,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC7C,IAAI,IAAI,KAAK,SAAS,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,KAAK,UAAU,CAAC;YAAE,OAAO,IAAI,CAAC;QACpG,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,KAAK,UAAU,CAAC,CAAC;QAC9E,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;QAC3E,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC;QACpC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;QAC1E,OAAO,IAAI,CAAC,EAAE,CAAC;IACjB,CAAC,CAAC,CAAC;IACH,OAAO,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AAC5E,CAAC;AAED,mCAAmC;AACnC,MAAM,UAAU,QAAQ,CAAC,UAAkB,EAAE,IAAY,EAAE,OAAgB;IACzE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;AACjE,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { Ctx, Stored } from '@kvman/sdk';
|
|
2
|
+
import { type QuestionKind } from '../connectors/ask.ts';
|
|
3
|
+
import { type JsonValue } from '../connector-call.ts';
|
|
4
|
+
import type { SessionTools } from '../prompt/session-prompt.ts';
|
|
5
|
+
import type { HeldResult, SessionDoc } from '../schemas/records.ts';
|
|
6
|
+
export type ToolCall = {
|
|
7
|
+
id: string;
|
|
8
|
+
name: string;
|
|
9
|
+
arguments: Record<string, JsonValue>;
|
|
10
|
+
};
|
|
11
|
+
export type CallOutcome = {
|
|
12
|
+
kind: 'result';
|
|
13
|
+
held: HeldResult;
|
|
14
|
+
} | {
|
|
15
|
+
kind: 'question';
|
|
16
|
+
questionKind: QuestionKind;
|
|
17
|
+
question: Record<string, JsonValue>;
|
|
18
|
+
} | {
|
|
19
|
+
kind: 'subagent';
|
|
20
|
+
childSessionId: string;
|
|
21
|
+
} | {
|
|
22
|
+
kind: 'worker';
|
|
23
|
+
runId: string;
|
|
24
|
+
};
|
|
25
|
+
export type CallEnv = {
|
|
26
|
+
ctx: Ctx;
|
|
27
|
+
session: Stored<SessionDoc>;
|
|
28
|
+
tools: SessionTools;
|
|
29
|
+
approval: 'ask' | 'auto';
|
|
30
|
+
};
|
|
31
|
+
export declare function evaluateCall(env: CallEnv, toolCall: ToolCall): Promise<CallOutcome>;
|
|
32
|
+
/** Runs an approved call held in the turn. */
|
|
33
|
+
export declare function runApproved(ctx: Ctx, session: Stored<SessionDoc>, held: HeldResult): Promise<HeldResult>;
|
|
34
|
+
//# sourceMappingURL=run-calls.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-calls.d.ts","sourceRoot":"","sources":["../../src/turns/run-calls.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAAa,KAAK,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAMpE,OAAO,EAA8F,KAAK,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAClJ,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAEhE,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAUpE,MAAM,MAAM,QAAQ,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;CAAE,CAAC;AAE1F,MAAM,MAAM,WAAW,GACnB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,UAAU,CAAA;CAAE,GACpC;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,YAAY,EAAE,YAAY,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;CAAE,GACrF;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,GAC5C;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtC,MAAM,MAAM,OAAO,GAAG;IAAE,GAAG,EAAE,GAAG,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;IAAC,KAAK,EAAE,YAAY,CAAC;IAAC,QAAQ,EAAE,KAAK,GAAG,MAAM,CAAA;CAAE,CAAC;AA4C/G,wBAAsB,YAAY,CAAC,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,WAAW,CAAC,CAoBzF;AAKD,8CAA8C;AAC9C,wBAAsB,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAO9G"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { isAskKind } from "../connectors/ask.js";
|
|
2
|
+
import { payloadJsonSchema } from "../connectors/connector-command.js";
|
|
3
|
+
import { parseRunArgs } from "../calls/run-tool.js";
|
|
4
|
+
import { createChild, delegateRunSchema, startChild } from "../connectors/delegate.js";
|
|
5
|
+
import { createRun, launchRun } from "../delegate/runs.js";
|
|
6
|
+
import { availableWorker, isProgram } from "../delegate/workers.js";
|
|
7
|
+
import { builtinConnectors, errorOutput, invalidPayloadOutput, noCommandMessage, noConnectorMessage } from "../connector-call.js";
|
|
8
|
+
import { activeConnectors } from "../registry/register-connectors.js";
|
|
9
|
+
import { now } from "../sessions/session-lookup.js";
|
|
10
|
+
import { records } from "../store/collections.js";
|
|
11
|
+
import { commandNamesOf, failedCall, runHelp, runTarget, targetOf, textResult } from "./run-command.js";
|
|
12
|
+
const result = (toolCallId, done) => ({ kind: 'result', held: { toolCallId, ...done, run: null } });
|
|
13
|
+
// A call whose arguments never made a connector command: there is nothing for a card to show.
|
|
14
|
+
const refused = (toolCallId, message) => result(toolCallId, { text: errorOutput({ code: 'VALIDATION_FAILED', message }).output, details: null, isError: true });
|
|
15
|
+
// Why a session can't call a connector: a subagent wasn't given it, or there is none by that name; one that is turned
|
|
16
|
+
// off counts as none (ADR 0014, 7).
|
|
17
|
+
function unavailable(env, connector) {
|
|
18
|
+
const known = builtinConnectors.some((name) => name === connector) || env.tools.connectors.some((candidate) => candidate.name === connector);
|
|
19
|
+
if (known && !env.tools.disabled.has(connector) && env.session.parentId !== null)
|
|
20
|
+
return `${connector} isn't available in this subagent.`;
|
|
21
|
+
return noConnectorMessage(connector, env.tools.listed.map((listed) => listed.name));
|
|
22
|
+
}
|
|
23
|
+
// The payload of a call that asks, checked before the person is asked about it.
|
|
24
|
+
function invalidPayload(call, target) {
|
|
25
|
+
if (target.builtin === undefined)
|
|
26
|
+
return undefined;
|
|
27
|
+
const parsed = target.builtin.payload.safeParse(call.payload);
|
|
28
|
+
if (parsed.success)
|
|
29
|
+
return undefined;
|
|
30
|
+
const issues = parsed.error.issues.map((issue) => ({ path: issue.path.map(String).join('.'), message: issue.message }));
|
|
31
|
+
return invalidPayloadOutput(call, issues, payloadJsonSchema(target.builtin.payload)).output;
|
|
32
|
+
}
|
|
33
|
+
// A checked `delegate run` (ADR 0021): a subagent worker's child session, or a program worker's run, either of which
|
|
34
|
+
// the turn waits on or which runs in the background. A program worker may ask the person first (ADR 0021, 12).
|
|
35
|
+
async function delegateOutcome(env, toolCallId, call) {
|
|
36
|
+
const { ctx, session } = env;
|
|
37
|
+
const run = delegateRunSchema.parse(call.payload);
|
|
38
|
+
const worker = await availableWorker(ctx, session.checks, run.worker);
|
|
39
|
+
if (isProgram(worker)) {
|
|
40
|
+
if (worker.approval === 'ask')
|
|
41
|
+
return { kind: 'question', questionKind: 'approval', question: call };
|
|
42
|
+
const started = await createRun(ctx, session.id, worker, { description: call.description, task: run.task }, run.background === true ? null : toolCallId);
|
|
43
|
+
if (run.background !== true)
|
|
44
|
+
return { kind: 'worker', runId: started.id };
|
|
45
|
+
await launchRun(ctx, started.id);
|
|
46
|
+
return result(toolCallId, textResult(call, `started ${started.id}`));
|
|
47
|
+
}
|
|
48
|
+
const childId = await createChild(ctx, session, worker, run.task);
|
|
49
|
+
if (run.background !== true)
|
|
50
|
+
return { kind: 'subagent', childSessionId: childId };
|
|
51
|
+
await records(ctx.store).background.insert({ sessionId: session.id, ref: childId, kind: 'subagent', call: call.description, startedAt: now() });
|
|
52
|
+
await startChild(ctx, childId);
|
|
53
|
+
return result(toolCallId, textResult(call, `started ${childId}`));
|
|
54
|
+
}
|
|
55
|
+
export async function evaluateCall(env, toolCall) {
|
|
56
|
+
const { ctx, session, tools } = env;
|
|
57
|
+
if (toolCall.name !== 'run')
|
|
58
|
+
return refused(toolCall.id, `The call's arguments are invalid: the tool is run, not ${toolCall.name}.`);
|
|
59
|
+
const args = parseRunArgs(toolCall.arguments);
|
|
60
|
+
if (!args.success)
|
|
61
|
+
return refused(toolCall.id, `The call's arguments are invalid: ${args.problems}. Call run again with the arguments fixed.`);
|
|
62
|
+
const call = args.data;
|
|
63
|
+
if (!tools.listed.some((listed) => listed.name === call.connector))
|
|
64
|
+
return refused(toolCall.id, unavailable(env, call.connector));
|
|
65
|
+
if (call.command === 'help')
|
|
66
|
+
return result(toolCall.id, await runHelp(ctx, call));
|
|
67
|
+
const target = targetOf(tools.connectors, call);
|
|
68
|
+
if (target === undefined)
|
|
69
|
+
return result(toolCall.id, failedCall(call, errorOutput({ code: 'NOT_FOUND', message: noCommandMessage(call.connector, call.command, commandNamesOf(tools.connectors, call.connector)) }).output));
|
|
70
|
+
if (target.builtin?.asks === true) {
|
|
71
|
+
const invalid = invalidPayload(call, target);
|
|
72
|
+
if (invalid !== undefined)
|
|
73
|
+
return result(toolCall.id, failedCall(call, invalid));
|
|
74
|
+
if (env.approval === 'ask' || call.payload['risky'] !== false)
|
|
75
|
+
return { kind: 'question', questionKind: 'approval', question: call };
|
|
76
|
+
}
|
|
77
|
+
if (target.asks === true)
|
|
78
|
+
return { kind: 'question', questionKind: 'approval', question: call };
|
|
79
|
+
const done = await runTarget(ctx, session, call, target);
|
|
80
|
+
if (done.isError || (call.connector !== 'ask' && call.connector !== 'delegate'))
|
|
81
|
+
return result(toolCall.id, done);
|
|
82
|
+
if (call.connector === 'delegate')
|
|
83
|
+
return delegateOutcome(env, toolCall.id, call);
|
|
84
|
+
return isAskKind(call.command) ? { kind: 'question', questionKind: call.command, question: call.payload } : result(toolCall.id, done);
|
|
85
|
+
}
|
|
86
|
+
/** What an approved call of the old shell tool returns: it is never run (ADR 0011, 12). */
|
|
87
|
+
const oldCallText = 'denied by the user\nMake this call again with the run tool.';
|
|
88
|
+
/** Runs an approved call held in the turn. */
|
|
89
|
+
export async function runApproved(ctx, session, held) {
|
|
90
|
+
if (held.run === null)
|
|
91
|
+
return held;
|
|
92
|
+
if (!('connector' in held.run))
|
|
93
|
+
return { toolCallId: held.toolCallId, text: oldCallText, details: null, isError: true, run: null };
|
|
94
|
+
const connectors = await activeConnectors(ctx);
|
|
95
|
+
const target = targetOf(connectors, held.run);
|
|
96
|
+
const done = target === undefined ? failedCall(held.run, errorOutput({ code: 'NOT_FOUND', message: noCommandMessage(held.run.connector, held.run.command, commandNamesOf(connectors, held.run.connector)) }).output) : await runTarget(ctx, session, held.run, target);
|
|
97
|
+
return { toolCallId: held.toolCallId, ...done, run: null };
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=run-calls.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-calls.js","sourceRoot":"","sources":["../../src/turns/run-calls.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { type Ctx, type Stored } from '@kvman/sdk';
|
|
2
|
+
import { type ConnectorCommand } from '../connectors/connector-command.ts';
|
|
3
|
+
import type { RunCall } from '../calls/run-tool.ts';
|
|
4
|
+
import type { ConnectorRow } from '../registry/register-connectors.ts';
|
|
5
|
+
import type { HeldResult, SessionDoc } from '../schemas/records.ts';
|
|
6
|
+
/** A call's result before it is held for its tool call. */
|
|
7
|
+
export type CallDone = Pick<HeldResult, 'text' | 'details' | 'isError'>;
|
|
8
|
+
/** The kernel job behind a connector command; `builtin` is set for kvcoder's own, and `asks` for a registered command the person approves first. */
|
|
9
|
+
export type CommandTarget = {
|
|
10
|
+
registration: string;
|
|
11
|
+
builtin?: ConnectorCommand;
|
|
12
|
+
asks?: boolean;
|
|
13
|
+
};
|
|
14
|
+
/** The job a call's connector command runs, or `undefined` when the connector has no such command. */
|
|
15
|
+
export declare function targetOf(connectors: readonly ConnectorRow[], call: Pick<RunCall, 'connector' | 'command'>): CommandTarget | undefined;
|
|
16
|
+
/** The commands a connector has, besides `help`, as a failed call lists them: one of kvcoder's own with its payload's signature (ADR 0012, 19). */
|
|
17
|
+
export declare function commandNamesOf(connectors: readonly ConnectorRow[], name: string): string[];
|
|
18
|
+
/** A call that failed before or while it ran: the error the model reads. */
|
|
19
|
+
export declare function failedCall(call: RunCall, output: string, durationMs?: number): CallDone;
|
|
20
|
+
/** A call whose result is plain text, such as help. */
|
|
21
|
+
export declare function textResult(call: RunCall, text: string, durationMs?: number): CallDone;
|
|
22
|
+
/** Runs a connector command through `ctx.exec`, after the calls before it on the same file or artifact, and gives what the model and the call card get. */
|
|
23
|
+
export declare function runTarget(ctx: Ctx, session: Stored<SessionDoc>, call: RunCall, target: CommandTarget): Promise<CallDone>;
|
|
24
|
+
/** A connector's `help`, or one command's with `{ command }` (plan 08 §8.3). It never asks. */
|
|
25
|
+
export declare function runHelp(ctx: Ctx, call: RunCall): Promise<CallDone>;
|
|
26
|
+
//# sourceMappingURL=run-command.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-command.d.ts","sourceRoot":"","sources":["../../src/turns/run-command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAK,KAAK,GAAG,EAAE,KAAK,MAAM,EAAE,MAAM,YAAY,CAAC;AAOtD,OAAO,EAAqB,KAAK,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AAC9F,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAKpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAEvE,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAMpE,2DAA2D;AAC3D,MAAM,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAAC,CAAC;AAExE,oJAAoJ;AACpJ,MAAM,MAAM,aAAa,GAAG;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,gBAAgB,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAEjG,sGAAsG;AACtG,wBAAgB,QAAQ,CAAC,UAAU,EAAE,SAAS,YAAY,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,SAAS,CAAC,GAAG,aAAa,GAAG,SAAS,CAUrI;AAED,mJAAmJ;AACnJ,wBAAgB,cAAc,CAAC,UAAU,EAAE,SAAS,YAAY,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAK1F;AA2BD,4EAA4E;AAC5E,wBAAgB,UAAU,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,SAAI,GAAG,QAAQ,CAElF;AAED,uDAAuD;AACvD,wBAAgB,UAAU,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,SAAI,GAAG,QAAQ,CAEhF;AAED,2JAA2J;AAC3J,wBAAgB,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,QAAQ,CAAC,CAGxH;AAiCD,+FAA+F;AAC/F,wBAAsB,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,CAaxE"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { z } from '@kvman/sdk';
|
|
2
|
+
import { chatIdOf } from "../artifacts/artifact-records.js";
|
|
3
|
+
import { lineRunIsError, lineRunSchema, lineRunText } from "../calls/line-run.js";
|
|
4
|
+
import { artifactCard } from "../connectors/artifact.js";
|
|
5
|
+
import { binaryExec } from "../connectors/binary.js";
|
|
6
|
+
import { mcpCallSchema } from "../connectors/mcp.js";
|
|
7
|
+
import { builtinCommands, builtinSignatures, commandsOf } from "../connectors/builtin-connectors.js";
|
|
8
|
+
import { payloadJsonSchema } from "../connectors/connector-command.js";
|
|
9
|
+
import { inOrder } from "../files/file-queue.js";
|
|
10
|
+
import { lexicalPath } from "../files/workspace-path.js";
|
|
11
|
+
import { builtinConnectors, errorOutput, jsonOutput, runCommand } from "../connector-call.js";
|
|
12
|
+
import { callInfos } from "../registry/loaded.js";
|
|
13
|
+
import { truncate } from "../result-text.js";
|
|
14
|
+
/** The job a call's connector command runs, or `undefined` when the connector has no such command. */
|
|
15
|
+
export function targetOf(connectors, call) {
|
|
16
|
+
const builtin = builtinConnectors.find((name) => name === call.connector);
|
|
17
|
+
if (builtin !== undefined) {
|
|
18
|
+
const entry = commandsOf(builtin)[call.command];
|
|
19
|
+
return entry === undefined ? undefined : { registration: entry.registration, builtin: entry };
|
|
20
|
+
}
|
|
21
|
+
const connector = connectors.find((candidate) => candidate.name === call.connector);
|
|
22
|
+
if (connector?.kind === 'binary')
|
|
23
|
+
return call.command === 'exec' ? { registration: binaryExec.registration, builtin: binaryExec } : undefined;
|
|
24
|
+
const command = connector?.commands?.find((candidate) => candidate.name === call.command);
|
|
25
|
+
return command === undefined ? undefined : { registration: command.command, asks: command.asks };
|
|
26
|
+
}
|
|
27
|
+
/** The commands a connector has, besides `help`, as a failed call lists them: one of kvcoder's own with its payload's signature (ADR 0012, 19). */
|
|
28
|
+
export function commandNamesOf(connectors, name) {
|
|
29
|
+
const builtin = builtinConnectors.find((candidate) => candidate === name);
|
|
30
|
+
if (builtin !== undefined)
|
|
31
|
+
return Object.keys(commandsOf(builtin)).map((command, index) => `${command} ${builtinSignatures[builtin][index] ?? ''}`.trimEnd());
|
|
32
|
+
const connector = connectors.find((candidate) => candidate.name === name);
|
|
33
|
+
return connector?.kind === 'binary' ? ['exec'] : (connector?.commands ?? []).map((command) => command.name);
|
|
34
|
+
}
|
|
35
|
+
const shellRun = builtinCommands.shell.exec.registration;
|
|
36
|
+
const mcpCall = builtinCommands.mcp.call.registration;
|
|
37
|
+
const artifactChanges = new Set([builtinCommands.artifact.write.registration, builtinCommands.artifact.edit.registration]);
|
|
38
|
+
const artifactCalls = new Set([...artifactChanges, builtinCommands.artifact.get.registration]);
|
|
39
|
+
const fileChanges = new Set([builtinCommands.fs.write.registration, builtinCommands.fs.edit.registration]);
|
|
40
|
+
// What a call must wait its turn on (plan 08 §8.5, ADR 0009, 160): the calls of a reply start together, and two edits
|
|
41
|
+
// that each read the original would lose the first one's write. The key is taken as the calls start, in the model's order.
|
|
42
|
+
function orderKey(ctx, session, call, target) {
|
|
43
|
+
const { path: file, id } = call.payload;
|
|
44
|
+
if (fileChanges.has(target.registration) && typeof file === 'string')
|
|
45
|
+
return `fs:${lexicalPath(ctx.job.workspace.path, file)}`;
|
|
46
|
+
return artifactCalls.has(target.registration) && typeof id === 'string' ? `artifact:${chatIdOf(session)}:${id}` : undefined;
|
|
47
|
+
}
|
|
48
|
+
// A built-in command's job takes the chat and the payload; a line in the real shell also takes the words that name a
|
|
49
|
+
// background run, and a binary its connector. A registered command takes the payload as its whole input.
|
|
50
|
+
function jobInput(sessionId, call, target) {
|
|
51
|
+
if (target.builtin === undefined)
|
|
52
|
+
return call.payload;
|
|
53
|
+
const input = { sessionId, payload: call.payload };
|
|
54
|
+
if (target.registration === shellRun)
|
|
55
|
+
return { ...input, description: call.description };
|
|
56
|
+
return target.registration === binaryExec.registration ? { ...input, description: call.description, connector: call.connector } : input;
|
|
57
|
+
}
|
|
58
|
+
const words = (call) => ({ description: call.description, connector: call.connector, command: call.command });
|
|
59
|
+
/** A call that failed before or while it ran: the error the model reads. */
|
|
60
|
+
export function failedCall(call, output, durationMs = 0) {
|
|
61
|
+
return { text: output, isError: true, details: { ...words(call), output, durationMs } };
|
|
62
|
+
}
|
|
63
|
+
/** A call whose result is plain text, such as help. */
|
|
64
|
+
export function textResult(call, text, durationMs = 0) {
|
|
65
|
+
return { text, isError: false, details: { ...words(call), output: text, durationMs } };
|
|
66
|
+
}
|
|
67
|
+
/** Runs a connector command through `ctx.exec`, after the calls before it on the same file or artifact, and gives what the model and the call card get. */
|
|
68
|
+
export function runTarget(ctx, session, call, target) {
|
|
69
|
+
const key = orderKey(ctx, session, call, target);
|
|
70
|
+
return key === undefined ? runJob(ctx, session.id, call, target) : inOrder(key, () => runJob(ctx, session.id, call, target));
|
|
71
|
+
}
|
|
72
|
+
async function runJob(ctx, sessionId, call, target) {
|
|
73
|
+
const started = Date.now();
|
|
74
|
+
const builtin = target.builtin;
|
|
75
|
+
const done = await runCommand({
|
|
76
|
+
connector: call.connector,
|
|
77
|
+
command: call.command,
|
|
78
|
+
payloadPath: builtin === undefined ? '' : 'payload',
|
|
79
|
+
exec: () => ctx.exec(target.registration, jobInput(sessionId, call, target)),
|
|
80
|
+
payloadSchema: async () => (builtin === undefined ? (await callInfos(ctx)).find((info) => info.name === target.registration)?.input : payloadJsonSchema(builtin.payload)),
|
|
81
|
+
cancelled: () => ctx.job.signal.aborted,
|
|
82
|
+
});
|
|
83
|
+
if (!done.ok)
|
|
84
|
+
return failedCall(call, done.result.output, Date.now() - started);
|
|
85
|
+
if (target.registration === shellRun || target.registration === binaryExec.registration) {
|
|
86
|
+
const run = lineRunSchema.parse(done.value);
|
|
87
|
+
const details = { ...words(call), output: run.output, durationMs: run.durationMs, ...(run.exitCode === null ? {} : { exitCode: run.exitCode }), ...(run.timedOut ? { timedOut: true } : {}), ...(run.jobId === null ? {} : { background: true, jobId: run.jobId }) };
|
|
88
|
+
return { text: lineRunText(run), isError: lineRunIsError(run), details };
|
|
89
|
+
}
|
|
90
|
+
if (target.registration === mcpCall) {
|
|
91
|
+
const called = mcpCallSchema.parse(done.value);
|
|
92
|
+
const output = truncate(called.text);
|
|
93
|
+
return { text: output, isError: called.isError, details: { ...words(call), output, durationMs: Date.now() - started } };
|
|
94
|
+
}
|
|
95
|
+
const output = jsonOutput(done.value).output;
|
|
96
|
+
const text = builtin?.bounded === true ? output : truncate(output);
|
|
97
|
+
const artifactId = artifactChanges.has(target.registration) ? call.payload['id'] : undefined;
|
|
98
|
+
const artifact = typeof artifactId === 'string' ? await artifactCard(ctx, sessionId, artifactId) : undefined;
|
|
99
|
+
return { text, isError: false, details: { ...words(call), output: text, durationMs: Date.now() - started, ...(artifact === undefined ? {} : { artifact }) } };
|
|
100
|
+
}
|
|
101
|
+
const helpSchema = z.object({ text: z.string() });
|
|
102
|
+
/** A connector's `help`, or one command's with `{ command }` (plan 08 §8.3). It never asks. */
|
|
103
|
+
export async function runHelp(ctx, call) {
|
|
104
|
+
const { command, ...rest } = call.payload;
|
|
105
|
+
if (Object.keys(rest).length > 0 || (command !== undefined && typeof command !== 'string'))
|
|
106
|
+
return failedCall(call, errorOutput({ code: 'VALIDATION_FAILED', message: 'help takes { "command"? }.' }).output);
|
|
107
|
+
const started = Date.now();
|
|
108
|
+
const done = await runCommand({
|
|
109
|
+
connector: call.connector,
|
|
110
|
+
command: call.command,
|
|
111
|
+
payloadPath: '',
|
|
112
|
+
exec: () => ctx.exec('kvcoder.connector.help.get', { connector: call.connector, ...(command === undefined ? {} : { command }) }),
|
|
113
|
+
payloadSchema: () => Promise.resolve(undefined),
|
|
114
|
+
cancelled: () => ctx.job.signal.aborted,
|
|
115
|
+
});
|
|
116
|
+
return done.ok ? textResult(call, helpSchema.parse(done.value).text, Date.now() - started) : failedCall(call, done.result.output, Date.now() - started);
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=run-command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-command.js","sourceRoot":"","sources":["../../src/turns/run-command.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { Ctx, Stored } from '@kvman/sdk';
|
|
2
|
+
import type { HeldResult, SessionDoc, TurnDoc } from '../schemas/records.ts';
|
|
3
|
+
import { type TxRecords } from '../store/collections.ts';
|
|
4
|
+
import type { CallOutcome, ToolCall } from './run-calls.ts';
|
|
5
|
+
type Calls = TurnDoc['calls'];
|
|
6
|
+
/** Appends a step's results as toolResult messages, in the model's call order. */
|
|
7
|
+
export declare function appendResults(store: TxRecords, session: Stored<SessionDoc>, turnId: string, calls: Calls, results: readonly HeldResult[]): void;
|
|
8
|
+
/** The running turn inside a transaction, if `turnId` still is it. */
|
|
9
|
+
export declare function liveTurn(store: TxRecords, sessionId: string, turnId: string): {
|
|
10
|
+
session: Stored<SessionDoc>;
|
|
11
|
+
turn: Stored<TurnDoc>;
|
|
12
|
+
} | undefined;
|
|
13
|
+
/** Queues the next step, or ends the turn at `kvcoder.maxSteps` (ADR 0009, 102). */
|
|
14
|
+
export declare function continueTurn(ctx: Ctx, sessionId: string, turnId: string, maxSteps: number): Promise<void>;
|
|
15
|
+
export declare function settleCalls(ctx: Ctx, sessionId: string, turnId: string, calls: readonly ToolCall[], outcomes: readonly CallOutcome[], maxSteps: number): Promise<void>;
|
|
16
|
+
export {};
|
|
17
|
+
//# sourceMappingURL=settle-calls.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settle-calls.d.ts","sourceRoot":"","sources":["../../src/turns/settle-calls.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAI9C,OAAO,KAAK,EAAE,UAAU,EAAsB,UAAU,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAEjG,OAAO,EAAsB,KAAK,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAG7E,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAO5D,KAAK,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;AAE9B,kFAAkF;AAClF,wBAAgB,aAAa,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,UAAU,EAAE,GAAG,IAAI,CAO/I;AAED,sEAAsE;AACtE,wBAAgB,QAAQ,CAAC,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,CAAA;CAAE,GAAG,SAAS,CAKhJ;AAED,oFAAoF;AACpF,wBAAsB,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAI/G;AAUD,wBAAsB,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,QAAQ,EAAE,EAAE,QAAQ,EAAE,SAAS,WAAW,EAAE,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAkC5K"}
|