@kvman/kvcoder 0.1.5 → 0.1.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api.d.ts +49 -3
- package/dist/api.d.ts.map +1 -1
- package/dist/calls/run-shell.d.ts.map +1 -1
- package/dist/calls/run-shell.js +39 -9
- package/dist/calls/run-shell.js.map +1 -1
- package/dist/connector-call.d.ts +1 -1
- package/dist/connector-call.d.ts.map +1 -1
- package/dist/connector-call.js +4 -2
- package/dist/connector-call.js.map +1 -1
- package/dist/connectors/artifact.d.ts +1 -1
- package/dist/connectors/artifact.d.ts.map +1 -1
- package/dist/connectors/artifact.js +4 -4
- package/dist/connectors/artifact.js.map +1 -1
- package/dist/connectors/ask.d.ts +24 -0
- package/dist/connectors/ask.d.ts.map +1 -1
- package/dist/connectors/ask.js +20 -11
- package/dist/connectors/ask.js.map +1 -1
- package/dist/connectors/background.d.ts +14 -1
- package/dist/connectors/background.d.ts.map +1 -1
- package/dist/connectors/background.js +53 -23
- package/dist/connectors/background.js.map +1 -1
- package/dist/connectors/builtin-connectors.d.ts +111 -0
- package/dist/connectors/builtin-connectors.d.ts.map +1 -1
- package/dist/connectors/builtin-connectors.js +4 -1
- package/dist/connectors/builtin-connectors.js.map +1 -1
- package/dist/connectors/delegate.d.ts +9 -3
- package/dist/connectors/delegate.d.ts.map +1 -1
- package/dist/connectors/delegate.js +29 -10
- package/dist/connectors/delegate.js.map +1 -1
- package/dist/connectors/execution-map.d.ts +62 -0
- package/dist/connectors/execution-map.d.ts.map +1 -0
- package/dist/connectors/execution-map.js +142 -0
- package/dist/connectors/execution-map.js.map +1 -0
- package/dist/connectors/fs.d.ts +32 -1
- package/dist/connectors/fs.d.ts.map +1 -1
- package/dist/connectors/fs.js +76 -45
- package/dist/connectors/fs.js.map +1 -1
- package/dist/connectors/mcp.d.ts +18 -1
- package/dist/connectors/mcp.d.ts.map +1 -1
- package/dist/connectors/mcp.js +54 -6
- package/dist/connectors/mcp.js.map +1 -1
- package/dist/connectors/payload-fields.d.ts.map +1 -1
- package/dist/connectors/payload-fields.js +1 -1
- package/dist/connectors/payload-fields.js.map +1 -1
- package/dist/delegate/approved-run.d.ts +4 -6
- package/dist/delegate/approved-run.d.ts.map +1 -1
- package/dist/delegate/approved-run.js +74 -34
- package/dist/delegate/approved-run.js.map +1 -1
- package/dist/delegate/git-staging.d.ts +12 -0
- package/dist/delegate/git-staging.d.ts.map +1 -0
- package/dist/delegate/git-staging.js +54 -0
- package/dist/delegate/git-staging.js.map +1 -0
- package/dist/delegate/permission.d.ts +240 -0
- package/dist/delegate/permission.d.ts.map +1 -0
- package/dist/delegate/permission.js +78 -0
- package/dist/delegate/permission.js.map +1 -0
- package/dist/delegate/program-permission.d.ts +27 -0
- package/dist/delegate/program-permission.d.ts.map +1 -0
- package/dist/delegate/program-permission.js +53 -0
- package/dist/delegate/program-permission.js.map +1 -0
- package/dist/delegate/register-worker-run.d.ts.map +1 -1
- package/dist/delegate/register-worker-run.js +27 -11
- package/dist/delegate/register-worker-run.js.map +1 -1
- package/dist/delegate/run-program.d.ts.map +1 -1
- package/dist/delegate/run-program.js +29 -8
- package/dist/delegate/run-program.js.map +1 -1
- package/dist/delegate/runs.d.ts +14 -4
- package/dist/delegate/runs.d.ts.map +1 -1
- package/dist/delegate/runs.js +49 -19
- package/dist/delegate/runs.js.map +1 -1
- package/dist/delegate/staging-guard.d.ts +9 -0
- package/dist/delegate/staging-guard.d.ts.map +1 -0
- package/dist/delegate/staging-guard.js +55 -0
- package/dist/delegate/staging-guard.js.map +1 -0
- package/dist/delegate/start-background.d.ts +7 -0
- package/dist/delegate/start-background.d.ts.map +1 -0
- package/dist/delegate/start-background.js +32 -0
- package/dist/delegate/start-background.js.map +1 -0
- package/dist/delegate/start-pending.d.ts +5 -0
- package/dist/delegate/start-pending.d.ts.map +1 -0
- package/dist/delegate/start-pending.js +42 -0
- package/dist/delegate/start-pending.js.map +1 -0
- package/dist/delegate/workers.d.ts +5 -2
- package/dist/delegate/workers.d.ts.map +1 -1
- package/dist/delegate/workers.js +44 -8
- package/dist/delegate/workers.js.map +1 -1
- package/dist/files/file-change.d.ts +28 -0
- package/dist/files/file-change.d.ts.map +1 -0
- package/dist/files/file-change.js +125 -0
- package/dist/files/file-change.js.map +1 -0
- package/dist/files/file-parts.d.ts +18 -0
- package/dist/files/file-parts.d.ts.map +1 -0
- package/dist/files/file-parts.js +40 -0
- package/dist/files/file-parts.js.map +1 -0
- package/dist/files/read-file.d.ts +9 -1
- package/dist/files/read-file.d.ts.map +1 -1
- package/dist/files/read-file.js +35 -13
- package/dist/files/read-file.js.map +1 -1
- package/dist/files/search-text.d.ts +12 -2
- package/dist/files/search-text.d.ts.map +1 -1
- package/dist/files/search-text.js +87 -23
- package/dist/files/search-text.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/jobs/job-rows.d.ts +11 -2
- package/dist/jobs/job-rows.d.ts.map +1 -1
- package/dist/jobs/job-rows.js +25 -14
- package/dist/jobs/job-rows.js.map +1 -1
- package/dist/jobs/process-handlers.d.ts.map +1 -1
- package/dist/jobs/process-handlers.js +12 -1
- package/dist/jobs/process-handlers.js.map +1 -1
- package/dist/jobs/process-report.d.ts.map +1 -1
- package/dist/jobs/process-report.js +2 -1
- package/dist/jobs/process-report.js.map +1 -1
- package/dist/jobs/process-run.d.ts.map +1 -1
- package/dist/jobs/process-run.js +2 -1
- package/dist/jobs/process-run.js.map +1 -1
- package/dist/jobs/register-jobs.d.ts.map +1 -1
- package/dist/jobs/register-jobs.js +1 -0
- package/dist/jobs/register-jobs.js.map +1 -1
- package/dist/maps/map-reminder.d.ts +7 -0
- package/dist/maps/map-reminder.d.ts.map +1 -0
- package/dist/maps/map-reminder.js +24 -0
- package/dist/maps/map-reminder.js.map +1 -0
- package/dist/maps/map-rules.d.ts +36 -0
- package/dist/maps/map-rules.d.ts.map +1 -0
- package/dist/maps/map-rules.js +86 -0
- package/dist/maps/map-rules.js.map +1 -0
- package/dist/maps/map-schema.d.ts +55 -0
- package/dist/maps/map-schema.d.ts.map +1 -0
- package/dist/maps/map-schema.js +27 -0
- package/dist/maps/map-schema.js.map +1 -0
- package/dist/maps/register-maps.d.ts +3 -0
- package/dist/maps/register-maps.d.ts.map +1 -0
- package/dist/maps/register-maps.js +21 -0
- package/dist/maps/register-maps.js.map +1 -0
- package/dist/mcp/connect.d.ts +2 -0
- package/dist/mcp/connect.d.ts.map +1 -1
- package/dist/mcp/connect.js +16 -4
- package/dist/mcp/connect.js.map +1 -1
- package/dist/mcp/oauth-provider.d.ts +8 -5
- package/dist/mcp/oauth-provider.d.ts.map +1 -1
- package/dist/mcp/oauth-provider.js +31 -22
- package/dist/mcp/oauth-provider.js.map +1 -1
- package/dist/mcp/secrets.d.ts +2 -0
- package/dist/mcp/secrets.d.ts.map +1 -1
- package/dist/mcp/secrets.js +6 -0
- package/dist/mcp/secrets.js.map +1 -1
- package/dist/mcp/sign-in.d.ts.map +1 -1
- package/dist/mcp/sign-in.js +12 -4
- package/dist/mcp/sign-in.js.map +1 -1
- package/dist/messages/receive-message.d.ts +2 -1
- package/dist/messages/receive-message.d.ts.map +1 -1
- package/dist/messages/receive-message.js +34 -9
- package/dist/messages/receive-message.js.map +1 -1
- package/dist/messages/register-messages.d.ts.map +1 -1
- package/dist/messages/register-messages.js +13 -8
- package/dist/messages/register-messages.js.map +1 -1
- package/dist/messages/send-receipt.d.ts +10 -0
- package/dist/messages/send-receipt.d.ts.map +1 -0
- package/dist/messages/send-receipt.js +14 -0
- package/dist/messages/send-receipt.js.map +1 -0
- package/dist/prompt/build-prompt.d.ts +1 -0
- package/dist/prompt/build-prompt.d.ts.map +1 -1
- package/dist/prompt/build-prompt.js +5 -1
- package/dist/prompt/build-prompt.js.map +1 -1
- package/dist/prompt/project-rules.d.ts +6 -0
- package/dist/prompt/project-rules.d.ts.map +1 -0
- package/dist/prompt/project-rules.js +37 -0
- package/dist/prompt/project-rules.js.map +1 -0
- package/dist/prompt/session-grants.d.ts +209 -0
- package/dist/prompt/session-grants.d.ts.map +1 -0
- package/dist/prompt/session-grants.js +50 -0
- package/dist/prompt/session-grants.js.map +1 -0
- package/dist/prompt/session-prompt.d.ts +3 -2
- package/dist/prompt/session-prompt.d.ts.map +1 -1
- package/dist/prompt/session-prompt.js +24 -40
- package/dist/prompt/session-prompt.js.map +1 -1
- package/dist/prompt/working-method.d.ts.map +1 -1
- package/dist/prompt/working-method.js +22 -16
- package/dist/prompt/working-method.js.map +1 -1
- package/dist/register-settings.d.ts +3 -1
- package/dist/register-settings.d.ts.map +1 -1
- package/dist/register-settings.js +5 -4
- package/dist/register-settings.js.map +1 -1
- package/dist/registry/register-connectors.d.ts +9 -0
- package/dist/registry/register-connectors.d.ts.map +1 -1
- package/dist/registry/register-connectors.js +20 -12
- package/dist/registry/register-connectors.js.map +1 -1
- package/dist/result-text.d.ts +4 -0
- package/dist/result-text.d.ts.map +1 -1
- package/dist/result-text.js +9 -0
- package/dist/result-text.js.map +1 -1
- package/dist/schemas/records.d.ts +142 -0
- package/dist/schemas/records.d.ts.map +1 -1
- package/dist/schemas/records.js +60 -2
- package/dist/schemas/records.js.map +1 -1
- package/dist/sessions/execution-root.d.ts +8 -0
- package/dist/sessions/execution-root.d.ts.map +1 -0
- package/dist/sessions/execution-root.js +25 -0
- package/dist/sessions/execution-root.js.map +1 -0
- package/dist/sessions/new-session.d.ts +5 -1
- package/dist/sessions/new-session.d.ts.map +1 -1
- package/dist/sessions/new-session.js +17 -4
- package/dist/sessions/new-session.js.map +1 -1
- package/dist/sessions/register-context.d.ts.map +1 -1
- package/dist/sessions/register-context.js +6 -5
- package/dist/sessions/register-context.js.map +1 -1
- package/dist/sessions/register-fork-export.d.ts.map +1 -1
- package/dist/sessions/register-fork-export.js +5 -3
- package/dist/sessions/register-fork-export.js.map +1 -1
- package/dist/sessions/register-lifecycle.d.ts.map +1 -1
- package/dist/sessions/register-lifecycle.js +14 -5
- package/dist/sessions/register-lifecycle.js.map +1 -1
- package/dist/sessions/register-sessions.d.ts.map +1 -1
- package/dist/sessions/register-sessions.js +0 -2
- package/dist/sessions/register-sessions.js.map +1 -1
- package/dist/sessions/session-view.d.ts +23 -0
- package/dist/sessions/session-view.d.ts.map +1 -1
- package/dist/sessions/session-view.js +4 -1
- package/dist/sessions/session-view.js.map +1 -1
- package/dist/store/all-docs.d.ts +4 -0
- package/dist/store/all-docs.d.ts.map +1 -0
- package/dist/store/all-docs.js +14 -0
- package/dist/store/all-docs.js.map +1 -0
- package/dist/store/collections.d.ts +230 -0
- package/dist/store/collections.d.ts.map +1 -1
- package/dist/store/collections.js +16 -1
- package/dist/store/collections.js.map +1 -1
- package/dist/turns/answer-fingerprint.d.ts +4 -0
- package/dist/turns/answer-fingerprint.d.ts.map +1 -0
- package/dist/turns/answer-fingerprint.js +18 -0
- package/dist/turns/answer-fingerprint.js.map +1 -0
- package/dist/turns/apply-answer.d.ts +19 -0
- package/dist/turns/apply-answer.d.ts.map +1 -0
- package/dist/turns/apply-answer.js +47 -0
- package/dist/turns/apply-answer.js.map +1 -0
- package/dist/turns/background.d.ts +3 -0
- package/dist/turns/background.d.ts.map +1 -1
- package/dist/turns/background.js +13 -12
- package/dist/turns/background.js.map +1 -1
- package/dist/turns/call-groups.d.ts +9 -0
- package/dist/turns/call-groups.d.ts.map +1 -0
- package/dist/turns/call-groups.js +18 -0
- package/dist/turns/call-groups.js.map +1 -0
- package/dist/turns/call-permission.d.ts +22 -0
- package/dist/turns/call-permission.d.ts.map +1 -0
- package/dist/turns/call-permission.js +49 -0
- package/dist/turns/call-permission.js.map +1 -0
- package/dist/turns/cancel-step-job.d.ts +14 -0
- package/dist/turns/cancel-step-job.d.ts.map +1 -0
- package/dist/turns/cancel-step-job.js +35 -0
- package/dist/turns/cancel-step-job.js.map +1 -0
- package/dist/turns/child-result.d.ts +7 -0
- package/dist/turns/child-result.d.ts.map +1 -0
- package/dist/turns/child-result.js +24 -0
- package/dist/turns/child-result.js.map +1 -0
- package/dist/turns/compaction.d.ts +15 -1
- package/dist/turns/compaction.d.ts.map +1 -1
- package/dist/turns/compaction.js +48 -18
- package/dist/turns/compaction.js.map +1 -1
- package/dist/turns/end-turn-state.d.ts +42 -0
- package/dist/turns/end-turn-state.d.ts.map +1 -0
- package/dist/turns/end-turn-state.js +64 -0
- package/dist/turns/end-turn-state.js.map +1 -0
- package/dist/turns/end-turn.d.ts +7 -8
- package/dist/turns/end-turn.d.ts.map +1 -1
- package/dist/turns/end-turn.js +52 -55
- package/dist/turns/end-turn.js.map +1 -1
- package/dist/turns/helper-calls.d.ts +6 -0
- package/dist/turns/helper-calls.d.ts.map +1 -0
- package/dist/turns/helper-calls.js +8 -0
- package/dist/turns/helper-calls.js.map +1 -0
- package/dist/turns/history.d.ts +3 -1
- package/dist/turns/history.d.ts.map +1 -1
- package/dist/turns/history.js +15 -7
- package/dist/turns/history.js.map +1 -1
- package/dist/turns/lost-reply.d.ts +7 -0
- package/dist/turns/lost-reply.d.ts.map +1 -1
- package/dist/turns/lost-reply.js +12 -0
- package/dist/turns/lost-reply.js.map +1 -1
- package/dist/turns/message-blocks.d.ts +2 -0
- package/dist/turns/message-blocks.d.ts.map +1 -1
- package/dist/turns/message-blocks.js +7 -0
- package/dist/turns/message-blocks.js.map +1 -1
- package/dist/turns/model-context.d.ts +2 -0
- package/dist/turns/model-context.d.ts.map +1 -1
- package/dist/turns/model-context.js +29 -5
- package/dist/turns/model-context.js.map +1 -1
- package/dist/turns/model-retry.d.ts +2 -1
- package/dist/turns/model-retry.d.ts.map +1 -1
- package/dist/turns/model-retry.js +5 -1
- package/dist/turns/model-retry.js.map +1 -1
- package/dist/turns/read-only.d.ts +6 -0
- package/dist/turns/read-only.d.ts.map +1 -0
- package/dist/turns/read-only.js +12 -0
- package/dist/turns/read-only.js.map +1 -0
- package/dist/turns/receipt-job.d.ts +5 -0
- package/dist/turns/receipt-job.d.ts.map +1 -0
- package/dist/turns/receipt-job.js +40 -0
- package/dist/turns/receipt-job.js.map +1 -0
- package/dist/turns/recover-workspace.d.ts +9 -0
- package/dist/turns/recover-workspace.d.ts.map +1 -0
- package/dist/turns/recover-workspace.js +79 -0
- package/dist/turns/recover-workspace.js.map +1 -0
- package/dist/turns/recovery-state.d.ts +19 -0
- package/dist/turns/recovery-state.d.ts.map +1 -0
- package/dist/turns/recovery-state.js +87 -0
- package/dist/turns/recovery-state.js.map +1 -0
- package/dist/turns/register-interruptions.d.ts.map +1 -1
- package/dist/turns/register-interruptions.js +19 -8
- package/dist/turns/register-interruptions.js.map +1 -1
- package/dist/turns/register-turns.d.ts.map +1 -1
- package/dist/turns/register-turns.js +42 -31
- package/dist/turns/register-turns.js.map +1 -1
- package/dist/turns/resolve.d.ts +4 -0
- package/dist/turns/resolve.d.ts.map +1 -1
- package/dist/turns/resolve.js +19 -17
- package/dist/turns/resolve.js.map +1 -1
- package/dist/turns/retry-turn.d.ts +4 -0
- package/dist/turns/retry-turn.d.ts.map +1 -0
- package/dist/turns/retry-turn.js +20 -0
- package/dist/turns/retry-turn.js.map +1 -0
- package/dist/turns/run-calls.d.ts +21 -4
- package/dist/turns/run-calls.d.ts.map +1 -1
- package/dist/turns/run-calls.js +157 -41
- package/dist/turns/run-calls.js.map +1 -1
- package/dist/turns/run-command.d.ts +5 -3
- package/dist/turns/run-command.d.ts.map +1 -1
- package/dist/turns/run-command.js +21 -12
- package/dist/turns/run-command.js.map +1 -1
- package/dist/turns/settle-calls.d.ts +2 -8
- package/dist/turns/settle-calls.d.ts.map +1 -1
- package/dist/turns/settle-calls.js +26 -35
- package/dist/turns/settle-calls.js.map +1 -1
- package/dist/turns/start-turn.d.ts +8 -83
- package/dist/turns/start-turn.d.ts.map +1 -1
- package/dist/turns/start-turn.js +35 -24
- package/dist/turns/start-turn.js.map +1 -1
- package/dist/turns/step-claim.d.ts +39 -0
- package/dist/turns/step-claim.d.ts.map +1 -0
- package/dist/turns/step-claim.js +72 -0
- package/dist/turns/step-claim.js.map +1 -0
- package/dist/turns/step-intents.d.ts +31 -0
- package/dist/turns/step-intents.d.ts.map +1 -0
- package/dist/turns/step-intents.js +101 -0
- package/dist/turns/step-intents.js.map +1 -0
- package/dist/turns/step-next.d.ts +17 -0
- package/dist/turns/step-next.d.ts.map +1 -0
- package/dist/turns/step-next.js +25 -0
- package/dist/turns/step-next.js.map +1 -0
- package/dist/turns/step.d.ts +1 -1
- package/dist/turns/step.d.ts.map +1 -1
- package/dist/turns/step.js +108 -88
- package/dist/turns/step.js.map +1 -1
- package/dist/turns/summary-facts.d.ts +25 -0
- package/dist/turns/summary-facts.d.ts.map +1 -0
- package/dist/turns/summary-facts.js +63 -0
- package/dist/turns/summary-facts.js.map +1 -0
- package/dist/turns/usage.d.ts +7 -0
- package/dist/turns/usage.d.ts.map +1 -0
- package/dist/turns/usage.js +18 -0
- package/dist/turns/usage.js.map +1 -0
- package/dist/ui/register-ui.js +3 -3
- package/dist/ui/register-ui.js.map +1 -1
- package/dist/web/components/approval.css +2 -0
- package/dist/web/components/approval.js +233 -0
- package/dist/web/components/call.css +1 -1
- package/dist/web/components/call.js +841 -131
- package/dist/web/components/connectors.css +1 -1
- package/dist/web/components/connectors.js +595 -592
- package/dist/web/components/conversation.css +1 -1
- package/dist/web/components/conversation.js +3341 -1418
- package/dist/web/components/mcp-sign-in.css +1 -1
- package/dist/web/components/model.css +1 -1
- package/dist/web/components/model.js +138 -134
- package/dist/web/components/question.css +1 -1
- package/dist/web/components/question.js +148 -78
- package/dist/web/components/sessions.css +1 -1
- package/docs/connectors.md +2 -2
- package/locales/ar.json +119 -12
- package/locales/en.json +119 -12
- package/package.json +6 -6
- package/dist/turns/cancel-turn.d.ts +0 -3
- package/dist/turns/cancel-turn.d.ts.map +0 -1
- package/dist/turns/cancel-turn.js +0 -31
- package/dist/turns/cancel-turn.js.map +0 -1
package/dist/connectors/mcp.js
CHANGED
|
@@ -1,20 +1,24 @@
|
|
|
1
1
|
import { z } from '@kvman/sdk';
|
|
2
2
|
import { callTimeout } from "../calls/shell-command.js";
|
|
3
3
|
import { mcpServer } from "../mcp/servers.js";
|
|
4
|
+
import { payloadSignature } from "../connector-call.js";
|
|
4
5
|
import { listTools, resultText, toolNamed } from "../mcp/tools.js";
|
|
5
6
|
import { callInput } from "./connector-command.js";
|
|
6
7
|
import { timeoutMs } from "./payload-fields.js";
|
|
7
8
|
// The `mcp` connector (plan 08 §8.5, ADR 0020, 3, 7, and 10): the tools of the MCP servers the person added. `tools`
|
|
8
|
-
// lists a server's tools or gives one tool's arguments; `call` runs a tool, after the person's approval when it is risky
|
|
9
|
+
// lists a server's tools or gives one tool's arguments; `call` runs a tool, after the person's approval when it is risky;
|
|
10
|
+
// `run` runs several on one connection, so a server that keeps state between tools keeps it for the run (ADR 0070, 1).
|
|
9
11
|
// The MCP client is loaded by the first call that connects, so a kvman with no server doesn't keep it in memory.
|
|
10
12
|
/** What the prompt's index says the connector is for; the session's entry adds its servers. */
|
|
11
|
-
export const mcpDescription = 'Tools from the MCP servers the person added. Call tools with { "server" } to see what a server offers
|
|
13
|
+
export const mcpDescription = 'Tools from the MCP servers the person added. Call tools with { "server" } to see what a server offers and what each tool takes; ask for one tool with { "server", "tool" } only when you need its full schema. Each call starts the server and closes it, so a server that keeps state between tools, such as a browser, keeps it only inside one run: put the tools that belong together (open the page, fill, click, read) in one run.';
|
|
12
14
|
/** The connector's description with the workspace's servers, as the prompt's index shows it. */
|
|
13
15
|
export function mcpIndexDescription(servers) {
|
|
14
16
|
return `${mcpDescription} Servers: ${servers.map((server) => `${server.name} (${server.description.replace(/[.\s]+$/, '')})`).join(', ')}.`;
|
|
15
17
|
}
|
|
16
18
|
const server = z.string().min(1).describe('The MCP server, by the name the system prompt lists.');
|
|
17
|
-
const risky = z.boolean().describe('true when the tool could change, delete, or send something
|
|
19
|
+
const risky = z.boolean().describe('true when the tool could change, delete, or send something: creating or closing an issue, sending a message, writing to a database. The person is asked first. false for a tool that only reads.');
|
|
20
|
+
/** The tools one run calls at most. */
|
|
21
|
+
export const runStepsLimit = 20;
|
|
18
22
|
const payloads = {
|
|
19
23
|
tools: z.strictObject({ server, tool: z.string().min(1).describe("One tool to describe with its arguments' JSON Schema; every tool's name and description when left out.").exactOptional() }),
|
|
20
24
|
call: z.strictObject({
|
|
@@ -24,15 +28,27 @@ const payloads = {
|
|
|
24
28
|
timeoutMs,
|
|
25
29
|
risky,
|
|
26
30
|
}),
|
|
31
|
+
run: z.strictObject({
|
|
32
|
+
server,
|
|
33
|
+
steps: z
|
|
34
|
+
.array(z.strictObject({ tool: z.string().min(1).describe('The tool to call, by its name from tools.'), arguments: z.record(z.string(), z.json()).describe("The tool's arguments; leave it out for a tool that takes none.").exactOptional() }))
|
|
35
|
+
.min(1)
|
|
36
|
+
.max(runStepsLimit)
|
|
37
|
+
.describe('The tools to call on one connection, in order; the run stops at the first one that reports an error.'),
|
|
38
|
+
timeoutMs,
|
|
39
|
+
risky,
|
|
40
|
+
}),
|
|
27
41
|
};
|
|
28
42
|
export const mcpCommands = {
|
|
29
43
|
tools: { registration: 'kvcoder.mcp.tool.describe', description: "Lists an MCP server's tools, or gives one tool's description and arguments.", payload: payloads.tools, asks: false },
|
|
30
44
|
call: { registration: 'kvcoder.mcp.tool.call', description: "Calls one tool of an MCP server and returns the tool's text.", payload: payloads.call, asks: true, result: "the tool's text." },
|
|
45
|
+
run: { registration: 'kvcoder.mcp.steps.run', description: 'Calls several tools of an MCP server on one connection, in order, so the server keeps its state between them; stops at the first tool that reports an error.', payload: payloads.run, asks: true, result: "each step's text under ## <n>. <tool>, and [stopped: N steps not run] when a tool reported an error." },
|
|
31
46
|
};
|
|
32
47
|
/** What `kvcoder.mcp.tool.call` gives: the tool's text, and whether the tool says it failed. */
|
|
33
48
|
export const mcpCallSchema = z.object({ text: z.string(), isError: z.boolean() });
|
|
34
49
|
const toolRowSchema = z.object({ name: z.string(), description: z.string() });
|
|
35
|
-
|
|
50
|
+
// A list says what each tool takes (ADR 0070, 2), so one call is enough to use a server's tools.
|
|
51
|
+
const describeOutput = z.union([z.object({ server: z.string(), tools: z.array(toolRowSchema.extend({ takes: z.string() })) }), toolRowSchema.extend({ server: z.string(), arguments: z.json() })]);
|
|
36
52
|
// The jobs may run for the call's longest timeout, with room to report it.
|
|
37
53
|
const jobOptions = { retries: 0, timeoutMs: 660_000 };
|
|
38
54
|
export function registerMcpConnector(ctx) {
|
|
@@ -46,7 +62,7 @@ export function registerMcpConnector(ctx) {
|
|
|
46
62
|
const { withServer } = await import("../mcp/connect.js");
|
|
47
63
|
const tools = await withServer(ctx, found, callTimeout(undefined), listTools);
|
|
48
64
|
if (payload.tool === undefined)
|
|
49
|
-
return { server: found.name, tools: tools.map((tool) => ({ name: tool.name, description: tool.description ?? '' })) };
|
|
65
|
+
return { server: found.name, tools: tools.map((tool) => ({ name: tool.name, description: tool.description ?? '', takes: payloadSignature(tool.inputSchema) ?? '{}' })) };
|
|
50
66
|
const tool = toolNamed(found.name, tools, payload.tool);
|
|
51
67
|
return { server: found.name, name: tool.name, description: tool.description ?? '', arguments: tool.inputSchema };
|
|
52
68
|
},
|
|
@@ -59,10 +75,42 @@ export function registerMcpConnector(ctx) {
|
|
|
59
75
|
handle: async ({ payload }) => {
|
|
60
76
|
const found = await mcpServer(ctx, payload.server);
|
|
61
77
|
const { withServer } = await import("../mcp/connect.js");
|
|
62
|
-
|
|
78
|
+
const result = await withServer(ctx, found, callTimeout(payload.timeoutMs), async (connection) => {
|
|
63
79
|
toolNamed(found.name, await listTools(connection), payload.tool);
|
|
64
80
|
return resultText(await connection.client.callTool({ name: payload.tool, arguments: payload.arguments ?? {} }, undefined, connection.request));
|
|
65
81
|
});
|
|
82
|
+
// Read after the call, which may have refreshed the tokens: no secret kvman holds for the server leaves in a result (ADR 0056, 9).
|
|
83
|
+
const { knownSecrets, withoutSecrets } = await import("../mcp/secrets.js");
|
|
84
|
+
return { ...result, text: withoutSecrets(result.text, await knownSecrets(ctx, found)) };
|
|
85
|
+
},
|
|
86
|
+
});
|
|
87
|
+
ctx.registerCommand('kvcoder.mcp.steps.run', {
|
|
88
|
+
description: mcpCommands.run.description,
|
|
89
|
+
input: callInput(payloads.run),
|
|
90
|
+
output: mcpCallSchema,
|
|
91
|
+
...jobOptions,
|
|
92
|
+
handle: async ({ payload }) => {
|
|
93
|
+
const found = await mcpServer(ctx, payload.server);
|
|
94
|
+
const { withServer } = await import("../mcp/connect.js");
|
|
95
|
+
const result = await withServer(ctx, found, callTimeout(payload.timeoutMs), async (connection) => {
|
|
96
|
+
const tools = await listTools(connection);
|
|
97
|
+
for (const step of payload.steps)
|
|
98
|
+
toolNamed(found.name, tools, step.tool);
|
|
99
|
+
const parts = [];
|
|
100
|
+
for (const [index, step] of payload.steps.entries()) {
|
|
101
|
+
const done = resultText(await connection.client.callTool({ name: step.tool, arguments: step.arguments ?? {} }, undefined, connection.request));
|
|
102
|
+
parts.push(`## ${String(index + 1)}. ${step.tool}\n${done.text}`);
|
|
103
|
+
if (!done.isError)
|
|
104
|
+
continue;
|
|
105
|
+
const left = payload.steps.length - index - 1;
|
|
106
|
+
if (left > 0)
|
|
107
|
+
parts.push(`[stopped: ${String(left)} ${left === 1 ? 'step' : 'steps'} not run]`);
|
|
108
|
+
return { text: parts.join('\n\n'), isError: true };
|
|
109
|
+
}
|
|
110
|
+
return { text: parts.join('\n\n'), isError: false };
|
|
111
|
+
});
|
|
112
|
+
const { knownSecrets, withoutSecrets } = await import("../mcp/secrets.js");
|
|
113
|
+
return { ...result, text: withoutSecrets(result.text, await knownSecrets(ctx, found)) };
|
|
66
114
|
},
|
|
67
115
|
});
|
|
68
116
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/connectors/mcp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAY,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,SAAS,EAAkB,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAE,SAAS,EAAyB,MAAM,wBAAwB,CAAC;AAC1E,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAEhD,qHAAqH;AACrH,0HAA0H;AAC1H,iHAAiH;AAEjH,+FAA+F;AAC/F,MAAM,CAAC,MAAM,cAAc,GACzB,
|
|
1
|
+
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/connectors/mcp.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"payload-fields.d.ts","sourceRoot":"","sources":["../../src/connectors/payload-fields.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,YAAY,CAAC;AAK/B,eAAO,MAAM,KAAK,
|
|
1
|
+
{"version":3,"file":"payload-fields.d.ts","sourceRoot":"","sources":["../../src/connectors/payload-fields.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,YAAY,CAAC;AAK/B,eAAO,MAAM,KAAK,cAE4b,CAAC;AAE/c,eAAO,MAAM,UAAU,kCAAsK,CAAC;AAE9L,eAAO,MAAM,SAAS,iCAAqK,CAAC;AAE5L,eAAO,MAAM,KAAK;;;mBAGsG,CAAC"}
|
|
@@ -3,7 +3,7 @@ import { z } from '@kvman/sdk';
|
|
|
3
3
|
// shows these schemas to the model (ADR 0011, 10).
|
|
4
4
|
export const risky = z
|
|
5
5
|
.boolean()
|
|
6
|
-
.describe("
|
|
6
|
+
.describe("false for the ordinary work of the task: a file inside the workspace folder that the task needs, whoever made it, or the project's own build, tests, and tools. true when this could do what is hard to take back or reaches past the task: anything outside the workspace folder, deleting files, a file that holds secrets, sudo, an install outside the project, git push --force or reset --hard, or sending something out. The person is then asked first.");
|
|
7
7
|
export const background = z.boolean().describe('true keeps a server or any long-running command running after the call returns; follow it up with the background connector.').exactOptional();
|
|
8
8
|
export const timeoutMs = z.number().int().positive().describe('How long the command may run, in milliseconds: 120000 by default, at most 600000. Ignored with background.').exactOptional();
|
|
9
9
|
export const edits = z
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"payload-fields.js","sourceRoot":"","sources":["../../src/connectors/payload-fields.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,YAAY,CAAC;AAE/B,mHAAmH;AACnH,mDAAmD;AAEnD,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC;KACnB,OAAO,EAAE;KACT,QAAQ,CAAC,
|
|
1
|
+
{"version":3,"file":"payload-fields.js","sourceRoot":"","sources":["../../src/connectors/payload-fields.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,YAAY,CAAC;AAE/B,mHAAmH;AACnH,mDAAmD;AAEnD,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC;KACnB,OAAO,EAAE;KACT,QAAQ,CAAC,icAAic,CAAC,CAAC;AAE/c,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,6HAA6H,CAAC,CAAC,aAAa,EAAE,CAAC;AAE9L,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,4GAA4G,CAAC,CAAC,aAAa,EAAE,CAAC;AAE5L,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC;KACnB,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,mGAAmG,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,4BAA4B,CAAC,EAAE,CAAC,CAAC;KACxN,GAAG,CAAC,CAAC,CAAC;KACN,QAAQ,CAAC,2GAA2G,CAAC,CAAC"}
|
|
@@ -1,13 +1,11 @@
|
|
|
1
|
-
import { type Ctx } from '@kvman/sdk';
|
|
2
|
-
import type { RunCallDoc } from '../schemas/records.ts';
|
|
1
|
+
import { type Ctx, type Stored } from '@kvman/sdk';
|
|
2
|
+
import type { QuestionDoc, RunCallDoc } from '../schemas/records.ts';
|
|
3
3
|
type Approved = {
|
|
4
|
-
|
|
5
|
-
toolCallId: string;
|
|
4
|
+
question: Stored<QuestionDoc>;
|
|
6
5
|
call: RunCallDoc;
|
|
7
6
|
};
|
|
8
|
-
/** Whether an approved call is a worker's run, which never runs as a held call does. */
|
|
9
7
|
export declare const isDelegateRun: (call: RunCallDoc) => boolean;
|
|
10
|
-
/**
|
|
8
|
+
/** Prepares asynchronously, then consumes only the exact approval alongside run creation/pending replacement. */
|
|
11
9
|
export declare function startApprovedRun(ctx: Ctx, approved: Approved): Promise<string | null>;
|
|
12
10
|
export {};
|
|
13
11
|
//# sourceMappingURL=approved-run.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"approved-run.d.ts","sourceRoot":"","sources":["../../src/delegate/approved-run.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"approved-run.d.ts","sourceRoot":"","sources":["../../src/delegate/approved-run.ts"],"names":[],"mappings":"AACA,OAAO,EAAgB,KAAK,GAAG,EAAE,KAAK,MAAM,EAAE,MAAM,YAAY,CAAC;AAMjE,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAWrE,KAAK,QAAQ,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;IAAC,IAAI,EAAE,UAAU,CAAA;CAAE,CAAC;AAEpE,eAAO,MAAM,aAAa,GAAI,MAAM,UAAU,KAAG,OAAkE,CAAC;AAsBpH,iHAAiH;AACjH,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA8C3F"}
|
|
@@ -1,54 +1,94 @@
|
|
|
1
|
+
import { isDeepStrictEqual } from 'node:util';
|
|
1
2
|
import { ProblemError } from '@kvman/sdk';
|
|
2
3
|
import { delegateRunSchema } from "../connectors/delegate.js";
|
|
3
4
|
import { errorOutput } from "../connector-call.js";
|
|
5
|
+
import { invalid } from "../problems.js";
|
|
6
|
+
import { prepareGrants } from "../prompt/session-grants.js";
|
|
4
7
|
import { firePoint } from "../registry/session-points.js";
|
|
5
8
|
import { records, txRecords } from "../store/collections.js";
|
|
6
|
-
import { heldText,
|
|
7
|
-
import {
|
|
9
|
+
import { heldText, resolvePendingInTx } from "../turns/resolve.js";
|
|
10
|
+
import { dispatchStep } from "../turns/start-turn.js";
|
|
11
|
+
import { delegationInTx, refusePending, waitingInTx } from "./permission.js";
|
|
12
|
+
import { recordRun } from "./runs.js";
|
|
13
|
+
import { startBackgroundRun } from "./start-background.js";
|
|
14
|
+
import { startPending } from "./start-pending.js";
|
|
8
15
|
import { availableWorker, isProgram } from "./workers.js";
|
|
9
|
-
/** Whether an approved call is a worker's run, which never runs as a held call does. */
|
|
10
16
|
export const isDelegateRun = (call) => call.connector === 'delegate' && call.command === 'run';
|
|
11
|
-
|
|
12
|
-
|
|
17
|
+
function approvalAuthority(question) {
|
|
18
|
+
return { sessionId: question.sessionId, turnId: question.turnId, pending: { toolCallId: question.toolCallId, kind: 'approval', questionId: question.id, question: question.question, childSessionId: null, runId: null } };
|
|
19
|
+
}
|
|
20
|
+
function currentApproval(store, approved, authority) {
|
|
21
|
+
const found = waitingInTx(store, authority);
|
|
22
|
+
return found === undefined || !isDeepStrictEqual(store.questions.get(approved.question.id), approved.question) ? undefined : found;
|
|
23
|
+
}
|
|
24
|
+
async function refuseApproval(ctx, approved, authority, error) {
|
|
25
|
+
if (!(error instanceof ProblemError) || ctx.job.signal.aborted)
|
|
13
26
|
throw error;
|
|
14
|
-
|
|
27
|
+
const identity = await ctx.store.transaction(tx => {
|
|
28
|
+
const store = txRecords(tx);
|
|
29
|
+
if (currentApproval(store, approved, authority) === undefined)
|
|
30
|
+
return null;
|
|
31
|
+
store.questions.delete(approved.question.id);
|
|
32
|
+
return resolvePendingInTx(store, authority.sessionId, authority.pending.toolCallId, heldText(authority.pending.toolCallId, errorOutput(error.problem).output, true));
|
|
33
|
+
});
|
|
34
|
+
return identity === null ? null : dispatchStep(ctx, identity, false);
|
|
15
35
|
}
|
|
16
|
-
/**
|
|
36
|
+
/** Prepares asynchronously, then consumes only the exact approval alongside run creation/pending replacement. */
|
|
17
37
|
export async function startApprovedRun(ctx, approved) {
|
|
18
|
-
const { sessionId, toolCallId
|
|
19
|
-
const payload = delegateRunSchema.parse(call.payload);
|
|
20
|
-
const
|
|
21
|
-
let
|
|
38
|
+
const { question, call } = approved, { sessionId, toolCallId } = question;
|
|
39
|
+
const payload = delegateRunSchema.parse(call.payload), authority = approvalAuthority(question);
|
|
40
|
+
const background = payload.background === true;
|
|
41
|
+
let run;
|
|
22
42
|
try {
|
|
23
|
-
|
|
43
|
+
const session = await records(ctx.store).sessions.get(sessionId);
|
|
44
|
+
const worker = await availableWorker(ctx, session?.checks ?? null, payload.worker);
|
|
24
45
|
if (!isProgram(worker))
|
|
25
|
-
throw
|
|
46
|
+
throw invalid(`The worker ${worker.name} changed while the call waited. Make the call again.`);
|
|
47
|
+
const prepared = await prepareGrants(ctx);
|
|
48
|
+
run = await ctx.store.transaction(tx => {
|
|
49
|
+
ctx.job.signal.throwIfAborted();
|
|
50
|
+
const store = txRecords(tx), found = currentApproval(store, approved, authority);
|
|
51
|
+
if (found === undefined)
|
|
52
|
+
return undefined;
|
|
53
|
+
delegationInTx(store, sessionId, prepared, worker.name, worker.kind);
|
|
54
|
+
const saved = recordRun(store, sessionId, worker, { description: call.description, task: payload.task }, background ? null : toolCallId);
|
|
55
|
+
store.questions.delete(question.id);
|
|
56
|
+
if (!background)
|
|
57
|
+
store.turns.update(question.turnId, { pending: found.turn.pending.map(item => item.toolCallId === toolCallId ? { toolCallId, kind: 'worker', questionId: null, question: null, childSessionId: null, runId: saved.id } : item) });
|
|
58
|
+
return saved;
|
|
59
|
+
});
|
|
26
60
|
}
|
|
27
61
|
catch (error) {
|
|
28
|
-
return
|
|
62
|
+
return refuseApproval(ctx, approved, authority, error);
|
|
29
63
|
}
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
if (background) {
|
|
33
|
-
await
|
|
34
|
-
|
|
35
|
-
return
|
|
64
|
+
if (run === undefined)
|
|
65
|
+
return null;
|
|
66
|
+
if (!background) {
|
|
67
|
+
await startPending(ctx, { sessionId, turnId: question.turnId, pending: { toolCallId, kind: 'worker', questionId: null, question: null, childSessionId: null, runId: run.id } });
|
|
68
|
+
await firePoint(ctx, 'kvcoder.session.waiting', { sessionId, kind: 'worker' });
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
try {
|
|
72
|
+
await startBackgroundRun(ctx, run, async () => {
|
|
73
|
+
const prepared = await prepareGrants(ctx);
|
|
74
|
+
return store => {
|
|
75
|
+
ctx.job.signal.throwIfAborted();
|
|
76
|
+
if (waitingInTx(store, authority) === undefined)
|
|
77
|
+
throw invalid('The originating approval is no longer current.');
|
|
78
|
+
return delegationInTx(store, sessionId, prepared, run.worker, run.kind).session;
|
|
79
|
+
};
|
|
80
|
+
}, store => waitingInTx(store, authority) !== undefined);
|
|
36
81
|
}
|
|
37
|
-
|
|
82
|
+
catch (error) {
|
|
83
|
+
if (!(error instanceof ProblemError) || ctx.job.signal.aborted)
|
|
84
|
+
throw error;
|
|
85
|
+
return refusePending(ctx, authority, error);
|
|
86
|
+
}
|
|
87
|
+
const text = `started ${run.id}`;
|
|
88
|
+
const identity = await ctx.store.transaction(tx => {
|
|
38
89
|
const store = txRecords(tx);
|
|
39
|
-
|
|
40
|
-
const turn = current === undefined || current.turnId === null ? undefined : store.turns.get(current.turnId);
|
|
41
|
-
if (turn === undefined || !turn.pending.some((item) => item.toolCallId === toolCallId))
|
|
42
|
-
return false;
|
|
43
|
-
store.turns.update(turn.id, { pending: turn.pending.map((item) => (item.toolCallId === toolCallId ? { toolCallId, kind: 'worker', questionId: null, question: null, childSessionId: null, runId: run.id } : item)) });
|
|
44
|
-
return true;
|
|
90
|
+
return waitingInTx(store, authority) === undefined ? null : resolvePendingInTx(store, sessionId, toolCallId, { toolCallId, text, isError: false, run: null, details: { description: call.description, connector: call.connector, command: call.command, output: text, durationMs: 0 } });
|
|
45
91
|
});
|
|
46
|
-
|
|
47
|
-
await dropRun(ctx, run);
|
|
48
|
-
return null;
|
|
49
|
-
}
|
|
50
|
-
await launchRun(ctx, run.id);
|
|
51
|
-
await firePoint(ctx, 'kvcoder.session.waiting', { sessionId, kind: 'worker' });
|
|
52
|
-
return null;
|
|
92
|
+
return identity === null ? null : dispatchStep(ctx, identity, false);
|
|
53
93
|
}
|
|
54
94
|
//# sourceMappingURL=approved-run.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"approved-run.js","sourceRoot":"","sources":["../../src/delegate/approved-run.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,
|
|
1
|
+
{"version":3,"file":"approved-run.js","sourceRoot":"","sources":["../../src/delegate/approved-run.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/** What is staged, as a tree, and the commit `HEAD` names; `head` is `null` before the first commit. */
|
|
2
|
+
export type StagingMark = {
|
|
3
|
+
tree: string;
|
|
4
|
+
head: string | null;
|
|
5
|
+
};
|
|
6
|
+
/** The folder's mark now; `undefined` outside a repository, without Git, or while the index has unresolved conflicts. */
|
|
7
|
+
export declare function stagingMark(folder: string, signal: AbortSignal): Promise<StagingMark | undefined>;
|
|
8
|
+
/** How many paths differ between two staged trees. */
|
|
9
|
+
export declare function stagedPathsBetween(folder: string, before: string, after: string, signal: AbortSignal): Promise<number>;
|
|
10
|
+
/** Makes the staging area `tree` again; no file in the folder and no commit changes. */
|
|
11
|
+
export declare function restoreStaging(folder: string, tree: string, signal: AbortSignal): Promise<void>;
|
|
12
|
+
//# sourceMappingURL=git-staging.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-staging.d.ts","sourceRoot":"","sources":["../../src/delegate/git-staging.ts"],"names":[],"mappings":"AAaA,wGAAwG;AACxG,MAAM,MAAM,WAAW,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC;AAoBhE,yHAAyH;AACzH,wBAAsB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC,CAavG;AAED,sDAAsD;AACtD,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAG5H;AAED,wFAAwF;AACxF,wBAAsB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAErG"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { execFile } from 'node:child_process';
|
|
2
|
+
import { copyFile, mkdtemp, rm } from 'node:fs/promises';
|
|
3
|
+
import { tmpdir } from 'node:os';
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
import { promisify } from 'node:util';
|
|
6
|
+
import { isMissing } from "../files/read-file.js";
|
|
7
|
+
// A folder's Git staging area, marked around a program worker's run (plan 08 §8.5; ADR 0060, 4). The staged tree is
|
|
8
|
+
// written from a copy of the index, so the person's index file is never written by a mark. A repository's own
|
|
9
|
+
// configuration may name a program as its file monitor, which Git would run: it is turned off.
|
|
10
|
+
const run = promisify(execFile);
|
|
11
|
+
async function git(folder, args, signal, env = process.env) {
|
|
12
|
+
return (await run('git', ['-c', 'core.fsmonitor=false', ...args], { cwd: folder, signal, env, maxBuffer: 64 * 1024 * 1024 })).stdout.trim();
|
|
13
|
+
}
|
|
14
|
+
async function treeOfCopy(folder, index, signal) {
|
|
15
|
+
const scratch = await mkdtemp(path.join(tmpdir(), 'kvcoder-index-'));
|
|
16
|
+
try {
|
|
17
|
+
const copy = path.join(scratch, 'index');
|
|
18
|
+
// A repository with nothing staged yet has no index file: Git reads a missing one as empty.
|
|
19
|
+
await copyFile(index, copy).catch((error) => {
|
|
20
|
+
if (!isMissing(error))
|
|
21
|
+
throw error;
|
|
22
|
+
});
|
|
23
|
+
return await git(folder, ['write-tree'], signal, { ...process.env, GIT_INDEX_FILE: copy });
|
|
24
|
+
}
|
|
25
|
+
finally {
|
|
26
|
+
await rm(scratch, { recursive: true, force: true });
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
/** The folder's mark now; `undefined` outside a repository, without Git, or while the index has unresolved conflicts. */
|
|
30
|
+
export async function stagingMark(folder, signal) {
|
|
31
|
+
try {
|
|
32
|
+
const index = path.resolve(folder, await git(folder, ['rev-parse', '--git-path', 'index'], signal));
|
|
33
|
+
const tree = await treeOfCopy(folder, index, signal);
|
|
34
|
+
const head = await git(folder, ['rev-parse', '--verify', '--quiet', 'HEAD'], signal).catch(() => {
|
|
35
|
+
signal.throwIfAborted();
|
|
36
|
+
return '';
|
|
37
|
+
});
|
|
38
|
+
return { tree, head: head === '' ? null : head };
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
signal.throwIfAborted();
|
|
42
|
+
return undefined;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
/** How many paths differ between two staged trees. */
|
|
46
|
+
export async function stagedPathsBetween(folder, before, after, signal) {
|
|
47
|
+
const names = await git(folder, ['diff', '--no-ext-diff', '--name-only', '-z', before, after], signal);
|
|
48
|
+
return names.split('\0').filter((name) => name !== '').length;
|
|
49
|
+
}
|
|
50
|
+
/** Makes the staging area `tree` again; no file in the folder and no commit changes. */
|
|
51
|
+
export async function restoreStaging(folder, tree, signal) {
|
|
52
|
+
await git(folder, ['read-tree', tree], signal);
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=git-staging.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-staging.js","sourceRoot":"","sources":["../../src/delegate/git-staging.ts"],"names":[],"mappings":"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"}
|