@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,73 @@
|
|
|
1
|
+
import { z } from '@kvman/sdk';
|
|
2
|
+
import { builtinConnectors, noCommandMessage } from "../connector-call.js";
|
|
3
|
+
import { notFound } from "../problems.js";
|
|
4
|
+
import { callInfos } from "../registry/loaded.js";
|
|
5
|
+
import { activeConnectors } from "../registry/register-connectors.js";
|
|
6
|
+
import { truncate } from "../result-text.js";
|
|
7
|
+
import { binaryExec } from "../connectors/binary.js";
|
|
8
|
+
import { builtinDescriptions, commandsOf } from "../connectors/builtin-connectors.js";
|
|
9
|
+
import { payloadJsonSchema } from "../connectors/connector-command.js";
|
|
10
|
+
import { commandHelp, connectorHelp } from "./help-text.js";
|
|
11
|
+
import { runShell } from "./run-shell.js";
|
|
12
|
+
import { shellFor } from "./shell-program.js";
|
|
13
|
+
// `help` of any connector (plan 08 §8.3 and §8.4, ADR 0011, 4 and 5): the connector's commands, or one command's
|
|
14
|
+
// payload, result, and examples. A binary connector's help also prints the program's own.
|
|
15
|
+
const asksNote = 'The person is asked before this runs.';
|
|
16
|
+
const programHelpTimeoutMs = 5_000;
|
|
17
|
+
const builtinDetail = (name, command) => ({ name, description: command.description, notes: command.notes, payload: payloadJsonSchema(command.payload), result: command.result ?? {}, examples: [] });
|
|
18
|
+
// A built-in command's result is what its table entry says, or the output schema its registration has.
|
|
19
|
+
async function builtinHelp(ctx, connector, command) {
|
|
20
|
+
const commands = commandsOf(connector);
|
|
21
|
+
if (command === undefined)
|
|
22
|
+
return connectorHelp(connector, builtinDescriptions((await shellFor(ctx)).kind)[connector], Object.entries(commands).map(([name, entry]) => ({ name, description: entry.description })));
|
|
23
|
+
const found = commands[command];
|
|
24
|
+
if (found === undefined)
|
|
25
|
+
throw notFound(noCommandMessage(connector, command, Object.keys(commands)), { connector, command });
|
|
26
|
+
const result = found.result ?? (await callInfos(ctx)).find((info) => info.name === found.registration)?.output ?? {};
|
|
27
|
+
return commandHelp(connector, { ...builtinDetail(command, found), result });
|
|
28
|
+
}
|
|
29
|
+
async function commandsHelp(ctx, connector, command) {
|
|
30
|
+
const infos = await callInfos(ctx);
|
|
31
|
+
const commands = connector.commands ?? [];
|
|
32
|
+
const info = (name) => infos.find((candidate) => candidate.name === name);
|
|
33
|
+
if (command === undefined)
|
|
34
|
+
return connectorHelp(connector.name, connector.description, commands.map((entry) => ({ name: entry.name, description: info(entry.command)?.description ?? '' })));
|
|
35
|
+
const found = commands.find((entry) => entry.name === command);
|
|
36
|
+
if (found === undefined)
|
|
37
|
+
throw notFound(noCommandMessage(connector.name, command, commands.map((entry) => entry.name)), { connector: connector.name, command });
|
|
38
|
+
const registered = info(found.command);
|
|
39
|
+
return commandHelp(connector.name, { name: found.name, description: registered?.description ?? '', notes: found.asks ? asksNote : undefined, payload: registered?.input ?? {}, result: registered?.output ?? {}, examples: found.examples });
|
|
40
|
+
}
|
|
41
|
+
// The line that prints a program's help: `<name> [command] --help`, or the registered line with `{command}` filled in.
|
|
42
|
+
function programHelpLine(connector, command) {
|
|
43
|
+
const template = connector.binary?.help ?? `${connector.name} {command} --help`;
|
|
44
|
+
return template.replaceAll('{command}', command ?? '').replace(/ {2,}/g, ' ').trim();
|
|
45
|
+
}
|
|
46
|
+
async function binaryHelp(ctx, connector, command) {
|
|
47
|
+
if (command === 'exec')
|
|
48
|
+
return commandHelp(connector.name, builtinDetail('exec', binaryExec));
|
|
49
|
+
const line = programHelpLine(connector, command);
|
|
50
|
+
const run = await runShell(await shellFor(ctx), line, ctx.job.workspace.path, programHelpTimeoutMs, ctx.job.signal);
|
|
51
|
+
const program = `${line}:\n${truncate(run.output).replace(/[\r\n]+$/, '')}`;
|
|
52
|
+
if (command !== undefined)
|
|
53
|
+
return program;
|
|
54
|
+
return `${connectorHelp(connector.name, connector.description, [{ name: 'exec', description: binaryExec.description }])}\n\n${program}`;
|
|
55
|
+
}
|
|
56
|
+
async function helpText(ctx, name, command) {
|
|
57
|
+
const builtin = builtinConnectors.find((candidate) => candidate === name);
|
|
58
|
+
if (builtin !== undefined)
|
|
59
|
+
return builtinHelp(ctx, builtin, command);
|
|
60
|
+
const connector = (await activeConnectors(ctx)).find((candidate) => candidate.name === name);
|
|
61
|
+
if (connector === undefined)
|
|
62
|
+
throw notFound(`There is no connector ${name}.`, { connector: name });
|
|
63
|
+
return connector.kind === 'binary' ? binaryHelp(ctx, connector, command) : commandsHelp(ctx, connector, command);
|
|
64
|
+
}
|
|
65
|
+
export function registerConnectorHelp(ctx) {
|
|
66
|
+
ctx.registerQuery('kvcoder.connector.help.get', {
|
|
67
|
+
description: "Gives a connector's help: its commands, or one command's payload, result, and examples.",
|
|
68
|
+
input: z.strictObject({ connector: z.string().min(1).describe('The connector to describe.'), command: z.string().min(1).describe('The one command to describe; the whole connector when left out.').exactOptional() }),
|
|
69
|
+
output: z.object({ text: z.string() }),
|
|
70
|
+
handle: async ({ connector, command }) => ({ text: await helpText(ctx, connector, command) }),
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=connector-help.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connector-help.js","sourceRoot":"","sources":["../../src/calls/connector-help.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { Json } from '@kvman/sdk';
|
|
2
|
+
export type HelpCommand = {
|
|
3
|
+
name: string;
|
|
4
|
+
description: string;
|
|
5
|
+
};
|
|
6
|
+
export type HelpDetail = HelpCommand & {
|
|
7
|
+
notes?: string | undefined;
|
|
8
|
+
payload: Json;
|
|
9
|
+
result: Json | string;
|
|
10
|
+
examples: readonly {
|
|
11
|
+
description: string;
|
|
12
|
+
input: Json;
|
|
13
|
+
}[];
|
|
14
|
+
};
|
|
15
|
+
/** A connector's own help: what it is for, and each command with its description. */
|
|
16
|
+
export declare function connectorHelp(name: string, description: string, commands: readonly HelpCommand[]): string;
|
|
17
|
+
/** One command's help: its payload and result, and its examples as `run` arguments. */
|
|
18
|
+
export declare function commandHelp(connector: string, command: HelpDetail): string;
|
|
19
|
+
//# sourceMappingURL=help-text.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"help-text.d.ts","sourceRoot":"","sources":["../../src/calls/help-text.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAKvC,MAAM,MAAM,WAAW,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAAC;AAEhE,MAAM,MAAM,UAAU,GAAG,WAAW,GAAG;IAAE,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,OAAO,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,IAAI,GAAG,MAAM,CAAC;IAAC,QAAQ,EAAE,SAAS;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,IAAI,CAAA;KAAE,EAAE,CAAA;CAAE,CAAC;AAIvK,qFAAqF;AACrF,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,WAAW,EAAE,GAAG,MAAM,CAWzG;AAED,uFAAuF;AACvF,wBAAgB,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,GAAG,MAAM,CAK1E"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
const helpCommand = { name: 'help', description: 'Describes this connector, or one command with { "command": "<name>" }.' };
|
|
2
|
+
/** A connector's own help: what it is for, and each command with its description. */
|
|
3
|
+
export function connectorHelp(name, description, commands) {
|
|
4
|
+
const listed = [...commands, helpCommand];
|
|
5
|
+
const width = Math.max(...listed.map((command) => command.name.length));
|
|
6
|
+
return [
|
|
7
|
+
`${name}: ${description}`,
|
|
8
|
+
'',
|
|
9
|
+
'Commands:',
|
|
10
|
+
...listed.map((command) => ` ${command.name.padEnd(width)} ${command.description}`),
|
|
11
|
+
'',
|
|
12
|
+
'Call help with { "command": "<name>" } for a command\'s payload, result, and examples.',
|
|
13
|
+
].join('\n');
|
|
14
|
+
}
|
|
15
|
+
/** One command's help: its payload and result, and its examples as `run` arguments. */
|
|
16
|
+
export function commandHelp(connector, command) {
|
|
17
|
+
const result = typeof command.result === 'string' ? [`Result: ${command.result}`] : ['Result (JSON Schema):', JSON.stringify(command.result, null, 2)];
|
|
18
|
+
const examples = command.examples.flatMap((example) => [` # ${example.description}`, ` { "connector": ${JSON.stringify(connector)}, "command": ${JSON.stringify(command.name)}, "payload": ${JSON.stringify(example.input)} }`]);
|
|
19
|
+
const notes = command.notes === undefined ? [] : ['', command.notes];
|
|
20
|
+
return [`${connector} ${command.name}: ${command.description}`, ...notes, '', 'Payload (JSON Schema):', JSON.stringify(command.payload, null, 2), '', ...result, ...(examples.length > 0 ? ['', 'Examples:', ...examples] : [])].join('\n');
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=help-text.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"help-text.js","sourceRoot":"","sources":["../../src/calls/help-text.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,GAAgB,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,wEAAwE,EAAE,CAAC;AAEzI,qFAAqF;AACrF,MAAM,UAAU,aAAa,CAAC,IAAY,EAAE,WAAmB,EAAE,QAAgC;IAC/F,MAAM,MAAM,GAAG,CAAC,GAAG,QAAQ,EAAE,WAAW,CAAC,CAAC;IAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IACxE,OAAO;QACL,GAAG,IAAI,KAAK,WAAW,EAAE;QACzB,EAAE;QACF,WAAW;QACX,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,OAAO,CAAC,WAAW,EAAE,CAAC;QACrF,EAAE;QACF,wFAAwF;KACzF,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,uFAAuF;AACvF,MAAM,UAAU,WAAW,CAAC,SAAiB,EAAE,OAAmB;IAChE,MAAM,MAAM,GAAG,OAAO,OAAO,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,WAAW,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,uBAAuB,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACvJ,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,OAAO,CAAC,WAAW,EAAE,EAAE,oBAAoB,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,gBAAgB,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,gBAAgB,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IACnO,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IACrE,OAAO,CAAC,GAAG,SAAS,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,CAAC,WAAW,EAAE,EAAE,GAAG,KAAK,EAAE,EAAE,EAAE,wBAAwB,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,GAAG,MAAM,EAAE,GAAG,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,WAAW,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC9O,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { z, type Ctx } from '@kvman/sdk';
|
|
2
|
+
export declare const lineRunSchema: z.ZodObject<{
|
|
3
|
+
output: z.ZodString;
|
|
4
|
+
exitCode: z.ZodNullable<z.ZodNumber>;
|
|
5
|
+
signal: z.ZodNullable<z.ZodString>;
|
|
6
|
+
timedOut: z.ZodBoolean;
|
|
7
|
+
leftoverStopped: z.ZodBoolean;
|
|
8
|
+
durationMs: z.ZodNumber;
|
|
9
|
+
timeoutMs: z.ZodNumber;
|
|
10
|
+
jobId: z.ZodNullable<z.ZodString>;
|
|
11
|
+
ended: z.ZodBoolean;
|
|
12
|
+
}, z.core.$strip>;
|
|
13
|
+
/** What a line's run gave: its output and exit code, or for a background run its id and how it stands. */
|
|
14
|
+
export type LineRun = z.output<typeof lineRunSchema>;
|
|
15
|
+
type LineOptions = {
|
|
16
|
+
background?: boolean | undefined;
|
|
17
|
+
timeoutMs?: number | undefined;
|
|
18
|
+
};
|
|
19
|
+
export declare function runLine(ctx: Ctx, call: {
|
|
20
|
+
sessionId: string;
|
|
21
|
+
description: string;
|
|
22
|
+
}, line: string, options: LineOptions): Promise<LineRun>;
|
|
23
|
+
/** What a line's run returns to the model (plan 08 §8.3, ADR 0012, 7). */
|
|
24
|
+
export declare function lineRunText(run: LineRun): string;
|
|
25
|
+
/** A run is an error when it exited non-zero, or was killed (ADR 0012, 7). */
|
|
26
|
+
export declare function lineRunIsError(run: LineRun): boolean;
|
|
27
|
+
/** The options of the jobs that run a line: it may run for the call's longest timeout, with room to report it. */
|
|
28
|
+
export declare const lineRunOptions: {
|
|
29
|
+
retries: number;
|
|
30
|
+
timeoutMs: number;
|
|
31
|
+
};
|
|
32
|
+
export {};
|
|
33
|
+
//# sourceMappingURL=line-run.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"line-run.d.ts","sourceRoot":"","sources":["../../src/calls/line-run.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,KAAK,GAAG,EAAE,MAAM,YAAY,CAAC;AAUzC,eAAO,MAAM,aAAa;;;;;;;;;;iBAUxB,CAAC;AAEH,0GAA0G;AAC1G,MAAM,MAAM,OAAO,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,aAAa,CAAC,CAAC;AAErD,KAAK,WAAW,GAAG;IAAE,UAAU,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CAAC;AAExF,wBAAsB,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAO9I;AAED,0EAA0E;AAC1E,wBAAgB,WAAW,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAahD;AAED,8EAA8E;AAC9E,wBAAgB,cAAc,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAGpD;AAED,kHAAkH;AAClH,eAAO,MAAM,cAAc;;;CAAqC,CAAC"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { z } from '@kvman/sdk';
|
|
2
|
+
import { startProcess } from "../jobs/process-run.js";
|
|
3
|
+
import { resultLines } from "../result-text.js";
|
|
4
|
+
import { runShell } from "./run-shell.js";
|
|
5
|
+
import { callTimeout } from "./shell-command.js";
|
|
6
|
+
import { shellFor } from "./shell-program.js";
|
|
7
|
+
// One line in the real shell, in the workspace folder (plan 08 §8.3): what `shell exec` and a binary connector's `exec`
|
|
8
|
+
// both do. It waits for the line, or with `background` starts it in the kernel's process service and returns its id.
|
|
9
|
+
export const lineRunSchema = z.object({
|
|
10
|
+
output: z.string(),
|
|
11
|
+
exitCode: z.number().int().nullable(),
|
|
12
|
+
signal: z.string().nullable(),
|
|
13
|
+
timedOut: z.boolean(),
|
|
14
|
+
leftoverStopped: z.boolean(),
|
|
15
|
+
durationMs: z.number(),
|
|
16
|
+
timeoutMs: z.number().int(),
|
|
17
|
+
jobId: z.string().nullable(),
|
|
18
|
+
ended: z.boolean(),
|
|
19
|
+
});
|
|
20
|
+
export async function runLine(ctx, call, line, options) {
|
|
21
|
+
const shell = await shellFor(ctx);
|
|
22
|
+
const timeoutMs = callTimeout(options.timeoutMs);
|
|
23
|
+
if (options.background !== true)
|
|
24
|
+
return { ...(await runShell(shell, line, ctx.job.workspace.path, timeoutMs, ctx.job.signal)), signal: null, timeoutMs, jobId: null, ended: true };
|
|
25
|
+
const started = Date.now();
|
|
26
|
+
const run = await startProcess(ctx, call.sessionId, shell, { title: call.description, line });
|
|
27
|
+
return { output: run.output, exitCode: run.exitCode, signal: run.signal, timedOut: false, leftoverStopped: false, durationMs: Date.now() - started, timeoutMs, jobId: run.jobId, ended: run.ended };
|
|
28
|
+
}
|
|
29
|
+
/** What a line's run returns to the model (plan 08 §8.3, ADR 0012, 7). */
|
|
30
|
+
export function lineRunText(run) {
|
|
31
|
+
if (run.jobId !== null) {
|
|
32
|
+
const output = run.output.replace(/[\r\n]+$/, '');
|
|
33
|
+
const lines = output === '' ? [`started ${run.jobId}`] : [`started ${run.jobId}`, output];
|
|
34
|
+
if (!run.ended)
|
|
35
|
+
return [...lines, '[running]'].join('\n');
|
|
36
|
+
if (run.exitCode !== null)
|
|
37
|
+
return [...lines, '[the process has already ended]', `[exit code ${run.exitCode}]`].join('\n');
|
|
38
|
+
if (run.signal !== null)
|
|
39
|
+
return [...lines, '[the process has already ended]', `[killed by ${run.signal}]`].join('\n');
|
|
40
|
+
return [...lines, '[the process has already ended]'].join('\n');
|
|
41
|
+
}
|
|
42
|
+
const timedOut = run.timedOut ? [`[timed out after ${Math.round(run.timeoutMs / 1000)} s; the process tree was killed]`] : [];
|
|
43
|
+
const leftover = !run.timedOut && run.leftoverStopped ? ['[background processes were stopped when the command ended; set background to true to keep one running]'] : [];
|
|
44
|
+
if (run.exitCode === null)
|
|
45
|
+
throw new Error('A foreground run always has an exit code.');
|
|
46
|
+
return resultLines(run.output, run.exitCode, [...timedOut, ...leftover]);
|
|
47
|
+
}
|
|
48
|
+
/** A run is an error when it exited non-zero, or was killed (ADR 0012, 7). */
|
|
49
|
+
export function lineRunIsError(run) {
|
|
50
|
+
if (run.signal !== null)
|
|
51
|
+
return true;
|
|
52
|
+
return run.exitCode !== null && run.exitCode !== 0;
|
|
53
|
+
}
|
|
54
|
+
/** The options of the jobs that run a line: it may run for the call's longest timeout, with room to report it. */
|
|
55
|
+
export const lineRunOptions = { retries: 0, timeoutMs: 660_000 };
|
|
56
|
+
//# sourceMappingURL=line-run.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"line-run.js","sourceRoot":"","sources":["../../src/calls/line-run.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { type ShellCommand } from './shell-command.ts';
|
|
2
|
+
export type ShellRun = {
|
|
3
|
+
output: string;
|
|
4
|
+
exitCode: number;
|
|
5
|
+
timedOut: boolean;
|
|
6
|
+
leftoverStopped: boolean;
|
|
7
|
+
durationMs: number;
|
|
8
|
+
};
|
|
9
|
+
/** Kills a process and everything it started: its group on Linux and macOS, `taskkill /T /F` on Windows. */
|
|
10
|
+
export declare function killTree(pid: number | undefined): void;
|
|
11
|
+
export declare function runShell(shell: ShellCommand, line: string, cwd: string, timeoutMs: number, signal: AbortSignal): Promise<ShellRun>;
|
|
12
|
+
//# sourceMappingURL=run-shell.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-shell.d.ts","sourceRoot":"","sources":["../../src/calls/run-shell.ts"],"names":[],"mappings":"AAEA,OAAO,EAAY,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAOjE,MAAM,MAAM,QAAQ,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAC;IAAC,eAAe,EAAE,OAAO,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC;AAgB7H,4GAA4G;AAC5G,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAQtD;AAuBD,wBAAgB,QAAQ,CAAC,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC,CAqClI"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
import { cutOutput, outputKept, outputLimit } from "../result-text.js";
|
|
3
|
+
import { treeKill } from "./shell-command.js";
|
|
4
|
+
/** How long output gets to drain once the shell has exited, for a process outside its group that still holds the pipe. */
|
|
5
|
+
const drainMs = 1_000;
|
|
6
|
+
// Whether the group had any process left to signal.
|
|
7
|
+
function signalGroup(pid, signal) {
|
|
8
|
+
try {
|
|
9
|
+
process.kill(-pid, signal);
|
|
10
|
+
return true;
|
|
11
|
+
}
|
|
12
|
+
catch (error) {
|
|
13
|
+
if (error instanceof Error && 'code' in error && error.code === 'ESRCH')
|
|
14
|
+
return false;
|
|
15
|
+
throw error;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
/** Kills a process and everything it started: its group on Linux and macOS, `taskkill /T /F` on Windows. */
|
|
19
|
+
export function killTree(pid) {
|
|
20
|
+
if (pid === undefined)
|
|
21
|
+
return;
|
|
22
|
+
const kill = treeKill(process.platform, pid);
|
|
23
|
+
if (kill.kind === 'taskkill') {
|
|
24
|
+
spawn(kill.program, kill.args, { stdio: 'ignore', windowsHide: true });
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
signalGroup(kill.pid, 'SIGKILL');
|
|
28
|
+
}
|
|
29
|
+
// Once the shell has exited the group holds only what it left behind. Windows has no such group to find.
|
|
30
|
+
function stopLeftover(pid) {
|
|
31
|
+
return pid !== undefined && process.platform !== 'win32' && signalGroup(pid, 'SIGKILL');
|
|
32
|
+
}
|
|
33
|
+
// Collects output, keeping everything up to the limit, then only the head and a rolling tail.
|
|
34
|
+
function outputCollector() {
|
|
35
|
+
let all = Buffer.alloc(0);
|
|
36
|
+
let tail = Buffer.alloc(0);
|
|
37
|
+
let total = 0;
|
|
38
|
+
return {
|
|
39
|
+
add: (chunk) => {
|
|
40
|
+
total += chunk.length;
|
|
41
|
+
if (all.length <= outputLimit)
|
|
42
|
+
all = Buffer.concat([all, chunk]);
|
|
43
|
+
tail = Buffer.concat([tail, chunk]);
|
|
44
|
+
if (tail.length > outputKept)
|
|
45
|
+
tail = tail.subarray(tail.length - outputKept);
|
|
46
|
+
},
|
|
47
|
+
text: () => (total <= outputLimit ? all.toString('utf8') : cutOutput(all.subarray(0, outputKept), total - 2 * outputKept, tail)),
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
export function runShell(shell, line, cwd, timeoutMs, signal) {
|
|
51
|
+
const started = Date.now();
|
|
52
|
+
return new Promise((resolve, reject) => {
|
|
53
|
+
const child = spawn(shell.program, shell.args(line), { cwd, stdio: ['ignore', 'pipe', 'pipe'], detached: process.platform !== 'win32', windowsHide: true });
|
|
54
|
+
const output = outputCollector();
|
|
55
|
+
let timedOut = false;
|
|
56
|
+
let leftoverStopped = false;
|
|
57
|
+
let drain;
|
|
58
|
+
child.stdout.on('data', output.add);
|
|
59
|
+
child.stderr.on('data', output.add);
|
|
60
|
+
const timer = setTimeout(() => {
|
|
61
|
+
timedOut = true;
|
|
62
|
+
killTree(child.pid);
|
|
63
|
+
}, timeoutMs);
|
|
64
|
+
const abort = () => killTree(child.pid);
|
|
65
|
+
signal.addEventListener('abort', abort, { once: true });
|
|
66
|
+
const settle = () => {
|
|
67
|
+
clearTimeout(timer);
|
|
68
|
+
clearTimeout(drain);
|
|
69
|
+
signal.removeEventListener('abort', abort);
|
|
70
|
+
};
|
|
71
|
+
child.once('error', (error) => {
|
|
72
|
+
settle();
|
|
73
|
+
reject(error);
|
|
74
|
+
});
|
|
75
|
+
child.once('exit', () => {
|
|
76
|
+
leftoverStopped = !timedOut && !signal.aborted && stopLeftover(child.pid);
|
|
77
|
+
drain = setTimeout(() => {
|
|
78
|
+
child.stdout.destroy();
|
|
79
|
+
child.stderr.destroy();
|
|
80
|
+
}, drainMs);
|
|
81
|
+
});
|
|
82
|
+
child.once('close', (code, killedBy) => {
|
|
83
|
+
settle();
|
|
84
|
+
resolve({ output: output.text(), exitCode: timedOut ? 124 : (code ?? (killedBy === null ? 1 : 137)), timedOut, leftoverStopped, durationMs: Date.now() - started });
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=run-shell.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-shell.js","sourceRoot":"","sources":["../../src/calls/run-shell.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { z } from '@kvman/sdk';
|
|
2
|
+
import type { JsonValue } from '../connector-call.ts';
|
|
3
|
+
export declare function runTool(connectors: readonly string[]): {
|
|
4
|
+
name: string;
|
|
5
|
+
description: string;
|
|
6
|
+
parameters: {
|
|
7
|
+
type: string;
|
|
8
|
+
properties: {
|
|
9
|
+
description: {
|
|
10
|
+
type: string;
|
|
11
|
+
description: string;
|
|
12
|
+
};
|
|
13
|
+
connector: {
|
|
14
|
+
type: string;
|
|
15
|
+
enum: string[];
|
|
16
|
+
description: string;
|
|
17
|
+
};
|
|
18
|
+
command: {
|
|
19
|
+
type: string;
|
|
20
|
+
description: string;
|
|
21
|
+
};
|
|
22
|
+
payload: {
|
|
23
|
+
type: string;
|
|
24
|
+
description: string;
|
|
25
|
+
};
|
|
26
|
+
};
|
|
27
|
+
required: string[];
|
|
28
|
+
additionalProperties: boolean;
|
|
29
|
+
};
|
|
30
|
+
};
|
|
31
|
+
declare const argsSchema: z.ZodObject<{
|
|
32
|
+
description: z.ZodString;
|
|
33
|
+
connector: z.ZodString;
|
|
34
|
+
command: z.ZodString;
|
|
35
|
+
payload: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodJSONSchema>>;
|
|
36
|
+
}, z.core.$strict>;
|
|
37
|
+
/** A call as the model made it: what it says to the person, and the connector command with its payload. */
|
|
38
|
+
export type RunCall = z.output<typeof argsSchema>;
|
|
39
|
+
export type ParsedRunArgs = {
|
|
40
|
+
success: true;
|
|
41
|
+
data: RunCall;
|
|
42
|
+
} | {
|
|
43
|
+
success: false;
|
|
44
|
+
problems: string;
|
|
45
|
+
};
|
|
46
|
+
/** A call's arguments, or what is wrong with them and what each field must be. */
|
|
47
|
+
export declare function parseRunArgs(raw: Record<string, JsonValue>): ParsedRunArgs;
|
|
48
|
+
export {};
|
|
49
|
+
//# sourceMappingURL=run-tool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-tool.d.ts","sourceRoot":"","sources":["../../src/calls/run-tool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,YAAY,CAAC;AAC/B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAOtD,wBAAgB,OAAO,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;EAoBpD;AAID,QAAA,MAAM,UAAU;;;;;kBAKd,CAAC;AAEH,2GAA2G;AAC3G,MAAM,MAAM,OAAO,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,UAAU,CAAC,CAAC;AAqBlD,MAAM,MAAM,aAAa,GAAG;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAE,GAAG;IAAE,OAAO,EAAE,KAAK,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC;AAEpG,kFAAkF;AAClF,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,aAAa,CAU1E"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { z } from '@kvman/sdk';
|
|
2
|
+
// The agent's one tool (plan 08 §8.2, ADR 0011, 1): `run { description, connector, command, payload }` runs one command
|
|
3
|
+
// of a connector. The payload has no schema here: the model learns it from the prompt's connector index or the connector's `help`.
|
|
4
|
+
const exampleCall = '{ "description": "Listing the project\'s source files", "connector": "fs", "command": "list", "payload": { "path": "src" } }';
|
|
5
|
+
export function runTool(connectors) {
|
|
6
|
+
return {
|
|
7
|
+
name: 'run',
|
|
8
|
+
description: [
|
|
9
|
+
'Runs one command of a connector and returns its result. Connectors are the only way you act: the system prompt lists each one with its commands.',
|
|
10
|
+
'',
|
|
11
|
+
`For example, ${exampleCall}. Every connector has the command help: call it with an empty payload to see the connector's commands, or with { "command": "<name>" } to see one command's payload, before the first time you use a command whose payload the system prompt doesn't list.`,
|
|
12
|
+
].join('\n'),
|
|
13
|
+
parameters: {
|
|
14
|
+
type: 'object',
|
|
15
|
+
properties: {
|
|
16
|
+
description: { type: 'string', description: 'One sentence saying what this call does, for a person who knows nothing about how you work ("Editing app.ts to add the save button"). Write it first.' },
|
|
17
|
+
connector: { type: 'string', enum: [...connectors], description: 'The connector to use.' },
|
|
18
|
+
command: { type: 'string', description: "One of the connector's commands, or help." },
|
|
19
|
+
payload: { type: 'object', description: "The command's input, as the system prompt or the connector's help gives it. Leave it out for a command that takes none." },
|
|
20
|
+
},
|
|
21
|
+
required: ['description', 'connector', 'command'],
|
|
22
|
+
additionalProperties: false,
|
|
23
|
+
},
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
const payloadSchema = z.record(z.string(), z.json());
|
|
27
|
+
const argsSchema = z.strictObject({
|
|
28
|
+
description: z.string().trim().min(1),
|
|
29
|
+
connector: z.string().min(1),
|
|
30
|
+
command: z.string().min(1),
|
|
31
|
+
payload: payloadSchema.default({}),
|
|
32
|
+
});
|
|
33
|
+
// What each argument must be, as a failed call says it.
|
|
34
|
+
const requirements = {
|
|
35
|
+
description: 'one sentence saying what this call does, for the person',
|
|
36
|
+
connector: "one of the session's connectors",
|
|
37
|
+
command: "one of the connector's commands, or help",
|
|
38
|
+
payload: "a JSON object: the command's input",
|
|
39
|
+
};
|
|
40
|
+
// A payload some models send as a JSON string is read as the object it holds.
|
|
41
|
+
function withParsedPayload(raw) {
|
|
42
|
+
if (typeof raw['payload'] !== 'string')
|
|
43
|
+
return raw;
|
|
44
|
+
try {
|
|
45
|
+
return { ...raw, payload: z.json().parse(JSON.parse(raw['payload'])) };
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
if (error instanceof SyntaxError)
|
|
49
|
+
return raw;
|
|
50
|
+
throw error;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
/** A call's arguments, or what is wrong with them and what each field must be. */
|
|
54
|
+
export function parseRunArgs(raw) {
|
|
55
|
+
const parsed = argsSchema.safeParse(withParsedPayload(raw));
|
|
56
|
+
if (parsed.success)
|
|
57
|
+
return { success: true, data: parsed.data };
|
|
58
|
+
const problems = parsed.error.issues.map((issue) => {
|
|
59
|
+
const field = String(issue.path[0] ?? 'arguments');
|
|
60
|
+
const needed = requirements[field];
|
|
61
|
+
const message = field === 'payload' ? 'The payload must be a JSON object' : issue.message;
|
|
62
|
+
return `${issue.path.join('.') || 'arguments'}: ${message}${needed === undefined ? '' : ` (it must be ${needed})`}`;
|
|
63
|
+
});
|
|
64
|
+
return { success: false, problems: problems.join('; ') };
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=run-tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-tool.js","sourceRoot":"","sources":["../../src/calls/run-tool.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export type Platform = NodeJS.Platform;
|
|
2
|
+
/** How to start one shell call. */
|
|
3
|
+
export type ShellCommand = {
|
|
4
|
+
program: string;
|
|
5
|
+
args: (command: string) => string[];
|
|
6
|
+
kind: 'bash' | 'powershell';
|
|
7
|
+
};
|
|
8
|
+
/** Whether a program is on the PATH (Windows looks for `<name>.exe`). */
|
|
9
|
+
export declare function onPath(name: string, environment: NodeJS.ProcessEnv, platform: Platform): boolean;
|
|
10
|
+
export declare function shellCommand(platform: Platform, configured: string | null, hasPwsh: () => boolean): ShellCommand;
|
|
11
|
+
/** How to end a process tree: its group on Linux and macOS, `taskkill /T /F` on Windows. */
|
|
12
|
+
export type TreeKill = {
|
|
13
|
+
kind: 'group';
|
|
14
|
+
pid: number;
|
|
15
|
+
} | {
|
|
16
|
+
kind: 'taskkill';
|
|
17
|
+
program: 'taskkill';
|
|
18
|
+
args: string[];
|
|
19
|
+
};
|
|
20
|
+
export declare function treeKill(platform: Platform, pid: number): TreeKill;
|
|
21
|
+
export declare const defaultTimeoutMs = 120000;
|
|
22
|
+
export declare const maxTimeoutMs = 600000;
|
|
23
|
+
/** A call's timeout: the default, or the model's, cut to 600 s (ADR 0009, 101). */
|
|
24
|
+
export declare function callTimeout(requested: number | undefined): number;
|
|
25
|
+
//# sourceMappingURL=shell-command.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shell-command.d.ts","sourceRoot":"","sources":["../../src/calls/shell-command.ts"],"names":[],"mappings":"AAOA,MAAM,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;AAEvC,mCAAmC;AACnC,MAAM,MAAM,YAAY,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,EAAE,CAAC;IAAC,IAAI,EAAE,MAAM,GAAG,YAAY,CAAA;CAAE,CAAC;AASjH,yEAAyE;AACzE,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,CAAC,UAAU,EAAE,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAIhG;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,EAAE,OAAO,EAAE,MAAM,OAAO,GAAG,YAAY,CAKhH;AAED,4FAA4F;AAC5F,MAAM,MAAM,QAAQ,GAAG;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,OAAO,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAElH,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,QAAQ,CAElE;AAED,eAAO,MAAM,gBAAgB,SAAU,CAAC;AACxC,eAAO,MAAM,YAAY,SAAU,CAAC;AAEpC,mFAAmF;AACnF,wBAAgB,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAEjE"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
const powershellArgs = (command) => ['-NoProfile', '-Command', command];
|
|
4
|
+
const bashArgs = (command) => ['-lc', command];
|
|
5
|
+
function isPowerShell(program) {
|
|
6
|
+
return /^(pwsh|powershell)(\.exe)?$/i.test(path.basename(program));
|
|
7
|
+
}
|
|
8
|
+
/** Whether a program is on the PATH (Windows looks for `<name>.exe`). */
|
|
9
|
+
export function onPath(name, environment, platform) {
|
|
10
|
+
const folders = (environment['PATH'] ?? environment['Path'] ?? '').split(platform === 'win32' ? ';' : ':').filter((folder) => folder !== '');
|
|
11
|
+
const file = platform === 'win32' ? `${name}.exe` : name;
|
|
12
|
+
return folders.some((folder) => existsSync(path.join(folder, file)));
|
|
13
|
+
}
|
|
14
|
+
export function shellCommand(platform, configured, hasPwsh) {
|
|
15
|
+
const kind = platform === 'win32' ? 'powershell' : 'bash';
|
|
16
|
+
if (configured !== null)
|
|
17
|
+
return { program: configured, args: isPowerShell(configured) ? powershellArgs : bashArgs, kind };
|
|
18
|
+
if (platform !== 'win32')
|
|
19
|
+
return { program: 'bash', args: bashArgs, kind };
|
|
20
|
+
return { program: hasPwsh() ? 'pwsh' : 'powershell.exe', args: powershellArgs, kind };
|
|
21
|
+
}
|
|
22
|
+
export function treeKill(platform, pid) {
|
|
23
|
+
return platform === 'win32' ? { kind: 'taskkill', program: 'taskkill', args: ['/PID', String(pid), '/T', '/F'] } : { kind: 'group', pid };
|
|
24
|
+
}
|
|
25
|
+
export const defaultTimeoutMs = 120_000;
|
|
26
|
+
export const maxTimeoutMs = 600_000;
|
|
27
|
+
/** A call's timeout: the default, or the model's, cut to 600 s (ADR 0009, 101). */
|
|
28
|
+
export function callTimeout(requested) {
|
|
29
|
+
return Math.min(requested ?? defaultTimeoutMs, maxTimeoutMs);
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=shell-command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shell-command.js","sourceRoot":"","sources":["../../src/calls/shell-command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,IAAI,MAAM,WAAW,CAAC;AAW7B,MAAM,cAAc,GAAG,CAAC,OAAe,EAAY,EAAE,CAAC,CAAC,YAAY,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;AAC1F,MAAM,QAAQ,GAAG,CAAC,OAAe,EAAY,EAAE,CAAC,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;AAEjE,SAAS,YAAY,CAAC,OAAe;IACnC,OAAO,8BAA8B,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;AACrE,CAAC;AAED,yEAAyE;AACzE,MAAM,UAAU,MAAM,CAAC,IAAY,EAAE,WAA8B,EAAE,QAAkB;IACrF,MAAM,OAAO,GAAG,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,WAAW,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,KAAK,EAAE,CAAC,CAAC;IAC7I,MAAM,IAAI,GAAG,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;IACzD,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;AACvE,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,QAAkB,EAAE,UAAyB,EAAE,OAAsB;IAChG,MAAM,IAAI,GAAG,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC;IAC1D,IAAI,UAAU,KAAK,IAAI;QAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC;IAC1H,IAAI,QAAQ,KAAK,OAAO;QAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IAC3E,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,gBAAgB,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC;AACxF,CAAC;AAKD,MAAM,UAAU,QAAQ,CAAC,QAAkB,EAAE,GAAW;IACtD,OAAO,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;AAC5I,CAAC;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAG,OAAO,CAAC;AACxC,MAAM,CAAC,MAAM,YAAY,GAAG,OAAO,CAAC;AAEpC,mFAAmF;AACnF,MAAM,UAAU,WAAW,CAAC,SAA6B;IACvD,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,IAAI,gBAAgB,EAAE,YAAY,CAAC,CAAC;AAC/D,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { Ctx } from '@kvman/sdk';
|
|
2
|
+
import { type ShellCommand } from './shell-command.ts';
|
|
3
|
+
/** The shell this run uses: `kvcoder.shell.path`, or the one found for the OS (plan 08 §8.3). */
|
|
4
|
+
export declare function shellFor(ctx: Ctx): Promise<ShellCommand>;
|
|
5
|
+
//# sourceMappingURL=shell-program.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shell-program.d.ts","sourceRoot":"","sources":["../../src/calls/shell-program.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAwB,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAG7E,iGAAiG;AACjG,wBAAsB,QAAQ,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,YAAY,CAAC,CAG9D"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { onPath, shellCommand } from "./shell-command.js";
|
|
2
|
+
import { settingSchemas } from "../register-settings.js";
|
|
3
|
+
/** The shell this run uses: `kvcoder.shell.path`, or the one found for the OS (plan 08 §8.3). */
|
|
4
|
+
export async function shellFor(ctx) {
|
|
5
|
+
const configured = settingSchemas.shellPath.parse(await ctx.settings.get('kvcoder.shell.path'));
|
|
6
|
+
return shellCommand(process.platform, configured, () => onPath('pwsh', process.env, process.platform));
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=shell-program.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shell-program.js","sourceRoot":"","sources":["../../src/calls/shell-program.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,YAAY,EAAqB,MAAM,oBAAoB,CAAC;AAC7E,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAEzD,iGAAiG;AACjG,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,GAAQ;IACrC,MAAM,UAAU,GAAG,cAAc,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC,CAAC;IAChG,OAAO,YAAY,CAAC,OAAO,CAAC,QAAQ,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;AACzG,CAAC"}
|