@kvman/kvcoder 0.1.6 → 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 +110 -0
- package/dist/connectors/builtin-connectors.d.ts.map +1 -1
- package/dist/connectors/builtin-connectors.js +4 -1
- package/dist/connectors/builtin-connectors.js.map +1 -1
- package/dist/connectors/delegate.d.ts +3 -2
- package/dist/connectors/delegate.d.ts.map +1 -1
- package/dist/connectors/delegate.js +27 -9
- package/dist/connectors/delegate.js.map +1 -1
- package/dist/connectors/execution-map.d.ts +62 -0
- package/dist/connectors/execution-map.d.ts.map +1 -0
- package/dist/connectors/execution-map.js +142 -0
- package/dist/connectors/execution-map.js.map +1 -0
- package/dist/connectors/fs.d.ts +32 -1
- package/dist/connectors/fs.d.ts.map +1 -1
- package/dist/connectors/fs.js +76 -45
- package/dist/connectors/fs.js.map +1 -1
- package/dist/connectors/mcp.d.ts +18 -1
- package/dist/connectors/mcp.d.ts.map +1 -1
- package/dist/connectors/mcp.js +54 -6
- package/dist/connectors/mcp.js.map +1 -1
- package/dist/connectors/payload-fields.d.ts.map +1 -1
- package/dist/connectors/payload-fields.js +1 -1
- package/dist/connectors/payload-fields.js.map +1 -1
- package/dist/delegate/approved-run.d.ts +4 -6
- package/dist/delegate/approved-run.d.ts.map +1 -1
- package/dist/delegate/approved-run.js +74 -34
- package/dist/delegate/approved-run.js.map +1 -1
- package/dist/delegate/git-staging.d.ts +12 -0
- package/dist/delegate/git-staging.d.ts.map +1 -0
- package/dist/delegate/git-staging.js +54 -0
- package/dist/delegate/git-staging.js.map +1 -0
- package/dist/delegate/permission.d.ts +240 -0
- package/dist/delegate/permission.d.ts.map +1 -0
- package/dist/delegate/permission.js +78 -0
- package/dist/delegate/permission.js.map +1 -0
- package/dist/delegate/program-permission.d.ts +27 -0
- package/dist/delegate/program-permission.d.ts.map +1 -0
- package/dist/delegate/program-permission.js +53 -0
- package/dist/delegate/program-permission.js.map +1 -0
- package/dist/delegate/register-worker-run.d.ts.map +1 -1
- package/dist/delegate/register-worker-run.js +27 -11
- package/dist/delegate/register-worker-run.js.map +1 -1
- package/dist/delegate/run-program.d.ts.map +1 -1
- package/dist/delegate/run-program.js +29 -8
- package/dist/delegate/run-program.js.map +1 -1
- package/dist/delegate/runs.d.ts +14 -4
- package/dist/delegate/runs.d.ts.map +1 -1
- package/dist/delegate/runs.js +49 -19
- package/dist/delegate/runs.js.map +1 -1
- package/dist/delegate/staging-guard.d.ts +9 -0
- package/dist/delegate/staging-guard.d.ts.map +1 -0
- package/dist/delegate/staging-guard.js +55 -0
- package/dist/delegate/staging-guard.js.map +1 -0
- package/dist/delegate/start-background.d.ts +7 -0
- package/dist/delegate/start-background.d.ts.map +1 -0
- package/dist/delegate/start-background.js +32 -0
- package/dist/delegate/start-background.js.map +1 -0
- package/dist/delegate/start-pending.d.ts +5 -0
- package/dist/delegate/start-pending.d.ts.map +1 -0
- package/dist/delegate/start-pending.js +42 -0
- package/dist/delegate/start-pending.js.map +1 -0
- package/dist/delegate/workers.d.ts +5 -2
- package/dist/delegate/workers.d.ts.map +1 -1
- package/dist/delegate/workers.js +44 -8
- package/dist/delegate/workers.js.map +1 -1
- package/dist/files/file-change.d.ts +28 -0
- package/dist/files/file-change.d.ts.map +1 -0
- package/dist/files/file-change.js +125 -0
- package/dist/files/file-change.js.map +1 -0
- package/dist/files/file-parts.d.ts +18 -0
- package/dist/files/file-parts.d.ts.map +1 -0
- package/dist/files/file-parts.js +40 -0
- package/dist/files/file-parts.js.map +1 -0
- package/dist/files/read-file.d.ts +9 -1
- package/dist/files/read-file.d.ts.map +1 -1
- package/dist/files/read-file.js +35 -13
- package/dist/files/read-file.js.map +1 -1
- package/dist/files/search-text.d.ts +12 -2
- package/dist/files/search-text.d.ts.map +1 -1
- package/dist/files/search-text.js +87 -23
- package/dist/files/search-text.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/jobs/job-rows.d.ts +11 -2
- package/dist/jobs/job-rows.d.ts.map +1 -1
- package/dist/jobs/job-rows.js +24 -13
- package/dist/jobs/job-rows.js.map +1 -1
- package/dist/jobs/process-handlers.d.ts.map +1 -1
- package/dist/jobs/process-handlers.js +12 -1
- package/dist/jobs/process-handlers.js.map +1 -1
- package/dist/jobs/process-report.d.ts.map +1 -1
- package/dist/jobs/process-report.js +2 -1
- package/dist/jobs/process-report.js.map +1 -1
- package/dist/jobs/process-run.d.ts.map +1 -1
- package/dist/jobs/process-run.js +2 -1
- package/dist/jobs/process-run.js.map +1 -1
- package/dist/jobs/register-jobs.d.ts.map +1 -1
- package/dist/jobs/register-jobs.js +1 -0
- package/dist/jobs/register-jobs.js.map +1 -1
- package/dist/maps/map-reminder.d.ts +7 -0
- package/dist/maps/map-reminder.d.ts.map +1 -0
- package/dist/maps/map-reminder.js +24 -0
- package/dist/maps/map-reminder.js.map +1 -0
- package/dist/maps/map-rules.d.ts +36 -0
- package/dist/maps/map-rules.d.ts.map +1 -0
- package/dist/maps/map-rules.js +86 -0
- package/dist/maps/map-rules.js.map +1 -0
- package/dist/maps/map-schema.d.ts +55 -0
- package/dist/maps/map-schema.d.ts.map +1 -0
- package/dist/maps/map-schema.js +27 -0
- package/dist/maps/map-schema.js.map +1 -0
- package/dist/maps/register-maps.d.ts +3 -0
- package/dist/maps/register-maps.d.ts.map +1 -0
- package/dist/maps/register-maps.js +21 -0
- package/dist/maps/register-maps.js.map +1 -0
- package/dist/mcp/connect.d.ts +2 -0
- package/dist/mcp/connect.d.ts.map +1 -1
- package/dist/mcp/connect.js +16 -4
- package/dist/mcp/connect.js.map +1 -1
- package/dist/mcp/oauth-provider.d.ts +8 -5
- package/dist/mcp/oauth-provider.d.ts.map +1 -1
- package/dist/mcp/oauth-provider.js +31 -22
- package/dist/mcp/oauth-provider.js.map +1 -1
- package/dist/mcp/secrets.d.ts +2 -0
- package/dist/mcp/secrets.d.ts.map +1 -1
- package/dist/mcp/secrets.js +6 -0
- package/dist/mcp/secrets.js.map +1 -1
- package/dist/mcp/sign-in.d.ts.map +1 -1
- package/dist/mcp/sign-in.js +12 -4
- package/dist/mcp/sign-in.js.map +1 -1
- package/dist/messages/receive-message.d.ts +2 -1
- package/dist/messages/receive-message.d.ts.map +1 -1
- package/dist/messages/receive-message.js +34 -9
- package/dist/messages/receive-message.js.map +1 -1
- package/dist/messages/register-messages.d.ts.map +1 -1
- package/dist/messages/register-messages.js +13 -8
- package/dist/messages/register-messages.js.map +1 -1
- package/dist/messages/send-receipt.d.ts +10 -0
- package/dist/messages/send-receipt.d.ts.map +1 -0
- package/dist/messages/send-receipt.js +14 -0
- package/dist/messages/send-receipt.js.map +1 -0
- package/dist/prompt/build-prompt.d.ts +1 -0
- package/dist/prompt/build-prompt.d.ts.map +1 -1
- package/dist/prompt/build-prompt.js +5 -1
- package/dist/prompt/build-prompt.js.map +1 -1
- package/dist/prompt/project-rules.d.ts +6 -0
- package/dist/prompt/project-rules.d.ts.map +1 -0
- package/dist/prompt/project-rules.js +37 -0
- package/dist/prompt/project-rules.js.map +1 -0
- package/dist/prompt/session-grants.d.ts +209 -0
- package/dist/prompt/session-grants.d.ts.map +1 -0
- package/dist/prompt/session-grants.js +50 -0
- package/dist/prompt/session-grants.js.map +1 -0
- package/dist/prompt/session-prompt.d.ts +3 -2
- package/dist/prompt/session-prompt.d.ts.map +1 -1
- package/dist/prompt/session-prompt.js +24 -40
- package/dist/prompt/session-prompt.js.map +1 -1
- package/dist/prompt/working-method.d.ts.map +1 -1
- package/dist/prompt/working-method.js +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-permission.d.ts +22 -0
- package/dist/turns/call-permission.d.ts.map +1 -0
- package/dist/turns/call-permission.js +49 -0
- package/dist/turns/call-permission.js.map +1 -0
- package/dist/turns/cancel-step-job.d.ts +14 -0
- package/dist/turns/cancel-step-job.d.ts.map +1 -0
- package/dist/turns/cancel-step-job.js +35 -0
- package/dist/turns/cancel-step-job.js.map +1 -0
- package/dist/turns/child-result.d.ts +7 -0
- package/dist/turns/child-result.d.ts.map +1 -0
- package/dist/turns/child-result.js +24 -0
- package/dist/turns/child-result.js.map +1 -0
- package/dist/turns/compaction.d.ts +15 -1
- package/dist/turns/compaction.d.ts.map +1 -1
- package/dist/turns/compaction.js +44 -16
- package/dist/turns/compaction.js.map +1 -1
- package/dist/turns/end-turn-state.d.ts +42 -0
- package/dist/turns/end-turn-state.d.ts.map +1 -0
- package/dist/turns/end-turn-state.js +64 -0
- package/dist/turns/end-turn-state.js.map +1 -0
- package/dist/turns/end-turn.d.ts +7 -8
- package/dist/turns/end-turn.d.ts.map +1 -1
- package/dist/turns/end-turn.js +52 -55
- package/dist/turns/end-turn.js.map +1 -1
- package/dist/turns/helper-calls.d.ts +6 -0
- package/dist/turns/helper-calls.d.ts.map +1 -0
- package/dist/turns/helper-calls.js +8 -0
- package/dist/turns/helper-calls.js.map +1 -0
- package/dist/turns/history.d.ts +3 -1
- package/dist/turns/history.d.ts.map +1 -1
- package/dist/turns/history.js +15 -7
- package/dist/turns/history.js.map +1 -1
- package/dist/turns/lost-reply.d.ts +7 -0
- package/dist/turns/lost-reply.d.ts.map +1 -1
- package/dist/turns/lost-reply.js +12 -0
- package/dist/turns/lost-reply.js.map +1 -1
- package/dist/turns/message-blocks.d.ts +2 -0
- package/dist/turns/message-blocks.d.ts.map +1 -1
- package/dist/turns/message-blocks.js +7 -0
- package/dist/turns/message-blocks.js.map +1 -1
- package/dist/turns/model-context.d.ts +2 -0
- package/dist/turns/model-context.d.ts.map +1 -1
- package/dist/turns/model-context.js +23 -4
- package/dist/turns/model-context.js.map +1 -1
- package/dist/turns/model-retry.d.ts +2 -1
- package/dist/turns/model-retry.d.ts.map +1 -1
- package/dist/turns/model-retry.js +5 -1
- package/dist/turns/model-retry.js.map +1 -1
- package/dist/turns/read-only.d.ts +6 -0
- package/dist/turns/read-only.d.ts.map +1 -0
- package/dist/turns/read-only.js +12 -0
- package/dist/turns/read-only.js.map +1 -0
- package/dist/turns/receipt-job.d.ts +5 -0
- package/dist/turns/receipt-job.d.ts.map +1 -0
- package/dist/turns/receipt-job.js +40 -0
- package/dist/turns/receipt-job.js.map +1 -0
- package/dist/turns/recover-workspace.d.ts +9 -0
- package/dist/turns/recover-workspace.d.ts.map +1 -0
- package/dist/turns/recover-workspace.js +79 -0
- package/dist/turns/recover-workspace.js.map +1 -0
- package/dist/turns/recovery-state.d.ts +19 -0
- package/dist/turns/recovery-state.d.ts.map +1 -0
- package/dist/turns/recovery-state.js +87 -0
- package/dist/turns/recovery-state.js.map +1 -0
- package/dist/turns/register-interruptions.d.ts.map +1 -1
- package/dist/turns/register-interruptions.js +19 -8
- package/dist/turns/register-interruptions.js.map +1 -1
- package/dist/turns/register-turns.d.ts.map +1 -1
- package/dist/turns/register-turns.js +42 -31
- package/dist/turns/register-turns.js.map +1 -1
- package/dist/turns/resolve.d.ts +4 -0
- package/dist/turns/resolve.d.ts.map +1 -1
- package/dist/turns/resolve.js +19 -17
- package/dist/turns/resolve.js.map +1 -1
- package/dist/turns/retry-turn.d.ts +4 -0
- package/dist/turns/retry-turn.d.ts.map +1 -0
- package/dist/turns/retry-turn.js +20 -0
- package/dist/turns/retry-turn.js.map +1 -0
- package/dist/turns/run-calls.d.ts +21 -4
- package/dist/turns/run-calls.d.ts.map +1 -1
- package/dist/turns/run-calls.js +157 -41
- package/dist/turns/run-calls.js.map +1 -1
- package/dist/turns/run-command.d.ts +5 -3
- package/dist/turns/run-command.d.ts.map +1 -1
- package/dist/turns/run-command.js +21 -12
- package/dist/turns/run-command.js.map +1 -1
- package/dist/turns/settle-calls.d.ts +2 -8
- package/dist/turns/settle-calls.d.ts.map +1 -1
- package/dist/turns/settle-calls.js +26 -35
- package/dist/turns/settle-calls.js.map +1 -1
- package/dist/turns/start-turn.d.ts +8 -83
- package/dist/turns/start-turn.d.ts.map +1 -1
- package/dist/turns/start-turn.js +35 -24
- package/dist/turns/start-turn.js.map +1 -1
- package/dist/turns/step-claim.d.ts +39 -0
- package/dist/turns/step-claim.d.ts.map +1 -0
- package/dist/turns/step-claim.js +72 -0
- package/dist/turns/step-claim.js.map +1 -0
- package/dist/turns/step-intents.d.ts +31 -0
- package/dist/turns/step-intents.d.ts.map +1 -0
- package/dist/turns/step-intents.js +101 -0
- package/dist/turns/step-intents.js.map +1 -0
- package/dist/turns/step-next.d.ts +17 -0
- package/dist/turns/step-next.d.ts.map +1 -0
- package/dist/turns/step-next.js +25 -0
- package/dist/turns/step-next.js.map +1 -0
- package/dist/turns/step.d.ts +1 -1
- package/dist/turns/step.d.ts.map +1 -1
- package/dist/turns/step.js +108 -88
- package/dist/turns/step.js.map +1 -1
- package/dist/turns/summary-facts.d.ts +25 -0
- package/dist/turns/summary-facts.d.ts.map +1 -0
- package/dist/turns/summary-facts.js +63 -0
- package/dist/turns/summary-facts.js.map +1 -0
- package/dist/turns/usage.d.ts +7 -0
- package/dist/turns/usage.d.ts.map +1 -0
- package/dist/turns/usage.js +18 -0
- package/dist/turns/usage.js.map +1 -0
- package/dist/ui/register-ui.js +3 -3
- package/dist/ui/register-ui.js.map +1 -1
- package/dist/web/components/approval.css +2 -0
- package/dist/web/components/approval.js +233 -0
- package/dist/web/components/call.css +1 -1
- package/dist/web/components/call.js +383 -287
- 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 +2902 -1593
- 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 +88 -12
- package/locales/en.json +88 -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
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { z } from '@kvman/sdk';
|
|
2
|
+
import { chatIdOf } from "../artifacts/artifact-records.js";
|
|
3
|
+
import { findSession } from "../sessions/session-lookup.js";
|
|
4
|
+
import { records } from "../store/collections.js";
|
|
5
|
+
import { mapNoteSchema, mapStepSchema } from "./map-schema.js";
|
|
6
|
+
// The person's view of a chat's execution map (plan 08 §8.6, ADR 0064, 8). Only the agent changes it, and a subagent's
|
|
7
|
+
// session answers with the map of the chat at its root.
|
|
8
|
+
export function registerMaps(ctx) {
|
|
9
|
+
ctx.registerQuery('kvcoder.map.get', {
|
|
10
|
+
description: "Gives a chat's execution map, or null when it has none.",
|
|
11
|
+
input: z.object({ sessionId: z.string() }),
|
|
12
|
+
output: z.object({ goal: z.string(), steps: z.array(mapStepSchema), notes: z.array(mapNoteSchema), version: z.number().int(), updatedAt: z.string() }).nullable(),
|
|
13
|
+
public: true,
|
|
14
|
+
handle: async ({ sessionId }) => {
|
|
15
|
+
const chatId = chatIdOf(await findSession(ctx, sessionId));
|
|
16
|
+
const [found] = await records(ctx.store).maps.find({ sessionId: chatId }, { limit: 1 });
|
|
17
|
+
return found === undefined ? null : { goal: found.goal, steps: found.steps, notes: found.notes, version: found.version, updatedAt: found.updatedAt };
|
|
18
|
+
},
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=register-maps.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"register-maps.js","sourceRoot":"","sources":["../../src/maps/register-maps.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAY,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,kCAAkC,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAC5D,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAE/D,uHAAuH;AACvH,wDAAwD;AAExD,MAAM,UAAU,YAAY,CAAC,GAAQ;IACnC,GAAG,CAAC,aAAa,CAAC,iBAAiB,EAAE;QACnC,WAAW,EAAE,yDAAyD;QACtE,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;QAC1C,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,QAAQ,EAAE;QACjK,MAAM,EAAE,IAAI;QACZ,MAAM,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE;YAC9B,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,WAAW,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC;YAC3D,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;YACxF,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC;QACvJ,CAAC;KACF,CAAC,CAAC;AACL,CAAC"}
|
package/dist/mcp/connect.d.ts
CHANGED
|
@@ -2,6 +2,8 @@ import { type Ctx } from '@kvman/sdk';
|
|
|
2
2
|
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
|
|
3
3
|
import type { RequestOptions } from '@modelcontextprotocol/sdk/shared/protocol.js';
|
|
4
4
|
import type { McpServer } from './servers.ts';
|
|
5
|
+
/** The variable a command server reads the workspace folder from. */
|
|
6
|
+
export declare const workspaceVariable = "KVMAN_WORKSPACE";
|
|
5
7
|
/** What the work gets: the connected client, and the options every request of this connection takes. */
|
|
6
8
|
export type Connection = {
|
|
7
9
|
client: Client;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connect.d.ts","sourceRoot":"","sources":["../../src/mcp/connect.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"connect.d.ts","sourceRoot":"","sources":["../../src/mcp/connect.ts"],"names":[],"mappings":"AAGA,OAAO,EAAgB,KAAK,GAAG,EAAE,MAAM,YAAY,CAAC;AAEpD,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAGnE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8CAA8C,CAAC;AAKnF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAO9C,qEAAqE;AACrE,eAAO,MAAM,iBAAiB,oBAAoB,CAAC;AAEnD,wGAAwG;AACxG,MAAM,MAAM,UAAU,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,cAAc,CAAA;CAAE,CAAC;AA+BrE,4GAA4G;AAC5G,wBAAsB,UAAU,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,UAAU,EAAE,UAAU,KAAK,OAAO,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAiB3J"}
|
package/dist/mcp/connect.js
CHANGED
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
import { mkdtemp, rm } from 'node:fs/promises';
|
|
2
|
+
import { tmpdir } from 'node:os';
|
|
3
|
+
import path from 'node:path';
|
|
1
4
|
import { ProblemError } from '@kvman/sdk';
|
|
2
5
|
import { UnauthorizedError } from '@modelcontextprotocol/sdk/client/auth.js';
|
|
3
6
|
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
|
|
@@ -6,16 +9,23 @@ import { OAuthError } from '@modelcontextprotocol/sdk/server/auth/errors.js';
|
|
|
6
9
|
import { commandTransport } from "./command-transport.js";
|
|
7
10
|
import { oauthProvider, registeredRedirect } from "./oauth-provider.js";
|
|
8
11
|
import { serverSecrets, withoutSecrets } from "./secrets.js";
|
|
12
|
+
// One connection to an MCP server (plan 08 §8.5, ADR 0020, 4): connect, do the work, close. Nothing is kept between
|
|
13
|
+
// calls. The connection ends with the job's signal and at the timeout, and a command's process tree is killed then.
|
|
14
|
+
// A command runs in a folder of its own that is deleted with the connection (ADR 0070, 7), so the logs and snapshots a
|
|
15
|
+
// server writes beside itself never land in the person's project; it finds the project in `KVMAN_WORKSPACE`.
|
|
16
|
+
/** The variable a command server reads the workspace folder from. */
|
|
17
|
+
export const workspaceVariable = 'KVMAN_WORKSPACE';
|
|
9
18
|
async function open(ctx, server, secrets) {
|
|
10
19
|
if ('command' in server) {
|
|
11
|
-
const
|
|
12
|
-
|
|
20
|
+
const folder = await mkdtemp(path.join(tmpdir(), 'kvman-mcp-'));
|
|
21
|
+
const command = commandTransport({ command: server.command, args: server.args, cwd: folder, env: { [workspaceVariable]: ctx.job.workspace.path, ...secrets } });
|
|
22
|
+
return { transport: command, command, folder };
|
|
13
23
|
}
|
|
14
24
|
// The client's class declares `sessionId` as `string | undefined`, which its own `Transport` doesn't take under
|
|
15
25
|
// `exactOptionalPropertyTypes`; it is the transport the client is written for.
|
|
16
26
|
// A server the person signed in to is called with its tokens, which are refreshed when they have expired.
|
|
17
|
-
const redirectUrl = await registeredRedirect(ctx, server.name);
|
|
18
|
-
const signedIn = redirectUrl === undefined ? {} : { authProvider: oauthProvider(ctx, server.name, { redirectUrl, step: 'call' }) };
|
|
27
|
+
const redirectUrl = await registeredRedirect(ctx, server.name, server.url);
|
|
28
|
+
const signedIn = redirectUrl === undefined ? {} : { authProvider: oauthProvider(ctx, server.name, server.url, { redirectUrl, step: 'call' }) };
|
|
19
29
|
const transport = new StreamableHTTPClientTransport(new URL(server.url), { requestInit: { headers: secrets }, ...signedIn });
|
|
20
30
|
return { transport };
|
|
21
31
|
}
|
|
@@ -49,6 +59,8 @@ export async function withServer(ctx, server, timeoutMs, work) {
|
|
|
49
59
|
}
|
|
50
60
|
finally {
|
|
51
61
|
await client.close();
|
|
62
|
+
if (opened.folder !== undefined)
|
|
63
|
+
await rm(opened.folder, { recursive: true, force: true });
|
|
52
64
|
}
|
|
53
65
|
}
|
|
54
66
|
//# sourceMappingURL=connect.js.map
|
package/dist/mcp/connect.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connect.js","sourceRoot":"","sources":["../../src/mcp/connect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAY,MAAM,YAAY,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0CAA0C,CAAC;AAC7E,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,6BAA6B,EAAE,mBAAmB,EAAE,MAAM,oDAAoD,CAAC;AACxH,OAAO,EAAE,UAAU,EAAE,MAAM,iDAAiD,CAAC;AAG7E,OAAO,EAAE,gBAAgB,EAAyB,MAAM,wBAAwB,CAAC;AACjF,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACxE,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"connect.js","sourceRoot":"","sources":["../../src/mcp/connect.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
import { type Ctx } from '@kvman/sdk';
|
|
2
2
|
import { type OAuthClientProvider } from '@modelcontextprotocol/sdk/client/auth.js';
|
|
3
|
-
/** A server's sign-in secrets. */
|
|
3
|
+
/** A server's sign-in secrets; each started sign-in keeps its own code verifier, under its state (ADR 0056, 7). */
|
|
4
4
|
export declare const oauthSecrets: (server: string) => {
|
|
5
5
|
client: string;
|
|
6
|
-
verifier: string;
|
|
7
6
|
tokens: string;
|
|
7
|
+
verifier: (state: string) => string;
|
|
8
8
|
};
|
|
9
|
-
/** The redirect address the server's client registration was made for, when there is one. */
|
|
10
|
-
export declare function registeredRedirect(ctx: Ctx, server: string): Promise<string | undefined>;
|
|
9
|
+
/** The redirect address the server's client registration was made for, when there is one for this URL. */
|
|
10
|
+
export declare function registeredRedirect(ctx: Ctx, server: string, serverUrl: string): Promise<string | undefined>;
|
|
11
|
+
/** The server's sign-in tokens for this URL: the values a tool's result must never carry out. */
|
|
12
|
+
export declare function tokenValues(ctx: Ctx, server: string, serverUrl: string): Promise<string[]>;
|
|
11
13
|
/** What the client is used for: starting a sign-in, exchanging its code, or a call that may only refresh tokens. */
|
|
12
14
|
export type SignIn = {
|
|
13
15
|
redirectUrl: string;
|
|
@@ -17,9 +19,10 @@ export type SignIn = {
|
|
|
17
19
|
} | {
|
|
18
20
|
redirectUrl: string;
|
|
19
21
|
step: 'finish';
|
|
22
|
+
state: string;
|
|
20
23
|
} | {
|
|
21
24
|
redirectUrl: string;
|
|
22
25
|
step: 'call';
|
|
23
26
|
};
|
|
24
|
-
export declare function oauthProvider(ctx: Ctx, server: string, signIn: SignIn): OAuthClientProvider;
|
|
27
|
+
export declare function oauthProvider(ctx: Ctx, server: string, serverUrl: string, signIn: SignIn): OAuthClientProvider;
|
|
25
28
|
//# sourceMappingURL=oauth-provider.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oauth-provider.d.ts","sourceRoot":"","sources":["../../src/mcp/oauth-provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAK,KAAK,GAAG,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAqB,KAAK,mBAAmB,EAAE,MAAM,0CAA0C,CAAC;AAOvG,
|
|
1
|
+
{"version":3,"file":"oauth-provider.d.ts","sourceRoot":"","sources":["../../src/mcp/oauth-provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAK,KAAK,GAAG,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAqB,KAAK,mBAAmB,EAAE,MAAM,0CAA0C,CAAC;AAOvG,mHAAmH;AACnH,eAAO,MAAM,YAAY,GAAI,QAAQ,MAAM;;;sBAAsG,MAAM;CAA+C,CAAC;AAavM,0GAA0G;AAC1G,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAEjH;AAED,iGAAiG;AACjG,wBAAsB,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAGhG;AAED,oHAAoH;AACpH,MAAM,MAAM,MAAM,GACd;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,gBAAgB,EAAE,GAAG,GAAG,IAAI,CAAA;CAAE,GACxF;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACtD;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAE1C,wBAAgB,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,mBAAmB,CAmC9G"}
|
|
@@ -3,42 +3,51 @@ import { UnauthorizedError } from '@modelcontextprotocol/sdk/client/auth.js';
|
|
|
3
3
|
// kvman as an OAuth client of one MCP server (plan 08 §8.5, ADR 0020, 8 and 16), over kvcoder's secrets: the client
|
|
4
4
|
// registration with the address it was made for, the code verifier of a sign-in under way, and the tokens. A tool
|
|
5
5
|
// call refreshes tokens but never sends the person to a browser: that is what a sign-in from the server's row does.
|
|
6
|
-
/** A server's sign-in secrets. */
|
|
7
|
-
export const oauthSecrets = (server) => ({ client: `mcp.${server}.oauth.client`,
|
|
8
|
-
|
|
9
|
-
const
|
|
10
|
-
|
|
6
|
+
/** A server's sign-in secrets; each started sign-in keeps its own code verifier, under its state (ADR 0056, 7). */
|
|
7
|
+
export const oauthSecrets = (server) => ({ client: `mcp.${server}.oauth.client`, tokens: `mcp.${server}.oauth.tokens`, verifier: (state) => `mcp.${server}.oauth.verifier.${state}` });
|
|
8
|
+
// The registration and the tokens carry the server's URL they were made for, and are used only with it (ADR 0056, 6).
|
|
9
|
+
const clientSchema = z.object({ redirectUrl: z.string(), serverUrl: z.string(), information: z.looseObject({ client_id: z.string() }) });
|
|
10
|
+
const tokensSchema = z.object({ serverUrl: z.string(), tokens: z.looseObject({ access_token: z.string(), token_type: z.string(), refresh_token: z.string().optional() }) });
|
|
11
|
+
// What was stored for another URL, or before a URL was kept with it, is as good as absent.
|
|
12
|
+
async function stored(ctx, name, schema, serverUrl) {
|
|
11
13
|
const value = await ctx.secrets.get(name);
|
|
12
|
-
|
|
14
|
+
const parsed = value === undefined ? undefined : schema.safeParse(JSON.parse(value));
|
|
15
|
+
return parsed?.success === true && parsed.data.serverUrl === serverUrl ? parsed.data : undefined;
|
|
13
16
|
}
|
|
14
|
-
/** The redirect address the server's client registration was made for, when there is one. */
|
|
15
|
-
export async function registeredRedirect(ctx, server) {
|
|
16
|
-
return (await stored(ctx, oauthSecrets(server).client, clientSchema))?.redirectUrl;
|
|
17
|
+
/** The redirect address the server's client registration was made for, when there is one for this URL. */
|
|
18
|
+
export async function registeredRedirect(ctx, server, serverUrl) {
|
|
19
|
+
return (await stored(ctx, oauthSecrets(server).client, clientSchema, serverUrl))?.redirectUrl;
|
|
17
20
|
}
|
|
18
|
-
|
|
21
|
+
/** The server's sign-in tokens for this URL: the values a tool's result must never carry out. */
|
|
22
|
+
export async function tokenValues(ctx, server, serverUrl) {
|
|
23
|
+
const tokens = (await stored(ctx, oauthSecrets(server).tokens, tokensSchema, serverUrl))?.tokens;
|
|
24
|
+
return tokens === undefined ? [] : [tokens.access_token, ...(tokens.refresh_token === undefined ? [] : [tokens.refresh_token])];
|
|
25
|
+
}
|
|
26
|
+
export function oauthProvider(ctx, server, serverUrl, signIn) {
|
|
19
27
|
const names = oauthSecrets(server);
|
|
28
|
+
const verifier = signIn.step === 'call' ? undefined : names.verifier(signIn.state);
|
|
20
29
|
return {
|
|
21
30
|
redirectUrl: signIn.redirectUrl,
|
|
22
31
|
clientMetadata: { client_name: 'kvman', redirect_uris: [signIn.redirectUrl], grant_types: ['authorization_code', 'refresh_token'], response_types: ['code'], token_endpoint_auth_method: 'none' },
|
|
23
32
|
...(signIn.step === 'start' ? { state: () => signIn.state } : {}),
|
|
24
33
|
// A registration made for another address (kvman on another port) can't be used with this one.
|
|
25
34
|
clientInformation: async () => {
|
|
26
|
-
const client = await stored(ctx, names.client, clientSchema);
|
|
35
|
+
const client = await stored(ctx, names.client, clientSchema, serverUrl);
|
|
27
36
|
return client?.redirectUrl === signIn.redirectUrl ? client.information : undefined;
|
|
28
37
|
},
|
|
29
38
|
// A call never registers kvman with a server: only a sign-in the person started does.
|
|
30
|
-
...(signIn.step === 'call' ? {} : { saveClientInformation: (information) => ctx.secrets.set(names.client, JSON.stringify({ redirectUrl: signIn.redirectUrl, information })) }),
|
|
31
|
-
tokens: async () => (await stored(ctx, names.tokens, tokensSchema)),
|
|
32
|
-
saveTokens: (tokens) => ctx.secrets.set(names.tokens, JSON.stringify(tokens)),
|
|
33
|
-
saveCodeVerifier: async (
|
|
34
|
-
if (signIn.step === 'start')
|
|
35
|
-
await ctx.secrets.set(
|
|
39
|
+
...(signIn.step === 'call' ? {} : { saveClientInformation: (information) => ctx.secrets.set(names.client, JSON.stringify({ redirectUrl: signIn.redirectUrl, serverUrl, information })) }),
|
|
40
|
+
tokens: async () => (await stored(ctx, names.tokens, tokensSchema, serverUrl))?.tokens,
|
|
41
|
+
saveTokens: (tokens) => ctx.secrets.set(names.tokens, JSON.stringify({ serverUrl, tokens })),
|
|
42
|
+
saveCodeVerifier: async (value) => {
|
|
43
|
+
if (signIn.step === 'start' && verifier !== undefined)
|
|
44
|
+
await ctx.secrets.set(verifier, value);
|
|
36
45
|
},
|
|
37
46
|
codeVerifier: async () => {
|
|
38
|
-
const
|
|
39
|
-
if (
|
|
47
|
+
const value = verifier === undefined ? undefined : await ctx.secrets.get(verifier);
|
|
48
|
+
if (value === undefined)
|
|
40
49
|
throw new UnauthorizedError('No sign-in is under way.');
|
|
41
|
-
return
|
|
50
|
+
return value;
|
|
42
51
|
},
|
|
43
52
|
redirectToAuthorization: (authorizationUrl) => {
|
|
44
53
|
if (signIn.step !== 'start')
|
|
@@ -51,8 +60,8 @@ export function oauthProvider(ctx, server, signIn) {
|
|
|
51
60
|
await ctx.secrets.delete(names.tokens);
|
|
52
61
|
if (scope === 'all' || scope === 'client')
|
|
53
62
|
await ctx.secrets.delete(names.client);
|
|
54
|
-
if (scope === 'all' || scope === 'verifier')
|
|
55
|
-
await ctx.secrets.delete(
|
|
63
|
+
if ((scope === 'all' || scope === 'verifier') && verifier !== undefined)
|
|
64
|
+
await ctx.secrets.delete(verifier);
|
|
56
65
|
},
|
|
57
66
|
};
|
|
58
67
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oauth-provider.js","sourceRoot":"","sources":["../../src/mcp/oauth-provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAY,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,iBAAiB,EAA4B,MAAM,0CAA0C,CAAC;AAGvG,oHAAoH;AACpH,kHAAkH;AAClH,oHAAoH;AAEpH,
|
|
1
|
+
{"version":3,"file":"oauth-provider.js","sourceRoot":"","sources":["../../src/mcp/oauth-provider.ts"],"names":[],"mappings":"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"}
|
package/dist/mcp/secrets.d.ts
CHANGED
|
@@ -2,6 +2,8 @@ import type { Ctx } from '@kvman/sdk';
|
|
|
2
2
|
import type { McpServer } from './servers.ts';
|
|
3
3
|
/** The values a server is given, by variable or header name; a name without a secret is left out. */
|
|
4
4
|
export declare function serverSecrets(ctx: Ctx, server: McpServer): Promise<Record<string, string>>;
|
|
5
|
+
/** Every secret value kvman holds for a server: what it is given, and its sign-in tokens (ADR 0056, 9). */
|
|
6
|
+
export declare function knownSecrets(ctx: Ctx, server: McpServer): Promise<Record<string, string>>;
|
|
5
7
|
/** A text with every one of the values replaced by `***`, so a server's failure can't carry a secret out. */
|
|
6
8
|
export declare function withoutSecrets(text: string, values: Readonly<Record<string, string>>): string;
|
|
7
9
|
//# sourceMappingURL=secrets.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"secrets.d.ts","sourceRoot":"","sources":["../../src/mcp/secrets.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"secrets.d.ts","sourceRoot":"","sources":["../../src/mcp/secrets.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AAEtC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAK9C,qGAAqG;AACrG,wBAAsB,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAQhG;AAED,2GAA2G;AAC3G,wBAAsB,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAG/F;AAED,6GAA6G;AAC7G,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG,MAAM,CAI7F"}
|
package/dist/mcp/secrets.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { tokenValues } from "./oauth-provider.js";
|
|
1
2
|
// A server's secret values (plan 08 §8.5, ADR 0020, 6): kvcoder's secrets `mcp.<server>.env.<VARIABLE>` and
|
|
2
3
|
// `mcp.<server>.header.<Header>`. They go to the server and nowhere else.
|
|
3
4
|
/** The values a server is given, by variable or header name; a name without a secret is left out. */
|
|
@@ -11,6 +12,11 @@ export async function serverSecrets(ctx, server) {
|
|
|
11
12
|
}
|
|
12
13
|
return values;
|
|
13
14
|
}
|
|
15
|
+
/** Every secret value kvman holds for a server: what it is given, and its sign-in tokens (ADR 0056, 9). */
|
|
16
|
+
export async function knownSecrets(ctx, server) {
|
|
17
|
+
const tokens = 'url' in server ? await tokenValues(ctx, server.name, server.url) : [];
|
|
18
|
+
return { ...(await serverSecrets(ctx, server)), ...Object.fromEntries(tokens.map((value, index) => [`token ${String(index)}`, value])) };
|
|
19
|
+
}
|
|
14
20
|
/** A text with every one of the values replaced by `***`, so a server's failure can't carry a secret out. */
|
|
15
21
|
export function withoutSecrets(text, values) {
|
|
16
22
|
return Object.values(values)
|
package/dist/mcp/secrets.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"secrets.js","sourceRoot":"","sources":["../../src/mcp/secrets.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"secrets.js","sourceRoot":"","sources":["../../src/mcp/secrets.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAGlD,4GAA4G;AAC5G,0EAA0E;AAE1E,qGAAqG;AACrG,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,GAAQ,EAAE,MAAiB;IAC7D,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,SAAS,IAAI,MAAM,CAAC,CAAC,CAAE,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,CAAW,CAAC,CAAC,CAAE,CAAC,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAW,CAAC;IACnH,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,MAAM,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC;QAC1E,IAAI,KAAK,KAAK,SAAS;YAAE,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;IAChD,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,2GAA2G;AAC3G,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,GAAQ,EAAE,MAAiB;IAC5D,MAAM,MAAM,GAAG,KAAK,IAAI,MAAM,CAAC,CAAC,CAAC,MAAM,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACtF,OAAO,EAAE,GAAG,CAAC,MAAM,aAAa,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,EAAE,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,SAAS,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;AAC3I,CAAC;AAED,6GAA6G;AAC7G,MAAM,UAAU,cAAc,CAAC,IAAY,EAAE,MAAwC;IACnF,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC;SACzB,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,EAAE,CAAC;SAC/B,MAAM,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC;AACxE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sign-in.d.ts","sourceRoot":"","sources":["../../src/mcp/sign-in.ts"],"names":[],"mappings":"AACA,OAAO,EAAgB,KAAK,GAAG,EAAE,MAAM,YAAY,CAAC;AAiBpD,sGAAsG;AACtG,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAIrD;
|
|
1
|
+
{"version":3,"file":"sign-in.d.ts","sourceRoot":"","sources":["../../src/mcp/sign-in.ts"],"names":[],"mappings":"AACA,OAAO,EAAgB,KAAK,GAAG,EAAE,MAAM,YAAY,CAAC;AAiBpD,sGAAsG;AACtG,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAIrD;AAaD,+DAA+D;AAC/D,wBAAsB,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC,CAiBvG;AAED,4FAA4F;AAC5F,wBAAsB,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAkBnG"}
|
package/dist/mcp/sign-in.js
CHANGED
|
@@ -23,6 +23,11 @@ const failed = (error) => {
|
|
|
23
23
|
const reason = error instanceof Error ? error.message : String(error);
|
|
24
24
|
return new ProblemError({ code: 'kvcoder/MCP_SIGN_IN_FAILED', message: `The sign-in failed: ${reason}`, params: { reason } });
|
|
25
25
|
};
|
|
26
|
+
// A started sign-in that can no longer finish: its record and its verifier go together.
|
|
27
|
+
async function forget(ctx, started) {
|
|
28
|
+
await records(ctx.store).signIns.delete(started.id);
|
|
29
|
+
await ctx.secrets.delete(oauthSecrets(started.server).verifier(started.state));
|
|
30
|
+
}
|
|
26
31
|
/** Starts a sign-in and gives the address the person opens. */
|
|
27
32
|
export async function startSignIn(ctx, name, redirectUrl) {
|
|
28
33
|
if (!isSignInPage(redirectUrl))
|
|
@@ -35,7 +40,7 @@ export async function startSignIn(ctx, name, redirectUrl) {
|
|
|
35
40
|
const state = randomUUID();
|
|
36
41
|
let opened;
|
|
37
42
|
try {
|
|
38
|
-
await auth(oauthProvider(ctx, name, { redirectUrl, step: 'start', state, open: (authorizationUrl) => void (opened = authorizationUrl) }), { serverUrl: server.url });
|
|
43
|
+
await auth(oauthProvider(ctx, name, server.url, { redirectUrl, step: 'start', state, open: (authorizationUrl) => void (opened = authorizationUrl) }), { serverUrl: server.url });
|
|
39
44
|
}
|
|
40
45
|
catch (error) {
|
|
41
46
|
if (error instanceof ProblemError || ctx.job.signal.aborted)
|
|
@@ -52,15 +57,18 @@ export async function finishSignIn(ctx, state, code) {
|
|
|
52
57
|
const { signIns } = records(ctx.store);
|
|
53
58
|
for (const old of await signIns.find({}, { limit: 1000 }))
|
|
54
59
|
if (old.at < jobTime(ctx) - signInLifeMs)
|
|
55
|
-
await
|
|
60
|
+
await forget(ctx, old);
|
|
56
61
|
const [started] = await signIns.find({ state }, { limit: 1 });
|
|
57
62
|
if (started === undefined)
|
|
58
63
|
throw failed(new Error('it was not started here, was already finished, or took more than 10 minutes'));
|
|
59
64
|
await signIns.delete(started.id);
|
|
60
65
|
try {
|
|
61
|
-
const result = await auth(oauthProvider(ctx, started.server, { redirectUrl: started.redirectUrl, step: 'finish' }), { serverUrl: started.url, authorizationCode: code });
|
|
66
|
+
const result = await auth(oauthProvider(ctx, started.server, started.url, { redirectUrl: started.redirectUrl, step: 'finish', state }), { serverUrl: started.url, authorizationCode: code });
|
|
62
67
|
if (result !== 'AUTHORIZED')
|
|
63
68
|
throw new Error('the server did not accept the code');
|
|
69
|
+
// A sign-in of this server started earlier and finished later would replace these tokens (ADR 0056, 7).
|
|
70
|
+
for (const other of await signIns.find({ server: started.server }, { limit: 1000 }))
|
|
71
|
+
await forget(ctx, other);
|
|
64
72
|
}
|
|
65
73
|
catch (error) {
|
|
66
74
|
if (error instanceof ProblemError || ctx.job.signal.aborted)
|
|
@@ -68,7 +76,7 @@ export async function finishSignIn(ctx, state, code) {
|
|
|
68
76
|
throw failed(error);
|
|
69
77
|
}
|
|
70
78
|
finally {
|
|
71
|
-
await ctx.secrets.delete(oauthSecrets(started.server).verifier);
|
|
79
|
+
await ctx.secrets.delete(oauthSecrets(started.server).verifier(state));
|
|
72
80
|
}
|
|
73
81
|
return { name: started.server };
|
|
74
82
|
}
|
package/dist/mcp/sign-in.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sign-in.js","sourceRoot":"","sources":["../../src/mcp/sign-in.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"sign-in.js","sourceRoot":"","sources":["../../src/mcp/sign-in.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,6 +10,7 @@ export type Incoming = {
|
|
|
10
10
|
fileIds: readonly string[];
|
|
11
11
|
source: Source;
|
|
12
12
|
mayStart: boolean;
|
|
13
|
+
sendId?: string | undefined;
|
|
13
14
|
};
|
|
14
|
-
export declare function receiveMessage(ctx: Ctx, session: Stored<SessionDoc>, incoming: Incoming): Promise<void>;
|
|
15
|
+
export declare function receiveMessage(ctx: Ctx, session: Stored<SessionDoc>, incoming: Incoming, recover?: boolean): Promise<void>;
|
|
15
16
|
//# sourceMappingURL=receive-message.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"receive-message.d.ts","sourceRoot":"","sources":["../../src/messages/receive-message.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAIpD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"receive-message.d.ts","sourceRoot":"","sources":["../../src/messages/receive-message.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAIpD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAmBhE,8HAA8H;AAC9H,wBAAsB,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,CAAC,UAAU,CAAC,EAAE,OAAO,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC;IAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IAAC,MAAM,EAAE,IAAI,EAAE,CAAA;CAAE,CAAC,CAKhJ;AAED,MAAM,MAAM,QAAQ,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CAAC;AAEpI,wBAAsB,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,CAAC,UAAU,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,UAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CA6C9H"}
|
|
@@ -2,12 +2,16 @@ import { dismissedText } from "../connectors/ask.js";
|
|
|
2
2
|
import { reportInterrupted } from "../jobs/process-report.js";
|
|
3
3
|
import { invalid } from "../problems.js";
|
|
4
4
|
import { now } from "../sessions/session-lookup.js";
|
|
5
|
-
import { txRecords } from "../store/collections.js";
|
|
5
|
+
import { records, txRecords } from "../store/collections.js";
|
|
6
|
+
import { runningInBackground } from "../jobs/job-rows.js";
|
|
6
7
|
import { appendMessage, userContent } from "../turns/history.js";
|
|
7
8
|
import { modelInfo } from "../turns/model-info.js";
|
|
9
|
+
import { recoverSession, recoverWorkspace } from "../turns/recover-workspace.js";
|
|
8
10
|
import { heldText } from "../turns/resolve.js";
|
|
9
|
-
import { beginTurn,
|
|
11
|
+
import { beginTurn, dispatchStep, openTurn } from "../turns/start-turn.js";
|
|
12
|
+
import { prepareStep } from "../turns/step-intents.js";
|
|
10
13
|
import { saveAttachments, withAttachments } from "./attachments.js";
|
|
14
|
+
import { acknowledged, sentBy } from "./send-receipt.js";
|
|
11
15
|
// A message from the person or an extension (plan 08 §8.1): on an idle session it starts a turn; on a running one it
|
|
12
16
|
// waits for the step's results; on a waiting one it dismisses the pending questions and denies the approvals, and the
|
|
13
17
|
// next step runs once no subagent is left to wait for (ADR 0009, 90).
|
|
@@ -20,21 +24,36 @@ export async function sortedFiles(ctx, session, fileIds) {
|
|
|
20
24
|
throw invalid(`The model ${session.model ?? '(none)'} doesn't take images.`, { model: session.model });
|
|
21
25
|
return { images, others: files.filter((file) => !imageTypes.has(file.type)) };
|
|
22
26
|
}
|
|
23
|
-
export async function receiveMessage(ctx, session, incoming) {
|
|
27
|
+
export async function receiveMessage(ctx, session, incoming, recover = false) {
|
|
28
|
+
const sent = incoming.sendId === undefined ? undefined : sentBy(incoming.sendId, session.id, incoming.text, incoming.fileIds);
|
|
29
|
+
// Before any file work: an accepted send has already moved its uploads into the workspace (ADR 0048, 4).
|
|
30
|
+
if (sent !== undefined && acknowledged((await records(ctx.store).sendReceipts.find({ sendId: sent.sendId }, { limit: 1 }))[0], sent))
|
|
31
|
+
return;
|
|
24
32
|
await reportInterrupted(ctx, session.id);
|
|
25
33
|
const { images, others } = await sortedFiles(ctx, session, incoming.fileIds);
|
|
26
34
|
const text = withAttachments(incoming.text, await saveAttachments(ctx, others));
|
|
27
35
|
const files = images.length === 0 ? { fileIds: null, fileNames: null } : { fileIds: images.map((file) => file.id), fileNames: images.map((file) => file.name) };
|
|
36
|
+
if (recover)
|
|
37
|
+
await recoverWorkspace(ctx, session.id);
|
|
38
|
+
// What still runs is told with the person's message, and stored with it so what is sent never changes (ADR 0068, 4).
|
|
39
|
+
const running = incoming.source.kind === 'user' ? await runningInBackground(ctx, session.id) : [];
|
|
28
40
|
const next = await ctx.store.transaction((tx) => {
|
|
29
41
|
const store = txRecords(tx);
|
|
30
|
-
const fresh = store.sessions.get(session.id)
|
|
42
|
+
const fresh = store.sessions.get(session.id);
|
|
43
|
+
if (fresh === undefined)
|
|
44
|
+
throw ctx.problem('kvcoder/SESSION_NOT_FOUND', { sessionId: session.id });
|
|
45
|
+
if (sent !== undefined) {
|
|
46
|
+
if (acknowledged(store.sendReceipts.find({ sendId: sent.sendId }, { limit: 1 })[0], sent))
|
|
47
|
+
return undefined;
|
|
48
|
+
store.sendReceipts.insert({ ...sent, createdAt: now() });
|
|
49
|
+
}
|
|
31
50
|
if (fresh.status === 'idle') {
|
|
32
51
|
if (fresh.autoTitle && fresh.title === '')
|
|
33
52
|
store.sessions.update(fresh.id, { title: incoming.text.slice(0, 60) });
|
|
34
|
-
appendMessage(store, fresh, { kind: 'user', content: userContent(text), source: incoming.source, ...files });
|
|
53
|
+
appendMessage(store, fresh, { kind: 'user', content: userContent(text, running), source: incoming.source, ...files });
|
|
35
54
|
return incoming.mayStart ? { start: openTurn(store, fresh) } : {};
|
|
36
55
|
}
|
|
37
|
-
store.queued.insert({ sessionId: fresh.id, source: incoming.source, text, ...files, createdAt: now() });
|
|
56
|
+
store.queued.insert({ sessionId: fresh.id, source: incoming.source, text, ...(running.length === 0 ? {} : { running }), ...files, createdAt: now() });
|
|
38
57
|
const turn = fresh.turnId === null ? undefined : store.turns.get(fresh.turnId);
|
|
39
58
|
if (fresh.status === 'running' || !incoming.mayStart || turn === undefined)
|
|
40
59
|
return {};
|
|
@@ -46,15 +65,21 @@ export async function receiveMessage(ctx, session, incoming) {
|
|
|
46
65
|
return heldText(item.toolCallId, dismissedText(question?.kind ?? 'text'), true);
|
|
47
66
|
});
|
|
48
67
|
const pending = turn.pending.filter((item) => item.questionId === null);
|
|
49
|
-
|
|
68
|
+
// What was held back behind those approvals is settled too, and never run (ADR 0046, amendment 5).
|
|
69
|
+
const skipped = turn.deferredCalls.map((item) => heldText(item.toolCallId, 'not run: the person sent a message instead of deciding the earlier call', true));
|
|
70
|
+
store.turns.update(turn.id, { pending, results: [...turn.results, ...results, ...skipped], deferredCalls: [] });
|
|
50
71
|
if (pending.length > 0)
|
|
51
72
|
return {};
|
|
52
73
|
store.sessions.update(fresh.id, { status: 'running', updatedAt: now() });
|
|
53
|
-
return { resume: turn.id };
|
|
74
|
+
return { resume: prepareStep(store, fresh.id, turn.id) };
|
|
54
75
|
});
|
|
76
|
+
if (next === undefined)
|
|
77
|
+
return;
|
|
55
78
|
if (next.start !== undefined)
|
|
56
79
|
await beginTurn(ctx, session.id, next.start, true);
|
|
57
80
|
if (next.resume !== undefined)
|
|
58
|
-
await
|
|
81
|
+
await dispatchStep(ctx, next.resume, true);
|
|
82
|
+
if (recover)
|
|
83
|
+
await recoverSession(ctx, session.id);
|
|
59
84
|
}
|
|
60
85
|
//# sourceMappingURL=receive-message.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"receive-message.js","sourceRoot":"","sources":["../../src/messages/receive-message.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAEzC,OAAO,EAAE,GAAG,EAAE,MAAM,+BAA+B,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"receive-message.js","sourceRoot":"","sources":["../../src/messages/receive-message.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"register-messages.d.ts","sourceRoot":"","sources":["../../src/messages/register-messages.ts"],"names":[],"mappings":"AAAA,OAAO,EAAK,KAAK,GAAG,EAAE,MAAM,YAAY,CAAC;AAczC,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"register-messages.d.ts","sourceRoot":"","sources":["../../src/messages/register-messages.ts"],"names":[],"mappings":"AAAA,OAAO,EAAK,KAAK,GAAG,EAAE,MAAM,YAAY,CAAC;AAczC,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI,CA2D/C"}
|
|
@@ -4,21 +4,21 @@ import { findSession, ownSession, userOnly } from "../sessions/session-lookup.js
|
|
|
4
4
|
import { messageSchema, messageView, queuedView } from "../sessions/session-view.js";
|
|
5
5
|
import { records, txRecords } from "../store/collections.js";
|
|
6
6
|
import { appendMessage } from "../turns/history.js";
|
|
7
|
-
import { newestMessages } from "../turns/message-blocks.js";
|
|
7
|
+
import { messagesBefore, messagesFrom, newestMessages } from "../turns/message-blocks.js";
|
|
8
8
|
import { jsonBytes, listOutputBytes, newestThatFit } from "./fitting-messages.js";
|
|
9
9
|
import { receiveMessage } from "./receive-message.js";
|
|
10
10
|
// Messages (plan 08 §8.6): the person's `message.send`, extensions' `message.inject`, display-only notes, and the list.
|
|
11
11
|
const sendSchema = z.object({ sessionId: z.string(), text: z.string().min(1), fileIds: z.array(z.string()).exactOptional() });
|
|
12
12
|
export function registerMessages(ctx) {
|
|
13
13
|
ctx.registerCommand('kvcoder.message.send', {
|
|
14
|
-
description: "Sends the person's message: it starts a turn, steers the running one, or answers a waiting one.",
|
|
15
|
-
input: sendSchema,
|
|
14
|
+
description: "Sends the person's message: it starts a turn, steers the running one, or answers a waiting one. A repeat with the same sendId is acknowledged and adds nothing.",
|
|
15
|
+
input: sendSchema.extend({ sendId: z.string().min(1).max(100).exactOptional() }),
|
|
16
16
|
output: z.object({}),
|
|
17
17
|
public: true,
|
|
18
18
|
retries: 0,
|
|
19
|
-
handle: async ({ sessionId, text, fileIds }) => {
|
|
19
|
+
handle: async ({ sessionId, text, fileIds, sendId }) => {
|
|
20
20
|
userOnly(ctx, 'kvcoder.message.send');
|
|
21
|
-
await receiveMessage(ctx, await ownSession(ctx, sessionId), { text, fileIds: fileIds ?? [], source: { kind: 'user' }, mayStart: true });
|
|
21
|
+
await receiveMessage(ctx, await ownSession(ctx, sessionId), { text, fileIds: fileIds ?? [], source: { kind: 'user' }, mayStart: true, sendId }, true);
|
|
22
22
|
return {};
|
|
23
23
|
},
|
|
24
24
|
});
|
|
@@ -48,14 +48,19 @@ export function registerMessages(ctx) {
|
|
|
48
48
|
},
|
|
49
49
|
});
|
|
50
50
|
ctx.registerQuery('kvcoder.message.list', {
|
|
51
|
-
description: "Lists a session's newest messages in order, the count of older ones, and the messages waiting for the step.",
|
|
52
|
-
input: z.object({ sessionId: z.string(), limit: z.number().int().positive().max(1000), afterSeq: z.number().int().exactOptional() }),
|
|
51
|
+
description: "Lists a session's newest messages in order, the count of older ones, and the messages waiting for the step; with beforeSeq, the newest of those before it.",
|
|
52
|
+
input: z.object({ sessionId: z.string(), limit: z.number().int().positive().max(1000), afterSeq: z.number().int().exactOptional(), beforeSeq: z.number().int().nonnegative().exactOptional() }),
|
|
53
53
|
output: z.object({ messages: z.array(messageSchema), omitted: z.number().int() }),
|
|
54
54
|
public: true,
|
|
55
55
|
maxOutputBytes: listOutputBytes,
|
|
56
|
-
handle: async ({ sessionId, limit, afterSeq }) => {
|
|
56
|
+
handle: async ({ sessionId, limit, afterSeq, beforeSeq }) => {
|
|
57
57
|
const session = await findSession(ctx, sessionId);
|
|
58
58
|
const store = records(ctx.store);
|
|
59
|
+
// An earlier page (ADR 0059): the newest messages before `beforeSeq`, and how many are older still.
|
|
60
|
+
if (beforeSeq !== undefined) {
|
|
61
|
+
const earlier = newestThatFit((await messagesBefore(ctx, sessionId, limit, beforeSeq)).map(messageView), listOutputBytes);
|
|
62
|
+
return { messages: earlier, omitted: await store.messages.count({ sessionId }) - (await messagesFrom(ctx, sessionId, earlier[0]?.seq ?? beforeSeq, session.nextSeq)).length };
|
|
63
|
+
}
|
|
59
64
|
const queued = (await store.queued.find({ sessionId }, { limit: 1000 })).map(queuedView);
|
|
60
65
|
const stored = await store.messages.count({ sessionId });
|
|
61
66
|
const newest = (await newestMessages(ctx, sessionId, limit, session.nextSeq)).filter((message) => afterSeq === undefined || message.seq > afterSeq).map(messageView);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"register-messages.js","sourceRoot":"","sources":["../../src/messages/register-messages.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAY,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AAClF,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AACrF,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"register-messages.js","sourceRoot":"","sources":["../../src/messages/register-messages.ts"],"names":[],"mappings":"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"}
|