@kvman/kvcoder 0.1.10 → 0.1.12
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 +48 -2
- package/dist/api.d.ts.map +1 -1
- package/dist/calls/call-name.d.ts +8 -0
- package/dist/calls/call-name.d.ts.map +1 -0
- package/dist/calls/call-name.js +47 -0
- package/dist/calls/call-name.js.map +1 -0
- package/dist/calls/line-run.d.ts +1 -4
- package/dist/calls/line-run.d.ts.map +1 -1
- package/dist/calls/line-run.js +2 -2
- package/dist/calls/line-run.js.map +1 -1
- package/dist/calls/run-tool.d.ts +1 -6
- package/dist/calls/run-tool.d.ts.map +1 -1
- package/dist/calls/run-tool.js +5 -6
- package/dist/calls/run-tool.js.map +1 -1
- package/dist/connector-call.d.ts +3 -3
- package/dist/connector-call.d.ts.map +1 -1
- package/dist/connector-call.js +5 -3
- package/dist/connector-call.js.map +1 -1
- package/dist/connectors/artifact.d.ts +2 -1
- package/dist/connectors/artifact.d.ts.map +1 -1
- package/dist/connectors/artifact.js +1 -1
- package/dist/connectors/artifact.js.map +1 -1
- package/dist/connectors/background.d.ts.map +1 -1
- package/dist/connectors/background.js +17 -7
- package/dist/connectors/background.js.map +1 -1
- package/dist/connectors/binary.js +2 -2
- package/dist/connectors/binary.js.map +1 -1
- package/dist/connectors/builtin-connectors.d.ts +62 -2
- 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/connector-command.d.ts +0 -1
- package/dist/connectors/connector-command.d.ts.map +1 -1
- package/dist/connectors/connector-command.js +1 -1
- package/dist/connectors/connector-command.js.map +1 -1
- package/dist/connectors/delegate.d.ts +17 -0
- package/dist/connectors/delegate.d.ts.map +1 -1
- package/dist/connectors/delegate.js +31 -6
- package/dist/connectors/delegate.js.map +1 -1
- package/dist/connectors/execution-map.d.ts +14 -3
- package/dist/connectors/execution-map.d.ts.map +1 -1
- package/dist/connectors/execution-map.js +43 -12
- package/dist/connectors/execution-map.js.map +1 -1
- package/dist/connectors/fs.d.ts +29 -1
- package/dist/connectors/fs.d.ts.map +1 -1
- package/dist/connectors/fs.js +46 -9
- package/dist/connectors/fs.js.map +1 -1
- package/dist/connectors/payload-fields.d.ts +3 -0
- package/dist/connectors/payload-fields.d.ts.map +1 -1
- package/dist/connectors/payload-fields.js +8 -2
- package/dist/connectors/payload-fields.js.map +1 -1
- package/dist/connectors/shell.js +1 -1
- package/dist/connectors/shell.js.map +1 -1
- package/dist/connectors/web.d.ts +16 -0
- package/dist/connectors/web.d.ts.map +1 -0
- package/dist/connectors/web.js +22 -0
- package/dist/connectors/web.js.map +1 -0
- package/dist/delegate/approved-run.js +2 -2
- package/dist/delegate/approved-run.js.map +1 -1
- package/dist/delegate/continue-helper.d.ts +18 -0
- package/dist/delegate/continue-helper.d.ts.map +1 -0
- package/dist/delegate/continue-helper.js +64 -0
- package/dist/delegate/continue-helper.js.map +1 -0
- package/dist/delegate/permission.d.ts +11 -5
- package/dist/delegate/permission.d.ts.map +1 -1
- package/dist/delegate/runs.d.ts +9 -11
- package/dist/delegate/runs.d.ts.map +1 -1
- package/dist/delegate/runs.js +13 -9
- package/dist/delegate/runs.js.map +1 -1
- package/dist/delegate/workers.d.ts +6 -0
- package/dist/delegate/workers.d.ts.map +1 -1
- package/dist/files/change-diff.d.ts +17 -0
- package/dist/files/change-diff.d.ts.map +1 -0
- package/dist/files/change-diff.js +59 -0
- package/dist/files/change-diff.js.map +1 -0
- package/dist/files/edit-places.d.ts +11 -0
- package/dist/files/edit-places.d.ts.map +1 -0
- package/dist/files/edit-places.js +105 -0
- package/dist/files/edit-places.js.map +1 -0
- package/dist/files/edit-text.d.ts +1 -0
- package/dist/files/edit-text.d.ts.map +1 -1
- package/dist/files/edit-text.js +22 -10
- package/dist/files/edit-text.js.map +1 -1
- package/dist/files/file-change.d.ts.map +1 -1
- package/dist/files/file-change.js +12 -0
- package/dist/files/file-change.js.map +1 -1
- package/dist/files/find-paths.d.ts +9 -0
- package/dist/files/find-paths.d.ts.map +1 -0
- package/dist/files/find-paths.js +38 -0
- package/dist/files/find-paths.js.map +1 -0
- package/dist/files/read-file.d.ts +3 -1
- package/dist/files/read-file.d.ts.map +1 -1
- package/dist/files/read-file.js +7 -6
- package/dist/files/read-file.js.map +1 -1
- package/dist/files/read-files.d.ts +11 -0
- package/dist/files/read-files.d.ts.map +1 -0
- package/dist/files/read-files.js +35 -0
- package/dist/files/read-files.js.map +1 -0
- package/dist/files/read-text.d.ts +63 -0
- package/dist/files/read-text.d.ts.map +1 -0
- package/dist/files/read-text.js +67 -0
- package/dist/files/read-text.js.map +1 -0
- package/dist/files/register-changes.d.ts +3 -0
- package/dist/files/register-changes.d.ts.map +1 -0
- package/dist/files/register-changes.js +78 -0
- package/dist/files/register-changes.js.map +1 -0
- package/dist/files/search-text.d.ts +10 -1
- package/dist/files/search-text.d.ts.map +1 -1
- package/dist/files/search-text.js +32 -57
- package/dist/files/search-text.js.map +1 -1
- package/dist/files/workspace-files.d.ts +5 -0
- package/dist/files/workspace-files.d.ts.map +1 -0
- package/dist/files/workspace-files.js +66 -0
- package/dist/files/workspace-files.js.map +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/jobs/helper-progress.d.ts +11 -0
- package/dist/jobs/helper-progress.d.ts.map +1 -0
- package/dist/jobs/helper-progress.js +38 -0
- package/dist/jobs/helper-progress.js.map +1 -0
- package/dist/jobs/job-rows.d.ts +3 -1
- package/dist/jobs/job-rows.d.ts.map +1 -1
- package/dist/jobs/job-rows.js +46 -22
- package/dist/jobs/job-rows.js.map +1 -1
- package/dist/jobs/process-report.d.ts +1 -1
- package/dist/jobs/process-report.d.ts.map +1 -1
- package/dist/jobs/process-report.js +11 -6
- package/dist/jobs/process-report.js.map +1 -1
- package/dist/jobs/process-run.d.ts +2 -5
- package/dist/jobs/process-run.d.ts.map +1 -1
- package/dist/jobs/process-run.js +6 -5
- package/dist/jobs/process-run.js.map +1 -1
- package/dist/jobs/register-jobs.js +3 -3
- package/dist/jobs/register-jobs.js.map +1 -1
- package/dist/maps/map-rules.d.ts +4 -2
- package/dist/maps/map-rules.d.ts.map +1 -1
- package/dist/maps/map-rules.js +7 -4
- package/dist/maps/map-rules.js.map +1 -1
- package/dist/maps/map-schema.d.ts +4 -4
- package/dist/maps/map-schema.d.ts.map +1 -1
- package/dist/maps/map-schema.js +10 -3
- package/dist/maps/map-schema.js.map +1 -1
- package/dist/prompt/build-prompt.d.ts +4 -0
- package/dist/prompt/build-prompt.d.ts.map +1 -1
- package/dist/prompt/build-prompt.js +8 -4
- package/dist/prompt/build-prompt.js.map +1 -1
- package/dist/prompt/person-preferences.d.ts +5 -0
- package/dist/prompt/person-preferences.d.ts.map +1 -0
- package/dist/prompt/person-preferences.js +14 -0
- package/dist/prompt/person-preferences.js.map +1 -0
- package/dist/prompt/session-grants.d.ts +7 -3
- package/dist/prompt/session-grants.d.ts.map +1 -1
- package/dist/prompt/session-grants.js +3 -2
- package/dist/prompt/session-grants.js.map +1 -1
- package/dist/prompt/session-prompt.d.ts.map +1 -1
- package/dist/prompt/session-prompt.js +15 -6
- package/dist/prompt/session-prompt.js.map +1 -1
- package/dist/prompt/working-method.d.ts +2 -2
- package/dist/prompt/working-method.d.ts.map +1 -1
- package/dist/prompt/working-method.js +51 -45
- package/dist/prompt/working-method.js.map +1 -1
- package/dist/register-settings.d.ts +27 -0
- package/dist/register-settings.d.ts.map +1 -1
- package/dist/register-settings.js +13 -0
- package/dist/register-settings.js.map +1 -1
- package/dist/schemas/approval-rule.d.ts +9 -0
- package/dist/schemas/approval-rule.d.ts.map +1 -0
- package/dist/schemas/approval-rule.js +7 -0
- package/dist/schemas/approval-rule.js.map +1 -0
- package/dist/schemas/check.d.ts +7 -0
- package/dist/schemas/check.d.ts.map +1 -0
- package/dist/schemas/check.js +9 -0
- package/dist/schemas/check.js.map +1 -0
- package/dist/schemas/records.d.ts +20 -6
- package/dist/schemas/records.d.ts.map +1 -1
- package/dist/schemas/records.js +15 -4
- package/dist/schemas/records.js.map +1 -1
- package/dist/sessions/new-session.d.ts.map +1 -1
- package/dist/sessions/new-session.js +8 -3
- package/dist/sessions/new-session.js.map +1 -1
- package/dist/sessions/register-fork-export.d.ts.map +1 -1
- package/dist/sessions/register-fork-export.js +3 -2
- package/dist/sessions/register-fork-export.js.map +1 -1
- package/dist/sessions/register-sessions.d.ts.map +1 -1
- package/dist/sessions/register-sessions.js +21 -10
- package/dist/sessions/register-sessions.js.map +1 -1
- package/dist/sessions/session-view.d.ts +10 -1
- package/dist/sessions/session-view.d.ts.map +1 -1
- package/dist/sessions/session-view.js +6 -1
- package/dist/sessions/session-view.js.map +1 -1
- package/dist/sessions/waiting-on.d.ts +7 -0
- package/dist/sessions/waiting-on.d.ts.map +1 -0
- package/dist/sessions/waiting-on.js +20 -0
- package/dist/sessions/waiting-on.js.map +1 -0
- package/dist/store/collections.d.ts +26 -8
- package/dist/store/collections.d.ts.map +1 -1
- package/dist/store/collections.js +3 -1
- package/dist/store/collections.js.map +1 -1
- package/dist/thinking-levels.d.ts +6 -0
- package/dist/thinking-levels.d.ts.map +1 -0
- package/dist/thinking-levels.js +13 -0
- package/dist/thinking-levels.js.map +1 -0
- package/dist/turns/answer-extras.d.ts +21 -0
- package/dist/turns/answer-extras.d.ts.map +1 -0
- package/dist/turns/answer-extras.js +43 -0
- package/dist/turns/answer-extras.js.map +1 -0
- package/dist/turns/answer-fingerprint.d.ts +6 -2
- package/dist/turns/answer-fingerprint.d.ts.map +1 -1
- package/dist/turns/answer-fingerprint.js +9 -3
- package/dist/turns/answer-fingerprint.js.map +1 -1
- package/dist/turns/apply-answer.d.ts +2 -1
- package/dist/turns/apply-answer.d.ts.map +1 -1
- package/dist/turns/apply-answer.js +10 -4
- package/dist/turns/apply-answer.js.map +1 -1
- package/dist/turns/approval-rules.d.ts +13 -0
- package/dist/turns/approval-rules.d.ts.map +1 -0
- package/dist/turns/approval-rules.js +65 -0
- package/dist/turns/approval-rules.js.map +1 -0
- package/dist/turns/cache-retention.d.ts +6 -0
- package/dist/turns/cache-retention.d.ts.map +1 -0
- package/dist/turns/cache-retention.js +7 -0
- package/dist/turns/cache-retention.js.map +1 -0
- package/dist/turns/call-results.d.ts +6 -0
- package/dist/turns/call-results.d.ts.map +1 -0
- package/dist/turns/call-results.js +21 -0
- package/dist/turns/call-results.js.map +1 -0
- package/dist/turns/check-after-edits.d.ts +8 -0
- package/dist/turns/check-after-edits.d.ts.map +1 -0
- package/dist/turns/check-after-edits.js +23 -0
- package/dist/turns/check-after-edits.js.map +1 -0
- package/dist/turns/child-result.d.ts.map +1 -1
- package/dist/turns/child-result.js +4 -2
- package/dist/turns/child-result.js.map +1 -1
- package/dist/turns/clear-results.d.ts +15 -0
- package/dist/turns/clear-results.d.ts.map +1 -0
- package/dist/turns/clear-results.js +58 -0
- package/dist/turns/clear-results.js.map +1 -0
- package/dist/turns/cleared-results.d.ts +17 -0
- package/dist/turns/cleared-results.d.ts.map +1 -0
- package/dist/turns/cleared-results.js +46 -0
- package/dist/turns/cleared-results.js.map +1 -0
- package/dist/turns/compaction.d.ts.map +1 -1
- package/dist/turns/compaction.js +8 -7
- package/dist/turns/compaction.js.map +1 -1
- package/dist/turns/end-turn-state.d.ts.map +1 -1
- package/dist/turns/end-turn-state.js +2 -0
- package/dist/turns/end-turn-state.js.map +1 -1
- package/dist/turns/ended-calls.d.ts +6 -0
- package/dist/turns/ended-calls.d.ts.map +1 -0
- package/dist/turns/ended-calls.js +43 -0
- package/dist/turns/ended-calls.js.map +1 -0
- package/dist/turns/file-results.d.ts +15 -0
- package/dist/turns/file-results.d.ts.map +1 -0
- package/dist/turns/file-results.js +39 -0
- package/dist/turns/file-results.js.map +1 -0
- package/dist/turns/lost-reply.js +2 -2
- package/dist/turns/lost-reply.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 +41 -3
- package/dist/turns/model-context.js.map +1 -1
- package/dist/turns/model-info.d.ts +4 -0
- package/dist/turns/model-info.d.ts.map +1 -1
- package/dist/turns/model-info.js +7 -1
- package/dist/turns/model-info.js.map +1 -1
- package/dist/turns/model-retry.d.ts.map +1 -1
- package/dist/turns/model-retry.js +5 -4
- package/dist/turns/model-retry.js.map +1 -1
- package/dist/turns/read-again.d.ts +11 -5
- package/dist/turns/read-again.d.ts.map +1 -1
- package/dist/turns/read-again.js +39 -10
- package/dist/turns/read-again.js.map +1 -1
- package/dist/turns/register-turns.d.ts.map +1 -1
- package/dist/turns/register-turns.js +12 -4
- package/dist/turns/register-turns.js.map +1 -1
- package/dist/turns/run-calls.d.ts +4 -0
- package/dist/turns/run-calls.d.ts.map +1 -1
- package/dist/turns/run-calls.js +56 -10
- package/dist/turns/run-calls.js.map +1 -1
- package/dist/turns/run-command.d.ts.map +1 -1
- package/dist/turns/run-command.js +8 -10
- package/dist/turns/run-command.js.map +1 -1
- package/dist/turns/sent-size.d.ts +6 -2
- package/dist/turns/sent-size.d.ts.map +1 -1
- package/dist/turns/sent-size.js +8 -4
- package/dist/turns/sent-size.js.map +1 -1
- package/dist/turns/settle-calls.d.ts +1 -7
- package/dist/turns/settle-calls.d.ts.map +1 -1
- package/dist/turns/settle-calls.js +2 -19
- package/dist/turns/settle-calls.js.map +1 -1
- package/dist/turns/step.d.ts.map +1 -1
- package/dist/turns/step.js +68 -10
- package/dist/turns/step.js.map +1 -1
- package/dist/ui/register-ui.js +2 -2
- package/dist/ui/register-ui.js.map +1 -1
- package/dist/web/components/approval.css +1 -1
- package/dist/web/components/approval.js +122 -89
- package/dist/web/components/call.css +1 -1
- package/dist/web/components/call.js +431 -306
- package/dist/web/components/connectors.css +1 -1
- package/dist/web/components/connectors.js +553 -521
- package/dist/web/components/conversation.css +1 -1
- package/dist/web/components/conversation.js +2636 -1520
- package/dist/web/components/mcp-sign-in.css +1 -1
- package/dist/web/components/model.css +1 -1
- package/dist/web/components/model.js +140 -127
- package/dist/web/components/preferences.css +2 -0
- package/dist/web/components/preferences.js +151 -0
- package/dist/web/components/question.css +1 -1
- package/dist/web/components/sessions.css +1 -1
- package/dist/web/components/sessions.js +44 -21
- package/dist/web-fetch/fetch-page.d.ts +28 -0
- package/dist/web-fetch/fetch-page.d.ts.map +1 -0
- package/dist/web-fetch/fetch-page.js +108 -0
- package/dist/web-fetch/fetch-page.js.map +1 -0
- package/dist/web-fetch/private-address.d.ts +3 -0
- package/dist/web-fetch/private-address.d.ts.map +1 -0
- package/dist/web-fetch/private-address.js +69 -0
- package/dist/web-fetch/private-address.js.map +1 -0
- package/dist/web-fetch/web-hosts.d.ts +7 -0
- package/dist/web-fetch/web-hosts.d.ts.map +1 -0
- package/dist/web-fetch/web-hosts.js +19 -0
- package/dist/web-fetch/web-hosts.js.map +1 -0
- package/docs/connectors.md +5 -6
- package/locales/ar.json +81 -5
- package/locales/en.json +81 -5
- package/package.json +152 -6
|
@@ -4,16 +4,19 @@ import { withCallingReply } from "./call-groups.js";
|
|
|
4
4
|
import { blockSize } from "./history.js";
|
|
5
5
|
import { latestSummary, messagesFrom } from "./message-blocks.js";
|
|
6
6
|
import { messageStamp } from "./message-stamp.js";
|
|
7
|
+
import { callNames, clearedCalls, clearedPayload, clearedText, isCleared } from "./cleared-results.js";
|
|
8
|
+
import { records } from "../store/collections.js";
|
|
7
9
|
const sent = new Set(['user', 'assistant', 'toolResult']);
|
|
8
10
|
/** The summary and the model-visible messages after it. */
|
|
9
11
|
export async function sentHistory(ctx, sessionId, nextSeq) {
|
|
10
12
|
const summary = await latestSummary(ctx, sessionId);
|
|
13
|
+
const cleared = (await records(ctx.store).sessions.get(sessionId))?.clearedThroughSeq ?? -1;
|
|
11
14
|
const from = summary === undefined ? 0 : Number(summary.content['coversThroughSeq'] ?? -1) + 1;
|
|
12
15
|
const messages = (await messagesFrom(ctx, sessionId, from, nextSeq)).filter((message) => sent.has(message.kind));
|
|
13
16
|
if (messages[0]?.kind !== 'toolResult')
|
|
14
|
-
return { summary, messages };
|
|
17
|
+
return { summary, messages, cleared };
|
|
15
18
|
const before = (await messagesFrom(ctx, sessionId, Math.max(from - blockSize, 0), from)).filter((message) => sent.has(message.kind));
|
|
16
|
-
return { summary, messages: withCallingReply(before, messages) };
|
|
19
|
+
return { summary, messages: withCallingReply(before, messages), cleared };
|
|
17
20
|
}
|
|
18
21
|
/** A message's text: a string, or its text blocks joined. */
|
|
19
22
|
export function textOf(content) {
|
|
@@ -61,6 +64,30 @@ async function userMessage(ctx, message) {
|
|
|
61
64
|
const shown = names.filter((_name, index) => isImage(images[index]));
|
|
62
65
|
return { ...message.content, content: [{ type: 'text', text: `${sentText(message)}${imagesNote(shown)}` }, ...images] };
|
|
63
66
|
}
|
|
67
|
+
// A `run` call stored before ADR 0089 holds a description, which `run` no longer takes; the model is sent the call
|
|
68
|
+
// without it, so an older chat doesn't teach it the argument (ADR 0089, 1).
|
|
69
|
+
function withoutDescription(block) {
|
|
70
|
+
if (typeof block !== 'object' || block === null || Array.isArray(block) || block['type'] !== 'toolCall')
|
|
71
|
+
return block;
|
|
72
|
+
const args = block['arguments'];
|
|
73
|
+
if (typeof args !== 'object' || args === null || Array.isArray(args) || !('description' in args))
|
|
74
|
+
return block;
|
|
75
|
+
const { description: _description, ...rest } = args;
|
|
76
|
+
return { ...block, arguments: rest };
|
|
77
|
+
}
|
|
78
|
+
// A call whose result is sent cleared is sent with its long texts cleared too (ADR 0097, 4).
|
|
79
|
+
function withoutClearedText(block, cleared) {
|
|
80
|
+
if (typeof block !== 'object' || block === null || Array.isArray(block) || block['type'] !== 'toolCall' || typeof block['id'] !== 'string' || !cleared.has(block['id']))
|
|
81
|
+
return block;
|
|
82
|
+
const args = block['arguments'];
|
|
83
|
+
if (typeof args !== 'object' || args === null || Array.isArray(args) || args['payload'] === undefined)
|
|
84
|
+
return block;
|
|
85
|
+
return { ...block, arguments: { ...args, payload: clearedPayload(args['payload']) } };
|
|
86
|
+
}
|
|
87
|
+
function assistantMessage(message, cleared) {
|
|
88
|
+
const content = message.content['content'];
|
|
89
|
+
return Array.isArray(content) ? { ...message.content, content: content.map((block) => withoutClearedText(withoutDescription(block), cleared)) } : message.content;
|
|
90
|
+
}
|
|
64
91
|
const summaryLead = 'A summary of the earlier conversation:';
|
|
65
92
|
/** A stored summary as it is sent: the model's text, then what kvman added when it stored it (ADR 0066, 2). */
|
|
66
93
|
export function summaryText(summary) {
|
|
@@ -72,7 +99,18 @@ export function summaryText(summary) {
|
|
|
72
99
|
/** The messages a step sends, checked as kvai takes them. */
|
|
73
100
|
export async function modelMessages(ctx, history) {
|
|
74
101
|
const lead = history.summary === undefined ? [] : [{ role: 'user', content: `${summaryLead}\n${summaryText(history.summary)}`, timestamp: Date.parse(history.summary.createdAt) }];
|
|
75
|
-
const
|
|
102
|
+
const names = callNames(history.messages);
|
|
103
|
+
const cleared = clearedCalls(history.messages, history.cleared);
|
|
104
|
+
const rest = await Promise.all(history.messages.map((message) => {
|
|
105
|
+
if (message.kind === 'user')
|
|
106
|
+
return userMessage(ctx, message);
|
|
107
|
+
if (message.kind === 'assistant')
|
|
108
|
+
return Promise.resolve(assistantMessage(message, cleared));
|
|
109
|
+
// An old result is sent as a line that names its call (ADR 0094, 1).
|
|
110
|
+
if (isCleared(message, history.cleared))
|
|
111
|
+
return Promise.resolve({ ...message.content, content: [{ type: 'text', text: clearedText(names.get(String(message.content['toolCallId'])) ?? 'a call') }] });
|
|
112
|
+
return Promise.resolve(message.content);
|
|
113
|
+
}));
|
|
76
114
|
return messageSchema.array().parse([...lead, ...rest]);
|
|
77
115
|
}
|
|
78
116
|
//# sourceMappingURL=model-context.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model-context.js","sourceRoot":"","sources":["../../src/turns/model-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAoC,MAAM,YAAY,CAAC;AAC5E,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"model-context.js","sourceRoot":"","sources":["../../src/turns/model-context.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
import type { Ctx } from '@kvman/sdk';
|
|
2
|
+
import { type ThinkingLevel } from '../thinking-levels.ts';
|
|
2
3
|
export type ModelInfo = {
|
|
3
4
|
contextWindow: number;
|
|
4
5
|
images: boolean;
|
|
6
|
+
thinkingLevels: ThinkingLevel[];
|
|
5
7
|
};
|
|
6
8
|
export declare function modelInfo(ctx: Ctx, model: string | null): Promise<ModelInfo | undefined>;
|
|
9
|
+
/** The level a session on `model` keeps for `wanted`: the nearest the model has, or `wanted` for a model kvai doesn't list (ADR 0087, 11). */
|
|
10
|
+
export declare function levelFor(ctx: Ctx, model: string | null, wanted: ThinkingLevel): Promise<ThinkingLevel>;
|
|
7
11
|
//# sourceMappingURL=model-info.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model-info.d.ts","sourceRoot":"","sources":["../../src/turns/model-info.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"model-info.d.ts","sourceRoot":"","sources":["../../src/turns/model-info.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AAEtC,OAAO,EAAgB,KAAK,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAIzE,MAAM,MAAM,SAAS,GAAG;IAAE,aAAa,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAC;IAAC,cAAc,EAAE,aAAa,EAAE,CAAA;CAAE,CAAC;AAEpG,wBAAsB,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC,CAM9F;AAED,8IAA8I;AAC9I,wBAAsB,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,EAAE,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC,CAG5G"}
|
package/dist/turns/model-info.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { nearestLevel } from "../thinking-levels.js";
|
|
1
2
|
export async function modelInfo(ctx, model) {
|
|
2
3
|
if (model === null)
|
|
3
4
|
return undefined;
|
|
@@ -5,6 +6,11 @@ export async function modelInfo(ctx, model) {
|
|
|
5
6
|
if (provider === '')
|
|
6
7
|
return undefined;
|
|
7
8
|
const found = (await ctx.exec('kvai.model.list', { provider })).find((candidate) => candidate.id === model);
|
|
8
|
-
return found === undefined ? undefined : { contextWindow: found.contextWindow, images: found.input.includes('image') };
|
|
9
|
+
return found === undefined ? undefined : { contextWindow: found.contextWindow, images: found.input.includes('image'), thinkingLevels: found.thinkingLevels };
|
|
10
|
+
}
|
|
11
|
+
/** The level a session on `model` keeps for `wanted`: the nearest the model has, or `wanted` for a model kvai doesn't list (ADR 0087, 11). */
|
|
12
|
+
export async function levelFor(ctx, model, wanted) {
|
|
13
|
+
const info = await modelInfo(ctx, model);
|
|
14
|
+
return info === undefined ? wanted : nearestLevel(info.thinkingLevels, wanted);
|
|
9
15
|
}
|
|
10
16
|
//# sourceMappingURL=model-info.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model-info.js","sourceRoot":"","sources":["../../src/turns/model-info.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"model-info.js","sourceRoot":"","sources":["../../src/turns/model-info.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAsB,MAAM,uBAAuB,CAAC;AAMzE,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,GAAQ,EAAE,KAAoB;IAC5D,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,SAAS,CAAC;IACrC,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;IACpD,IAAI,QAAQ,KAAK,EAAE;QAAE,OAAO,SAAS,CAAC;IACtC,MAAM,KAAK,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,KAAK,KAAK,CAAC,CAAC;IAC5G,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,KAAK,CAAC,aAAa,EAAE,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,cAAc,EAAE,KAAK,CAAC,cAAc,EAAE,CAAC;AAC/J,CAAC;AAED,8IAA8I;AAC9I,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,GAAQ,EAAE,KAAoB,EAAE,MAAqB;IAClF,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACzC,OAAO,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;AACjF,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model-retry.d.ts","sourceRoot":"","sources":["../../src/turns/model-retry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,GAAG,EAAE,KAAK,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,CAAC;AAIjF,OAAO,EAAe,KAAK,SAAS,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"model-retry.d.ts","sourceRoot":"","sources":["../../src/turns/model-retry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,GAAG,EAAE,KAAK,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,CAAC;AAIjF,OAAO,EAAe,KAAK,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAU9D,wBAAsB,mBAAmB,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,CAAC,eAAe,CAAC,EAAE,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC,CAczI"}
|
|
@@ -2,9 +2,10 @@ import { ProblemError } from '@kvman/sdk';
|
|
|
2
2
|
import { delay } from "../delay.js";
|
|
3
3
|
import { invalid } from "../problems.js";
|
|
4
4
|
import { currentStep } from "./step-claim.js";
|
|
5
|
-
// A step's model call, tried again when it fails for a temporary reason (plan 08 §8.2, ADR 0009, 154, 155, and 203
|
|
6
|
-
//
|
|
7
|
-
|
|
5
|
+
// A step's model call, tried again when it fails for a temporary reason (plan 08 §8.2, ADR 0009, 154, 155, and 203;
|
|
6
|
+
// ADR 0087, 3 and 6): five tries in all, after 1 s, 4 s, 15 s, and then 60 s, each announced with why and how long.
|
|
7
|
+
// Any other failure, and a stop, end it at once.
|
|
8
|
+
const waitsMs = [1_000, 4_000, 15_000, 60_000];
|
|
8
9
|
const transient = (error) => error.problem.code === 'kvai/RATE_LIMITED' || (error.problem.code === 'kvai/PROVIDER_ERROR' && error.problem.params?.['transient'] === true);
|
|
9
10
|
export async function completeWithRetries(ctx, input, lease) {
|
|
10
11
|
for (let attempt = 1;; attempt += 1) {
|
|
@@ -18,7 +19,7 @@ export async function completeWithRetries(ctx, input, lease) {
|
|
|
18
19
|
if (!(error instanceof ProblemError) || !transient(error) || wait === undefined || ctx.job.signal.aborted)
|
|
19
20
|
throw error;
|
|
20
21
|
ctx.log.warn('A model call failed for a temporary reason; trying again.', { code: error.problem.code, attempt });
|
|
21
|
-
ctx.job.progress({ type: 'retry', attempt: attempt + 1, of: waitsMs.length + 1 });
|
|
22
|
+
ctx.job.progress({ type: 'retry', attempt: attempt + 1, of: waitsMs.length + 1, waitMs: wait, reason: error.problem.code === 'kvai/RATE_LIMITED' ? 'rateLimited' : 'unavailable' });
|
|
22
23
|
await delay(wait, ctx.job.signal);
|
|
23
24
|
ctx.job.signal.throwIfAborted();
|
|
24
25
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model-retry.js","sourceRoot":"","sources":["../../src/turns/model-retry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAyC,MAAM,YAAY,CAAC;AAEjF,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACzC,OAAO,EAAE,WAAW,EAAkB,MAAM,iBAAiB,CAAC;AAE9D,
|
|
1
|
+
{"version":3,"file":"model-retry.js","sourceRoot":"","sources":["../../src/turns/model-retry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAyC,MAAM,YAAY,CAAC;AAEjF,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACzC,OAAO,EAAE,WAAW,EAAkB,MAAM,iBAAiB,CAAC;AAE9D,oHAAoH;AACpH,oHAAoH;AACpH,iDAAiD;AAEjD,MAAM,OAAO,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAU,CAAC;AAExD,MAAM,SAAS,GAAG,CAAC,KAAmB,EAAW,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,mBAAmB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,qBAAqB,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,WAAW,CAAC,KAAK,IAAI,CAAC,CAAC;AAEjM,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,GAAQ,EAAE,KAA+B,EAAE,KAAgB;IACnG,KAAK,IAAI,OAAO,GAAG,CAAC,GAAI,OAAO,IAAI,CAAC,EAAE,CAAC;QACrC,IAAI,MAAM,WAAW,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,SAAS;YAAE,MAAM,OAAO,CAAC,4CAA4C,CAAC,CAAC;QAC7G,IAAI,CAAC;YACH,OAAO,MAAM,GAAG,CAAC,IAAI,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC;QAChD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;YAClC,IAAI,CAAC,CAAC,KAAK,YAAY,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,IAAI,KAAK,SAAS,IAAI,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO;gBAAE,MAAM,KAAK,CAAC;YACvH,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,2DAA2D,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;YACjH,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,mBAAmB,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC;YACpL,MAAM,KAAK,CAAC,IAAI,EAAE,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAClC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;QAClC,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -1,6 +1,12 @@
|
|
|
1
|
-
import type
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
import { type Ctx, type Json } from '@kvman/sdk';
|
|
2
|
+
import { type FileReadValue } from '../files/read-text.ts';
|
|
3
|
+
/**
|
|
4
|
+
* The reads a result holds: none for a call that isn't a read, or a read answered as unchanged. Its `details` keep the
|
|
5
|
+
* JSON, or, for a read stored before ADR 0097, its text was the JSON and the details kept no copy (ADR 0034, 7).
|
|
6
|
+
*/
|
|
7
|
+
export declare function readsOf(details: Json | undefined, text: string): FileReadValue[];
|
|
8
|
+
/** Whether two reads returned the same lines of the same file. */
|
|
9
|
+
export declare const sameRead: (first: FileReadValue, second: FileReadValue) => boolean;
|
|
10
|
+
/** The reads a step still sends whole: those of results that aren't cleared (ADR 0094, 1). */
|
|
11
|
+
export declare function heldReads(ctx: Ctx, sessionId: string): Promise<FileReadValue[]>;
|
|
6
12
|
//# sourceMappingURL=read-again.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"read-again.d.ts","sourceRoot":"","sources":["../../src/turns/read-again.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"read-again.d.ts","sourceRoot":"","sources":["../../src/turns/read-again.ts"],"names":[],"mappings":"AAAA,OAAO,EAAK,KAAK,GAAG,EAAE,KAAK,IAAI,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,EAAoC,KAAK,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAoB7F;;;GAGG;AACH,wBAAgB,OAAO,CAAC,OAAO,EAAE,IAAI,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,aAAa,EAAE,CAShF;AAED,kEAAkE;AAClE,eAAO,MAAM,QAAQ,GAAI,OAAO,aAAa,EAAE,QAAQ,aAAa,KAAG,OACyN,CAAC;AAEjS,8FAA8F;AAC9F,wBAAsB,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAKrF"}
|
package/dist/turns/read-again.js
CHANGED
|
@@ -1,16 +1,45 @@
|
|
|
1
|
+
import { z } from '@kvman/sdk';
|
|
2
|
+
import { fileReadSchema, filesEntrySchema } from "../files/read-text.js";
|
|
1
3
|
import { records } from "../store/collections.js";
|
|
2
4
|
import { sentHistory, textOf } from "./model-context.js";
|
|
3
|
-
// A read the chat already holds (ADR 0034, 2). It is worked out from the stored
|
|
4
|
-
// summary,
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
5
|
+
// A read the chat already holds (ADR 0034, 2; ADR 0097, 1 and 2). It is worked out from the stored results after the
|
|
6
|
+
// latest summary, from the reads their `details` keep as JSON: an `fs read`'s, also one stored before ADR 0097, whose
|
|
7
|
+
// text was that JSON, and each file of an `fs read-files`. So a summary, a fork, and a subagent's own chat need no
|
|
8
|
+
// bookkeeping, and a file that changed in any way never matches.
|
|
9
|
+
const readFilesSchema = z.object({ files: z.array(filesEntrySchema) });
|
|
10
|
+
function parsedJson(text) {
|
|
11
|
+
try {
|
|
12
|
+
return JSON.parse(text);
|
|
13
|
+
}
|
|
14
|
+
catch (error) {
|
|
15
|
+
if (error instanceof SyntaxError)
|
|
16
|
+
return undefined;
|
|
17
|
+
throw error;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* The reads a result holds: none for a call that isn't a read, or a read answered as unchanged. Its `details` keep the
|
|
22
|
+
* JSON, or, for a read stored before ADR 0097, its text was the JSON and the details kept no copy (ADR 0034, 7).
|
|
23
|
+
*/
|
|
24
|
+
export function readsOf(details, text) {
|
|
25
|
+
if (typeof details !== 'object' || details === null || Array.isArray(details) || details['connector'] !== 'fs')
|
|
26
|
+
return [];
|
|
27
|
+
const output = parsedJson(typeof details['output'] === 'string' ? details['output'] : text);
|
|
28
|
+
if (details['command'] === 'read') {
|
|
29
|
+
const read = fileReadSchema.safeParse(output);
|
|
30
|
+
return read.success ? [read.data] : [];
|
|
31
|
+
}
|
|
32
|
+
const files = details['command'] === 'read-files' ? readFilesSchema.safeParse(output) : undefined;
|
|
33
|
+
return files?.success === true ? files.data.files.flatMap((entry) => ('content' in entry ? [entry] : [])) : [];
|
|
34
|
+
}
|
|
35
|
+
/** Whether two reads returned the same lines of the same file. */
|
|
36
|
+
export const sameRead = (first, second) => first.path === second.path && first.fromLine === second.fromLine && first.totalLines === second.totalLines && first.content === second.content && first.truncated === second.truncated && first.next?.fromLine === second.next?.fromLine && first.next?.fromColumn === second.next?.fromColumn;
|
|
37
|
+
/** The reads a step still sends whole: those of results that aren't cleared (ADR 0094, 1). */
|
|
38
|
+
export async function heldReads(ctx, sessionId) {
|
|
8
39
|
const session = await records(ctx.store).sessions.get(sessionId);
|
|
9
40
|
if (session === undefined)
|
|
10
|
-
return
|
|
11
|
-
const { messages } = await sentHistory(ctx, sessionId, session.nextSeq);
|
|
12
|
-
return messages.
|
|
41
|
+
return [];
|
|
42
|
+
const { messages, cleared } = await sentHistory(ctx, sessionId, session.nextSeq);
|
|
43
|
+
return messages.filter((message) => message.kind === 'toolResult' && message.seq > cleared).flatMap((message) => readsOf(message.content['details'], textOf(message.content['content'])));
|
|
13
44
|
}
|
|
14
|
-
/** What a read returns in place of text the chat already holds. */
|
|
15
|
-
export const unchangedText = (path) => `${path} is unchanged since you read these lines earlier in this conversation; that result is above.`;
|
|
16
45
|
//# sourceMappingURL=read-again.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"read-again.js","sourceRoot":"","sources":["../../src/turns/read-again.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"read-again.js","sourceRoot":"","sources":["../../src/turns/read-again.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"register-turns.d.ts","sourceRoot":"","sources":["../../src/turns/register-turns.ts"],"names":[],"mappings":"AAAA,OAAO,EAAK,KAAK,GAAG,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"register-turns.d.ts","sourceRoot":"","sources":["../../src/turns/register-turns.ts"],"names":[],"mappings":"AAAA,OAAO,EAAK,KAAK,GAAG,EAAE,MAAM,YAAY,CAAC;AAezC,wBAAgB,aAAa,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI,CAmE5C"}
|
|
@@ -5,6 +5,7 @@ import { turnSchema, turnView } from "../sessions/session-view.js";
|
|
|
5
5
|
import { records, txRecords } from "../store/collections.js";
|
|
6
6
|
import { cancelTurn } from "./end-turn.js";
|
|
7
7
|
import { applyAnswer } from "./apply-answer.js";
|
|
8
|
+
import { answerExtrasShape, checkExtras, rememberRule } from "./answer-extras.js";
|
|
8
9
|
import { receiptJob } from "./receipt-job.js";
|
|
9
10
|
import { recoverWorkspace } from "./recover-workspace.js";
|
|
10
11
|
import { retryTurn } from "./retry-turn.js";
|
|
@@ -46,19 +47,26 @@ export function registerTurns(ctx) {
|
|
|
46
47
|
});
|
|
47
48
|
ctx.registerCommand('kvcoder.question.answer', {
|
|
48
49
|
description: "Answers a pending question or approval; returns the next step's job id once nothing else is pending.",
|
|
49
|
-
input: z.object({ questionId: z.string(), answer: z.json() }),
|
|
50
|
+
input: z.object({ questionId: z.string(), answer: z.json(), ...answerExtrasShape }),
|
|
50
51
|
output: z.object({ jobId: z.string().nullable() }),
|
|
51
52
|
public: true,
|
|
52
53
|
retries: 0,
|
|
53
|
-
handle: async ({ questionId, answer }) => {
|
|
54
|
+
handle: async ({ questionId, answer, remember, reason }) => {
|
|
54
55
|
userOnly(ctx, 'kvcoder.question.answer');
|
|
55
|
-
|
|
56
|
+
const extras = { remember, reason };
|
|
57
|
+
// A rule is saved before the answer applies, and only for a question that can take it (ADR 0091, 3).
|
|
58
|
+
const asked = remember === undefined && reason === undefined ? undefined : await records(ctx.store).questions.get(questionId);
|
|
59
|
+
if (asked !== undefined)
|
|
60
|
+
checkExtras(asked, answer, extras);
|
|
61
|
+
if (asked !== undefined && remember !== undefined)
|
|
62
|
+
await rememberRule(ctx, remember);
|
|
63
|
+
let result = await ctx.store.transaction(tx => applyAnswer(ctx, txRecords(tx), questionId, answer, extras));
|
|
56
64
|
if (result.kind === 'delegate') {
|
|
57
65
|
// Legacy positive launch has no receipt: recover first, then retain exact approval identity through preparation.
|
|
58
66
|
await recoverWorkspace(ctx);
|
|
59
67
|
const expected = result.question;
|
|
60
68
|
result = await ctx.store.transaction(tx => {
|
|
61
|
-
const store = txRecords(tx), current = applyAnswer(ctx, store, questionId, answer, expected);
|
|
69
|
+
const store = txRecords(tx), current = applyAnswer(ctx, store, questionId, answer, extras, expected);
|
|
62
70
|
return current;
|
|
63
71
|
});
|
|
64
72
|
if (result.kind === 'delegate') {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"register-turns.js","sourceRoot":"","sources":["../../src/turns/register-turns.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"register-turns.js","sourceRoot":"","sources":["../../src/turns/register-turns.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,6 +5,8 @@ import { type JsonValue } from '../connector-call.ts';
|
|
|
5
5
|
import type { SessionTools } from '../prompt/session-prompt.ts';
|
|
6
6
|
import type { HeldResult, SessionDoc } from '../schemas/records.ts';
|
|
7
7
|
import { type StepLease } from './step-claim.ts';
|
|
8
|
+
import type { ApprovalRule } from '../schemas/approval-rule.ts';
|
|
9
|
+
import type { Check } from '../schemas/check.ts';
|
|
8
10
|
export type ToolCall = {
|
|
9
11
|
id: string;
|
|
10
12
|
name: string;
|
|
@@ -34,6 +36,8 @@ export type CallEnv = {
|
|
|
34
36
|
session: Stored<SessionDoc>;
|
|
35
37
|
tools: SessionTools;
|
|
36
38
|
approval: 'ask' | 'auto' | 'never';
|
|
39
|
+
allowed: readonly ApprovalRule[];
|
|
40
|
+
check: Check;
|
|
37
41
|
lease: StepLease;
|
|
38
42
|
};
|
|
39
43
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-calls.d.ts","sourceRoot":"","sources":["../../src/turns/run-calls.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,GAAG,EAAE,KAAK,MAAM,EAAE,MAAM,YAAY,CAAC;AACjE,OAAO,EAAa,KAAK,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEpE,OAAO,EAAgB,KAAK,OAAO,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"run-calls.d.ts","sourceRoot":"","sources":["../../src/turns/run-calls.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,GAAG,EAAE,KAAK,MAAM,EAAE,MAAM,YAAY,CAAC;AACjE,OAAO,EAAa,KAAK,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEpE,OAAO,EAAgB,KAAK,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAUlE,OAAO,EAAqC,KAAK,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACzF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAIpE,OAAO,EAAe,KAAK,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAM9D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAEhE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAWjD,MAAM,MAAM,QAAQ,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;CAAE,CAAC;AAE1F,MAAM,MAAM,WAAW,GACnB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,UAAU,CAAA;CAAE,GACpC;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,YAAY,EAAE,YAAY,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;CAAE,GACrF;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,GAC5C;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE;AACnC,6GAA6G;GAC3G;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAE,CAAC;AAExC,MAAM,MAAM,OAAO,GAAG;IAAE,GAAG,EAAE,GAAG,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;IAAC,KAAK,EAAE,YAAY,CAAC;IAAC,QAAQ,EAAE,KAAK,GAAG,MAAM,GAAG,OAAO,CAAC;IAAC,OAAO,EAAE,SAAS,YAAY,EAAE,CAAC;IAAC,KAAK,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,SAAS,CAAA;CAAE,CAAC;AAmF3L;;;GAGG;AACH,wBAAsB,aAAa,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,QAAQ,EAAE,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAmBpG;AA2ED,8CAA8C;AAC9C,wBAAgB,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAKvI;AAWD,sHAAsH;AACtH,wBAAsB,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,CAAC,UAAU,CAAC,EAAE,QAAQ,EAAE;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAE,EAAE,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAM3K"}
|
package/dist/turns/run-calls.js
CHANGED
|
@@ -2,7 +2,8 @@ import { ProblemError } from '@kvman/sdk';
|
|
|
2
2
|
import { isAskKind } from "../connectors/ask.js";
|
|
3
3
|
import { payloadJsonSchema } from "../connectors/connector-command.js";
|
|
4
4
|
import { parseRunArgs } from "../calls/run-tool.js";
|
|
5
|
-
import { createChild, delegateRunSchema, startChild } from "../connectors/delegate.js";
|
|
5
|
+
import { createChild, delegateContinueSchema, delegateRunSchema, startChild } from "../connectors/delegate.js";
|
|
6
|
+
import { continuableHelper, messageHelper } from "../delegate/continue-helper.js";
|
|
6
7
|
import { createRun } from "../delegate/runs.js";
|
|
7
8
|
import { startBackgroundRun } from "../delegate/start-background.js";
|
|
8
9
|
import { availableWorker, isProgram } from "../delegate/workers.js";
|
|
@@ -13,12 +14,16 @@ import { invalid } from "../problems.js";
|
|
|
13
14
|
import { errorOutput, invalidPayloadOutput } from "../connector-call.js";
|
|
14
15
|
import { now } from "../sessions/session-lookup.js";
|
|
15
16
|
import { txRecords } from "../store/collections.js";
|
|
17
|
+
import { hostOf } from "../web-fetch/web-hosts.js";
|
|
16
18
|
import { currentStep } from "./step-claim.js";
|
|
17
19
|
import { liveStep } from "./step-intents.js";
|
|
18
20
|
import { failedCall, orderedCall, runHelp, runTarget, targetOf, textResult } from "./run-command.js";
|
|
19
21
|
import { callPermission, dispatchGuard } from "./call-permission.js";
|
|
20
22
|
import { helperAllows, helperRefusal } from "./helper-calls.js";
|
|
21
23
|
import { readOnlyAllows, readOnlyRefusal } from "./read-only.js";
|
|
24
|
+
import { ruleCovers } from "./approval-rules.js";
|
|
25
|
+
import { checkLines, lastFileChange } from "./check-after-edits.js";
|
|
26
|
+
import { seenFiles } from "./file-results.js";
|
|
22
27
|
const result = (toolCallId, done) => ({ kind: 'result', held: { toolCallId, ...done, run: null } });
|
|
23
28
|
// A call whose arguments never made a connector command: there is nothing for a card to show.
|
|
24
29
|
const refused = (toolCallId, message) => result(toolCallId, { text: errorOutput({ code: 'VALIDATION_FAILED', message }).output, details: null, isError: true });
|
|
@@ -46,7 +51,7 @@ async function delegateOutcome(env, toolCallId, call, held) {
|
|
|
46
51
|
}
|
|
47
52
|
if (held)
|
|
48
53
|
return heldBackRun(toolCallId, call);
|
|
49
|
-
const started = await createRun(ctx, session.id, worker,
|
|
54
|
+
const started = await createRun(ctx, session.id, worker, run, run.background === true ? null : toolCallId, guard);
|
|
50
55
|
if (run.background !== true)
|
|
51
56
|
return { kind: 'worker', runId: started.id };
|
|
52
57
|
if (await currentStep(ctx, env.lease) === undefined)
|
|
@@ -63,7 +68,7 @@ async function delegateOutcome(env, toolCallId, call, held) {
|
|
|
63
68
|
const store = txRecords(tx);
|
|
64
69
|
if (liveStep(store, env.lease, env.lease.jobId) === undefined)
|
|
65
70
|
return false;
|
|
66
|
-
store.background.insert({ sessionId: session.id, ref: childId, kind: 'subagent', call:
|
|
71
|
+
store.background.insert({ sessionId: session.id, ref: childId, kind: 'subagent', call: run.title, startedAt: now() });
|
|
67
72
|
return true;
|
|
68
73
|
});
|
|
69
74
|
if (!current || await currentStep(ctx, env.lease) === undefined)
|
|
@@ -71,6 +76,21 @@ async function delegateOutcome(env, toolCallId, call, held) {
|
|
|
71
76
|
await startChild(ctx, childId, await creationGuard(ctx, env.lease, worker));
|
|
72
77
|
return result(toolCallId, textResult(call, `started ${childId}`));
|
|
73
78
|
}
|
|
79
|
+
// A checked `delegate continue` (ADR 0085, 4): the helper gets its message and goes on, waited for or in the background.
|
|
80
|
+
async function continueOutcome(env, toolCallId, call, held) {
|
|
81
|
+
const { ctx, session } = env;
|
|
82
|
+
const request = delegateContinueSchema.parse(call.payload);
|
|
83
|
+
const { worker } = await continuableHelper(ctx, session.id, request.id);
|
|
84
|
+
const guard = await creationGuard(ctx, env.lease, worker);
|
|
85
|
+
if (held)
|
|
86
|
+
return heldBackRun(toolCallId, call);
|
|
87
|
+
if (!(await messageHelper(ctx, env.lease, request, guard)))
|
|
88
|
+
return refused(toolCallId, 'The originating step is no longer current.');
|
|
89
|
+
if (request.background !== true)
|
|
90
|
+
return { kind: 'subagent', childSessionId: request.id };
|
|
91
|
+
await startChild(ctx, request.id, await creationGuard(ctx, env.lease, worker));
|
|
92
|
+
return result(toolCallId, textResult(call, `started ${request.id}`));
|
|
93
|
+
}
|
|
74
94
|
function evaluateCall(env, toolCall, held) {
|
|
75
95
|
if (toolCall.name !== 'run')
|
|
76
96
|
return Promise.resolve(refused(toolCall.id, `The call's arguments are invalid: the tool is run, not ${toolCall.name}.`));
|
|
@@ -88,8 +108,7 @@ function changesThings(toolCall) {
|
|
|
88
108
|
const builtin = targetOf([], args.data)?.builtin;
|
|
89
109
|
return builtin === undefined || builtin.asks === true || isHelperRun(args.data);
|
|
90
110
|
}
|
|
91
|
-
const
|
|
92
|
-
const isHelperRun = (call) => call.connector === 'delegate' && call.command === 'run';
|
|
111
|
+
const isHelperRun = (call) => call.connector === 'delegate' && (call.command === 'run' || call.command === 'continue');
|
|
93
112
|
const waitsForDecision = (outcome) => outcome.kind === 'deferred' || (outcome.kind === 'question' && outcome.questionKind === 'approval');
|
|
94
113
|
// A helper run that would start behind a pending approval isn't started (ADR 0046, amendment 4); one that asks first is still asked.
|
|
95
114
|
const heldBackRun = (toolCallId, call) => result(toolCallId, failedCall(call, errorOutput({ code: 'VALIDATION_FAILED', message: 'Not started: an earlier call in this reply waits for a decision. Make this call again after it is decided.' }).output));
|
|
@@ -116,7 +135,22 @@ export async function evaluateCalls(env, calls) {
|
|
|
116
135
|
throw invalid('A call of the reply was not evaluated.');
|
|
117
136
|
return outcome;
|
|
118
137
|
});
|
|
119
|
-
return reminded(env, calls, outcomes);
|
|
138
|
+
return checked(env, calls, await reminded(env, calls, outcomes));
|
|
139
|
+
}
|
|
140
|
+
// The person's check runs after the reply's last file change that ran at once and succeeded (ADR 0094, 3).
|
|
141
|
+
async function checked(env, calls, outcomes) {
|
|
142
|
+
if (env.check === null)
|
|
143
|
+
return outcomes;
|
|
144
|
+
const parsed = calls.map((toolCall) => {
|
|
145
|
+
const args = toolCall.name === 'run' ? parseRunArgs(toolCall.arguments) : undefined;
|
|
146
|
+
return args?.success === true ? args.data : undefined;
|
|
147
|
+
});
|
|
148
|
+
const index = lastFileChange(parsed, outcomes.map((outcome) => outcome.kind === 'result' && !outcome.held.isError));
|
|
149
|
+
const outcome = index === undefined ? undefined : outcomes[index];
|
|
150
|
+
if (index === undefined || outcome?.kind !== 'result')
|
|
151
|
+
return outcomes;
|
|
152
|
+
const lines = await checkLines(env.ctx, env.session.id, env.check);
|
|
153
|
+
return outcomes.with(index, { kind: 'result', held: { ...outcome.held, text: `${outcome.held.text}${lines}` } });
|
|
120
154
|
}
|
|
121
155
|
// The lead's reply that changed something while its map says no task is being done is told so once (ADR 0074, 6).
|
|
122
156
|
async function reminded(env, calls, outcomes) {
|
|
@@ -150,11 +184,21 @@ async function evaluateCurrentCall(env, toolCall, call, held) {
|
|
|
150
184
|
// A read-only worker's helper is refused before anyone is asked (ADR 0056, 3).
|
|
151
185
|
if (session.worker?.readOnly === true && !readOnlyAllows(call.command, target.builtin, target))
|
|
152
186
|
return result(toolCall.id, failedCall(call, errorOutput({ code: 'VALIDATION_FAILED', message: readOnlyRefusal(call.connector, call.command) }).output));
|
|
187
|
+
// The first fetch from a host asks, and a read-only helper fetches only from a host its chat allowed (ADR 0095, 4).
|
|
188
|
+
const host = hostOf(call);
|
|
189
|
+
if (host !== undefined && !permitted.grants.webHosts.includes(host)) {
|
|
190
|
+
if (session.worker?.readOnly === true)
|
|
191
|
+
return result(toolCall.id, failedCall(call, errorOutput({ code: 'VALIDATION_FAILED', message: `This helper is read-only: its chat hasn't allowed ${host}, so it isn't fetched. Report what you need from it instead.` }).output));
|
|
192
|
+
if (env.approval !== 'never')
|
|
193
|
+
return { kind: 'question', questionKind: 'approval', question: call };
|
|
194
|
+
}
|
|
153
195
|
if (target.builtin?.asks === true) {
|
|
154
196
|
const invalid = invalidPayload(call, target);
|
|
155
197
|
if (invalid !== undefined)
|
|
156
198
|
return result(toolCall.id, failedCall(call, invalid));
|
|
157
|
-
|
|
199
|
+
const asks = env.approval === 'ask' || (env.approval === 'auto' && call.payload['risky'] !== false);
|
|
200
|
+
// A call the person's rules cover runs without asking, with `ask` too (ADR 0091, 2).
|
|
201
|
+
if (asks && !(await ruleCovers(env.allowed, call, target.registration, ctx.job.workspace.path)))
|
|
158
202
|
return { kind: 'question', questionKind: 'approval', question: call };
|
|
159
203
|
}
|
|
160
204
|
if (target.asks === true && env.approval !== 'never')
|
|
@@ -165,13 +209,14 @@ async function evaluateCurrentCall(env, toolCall, call, held) {
|
|
|
165
209
|
return refused(toolCall.id, 'The originating step is no longer current.');
|
|
166
210
|
const done = await runTarget(ctx, session, call, target, dispatchGuard(ctx, env.lease, call, target));
|
|
167
211
|
// What the chat has now read is what it may change (ADR 0053, 2).
|
|
168
|
-
if (!done.isError
|
|
169
|
-
|
|
212
|
+
if (!done.isError)
|
|
213
|
+
for (const seen of seenFiles(call, target.registration, done.details))
|
|
214
|
+
await recordFileView(ctx, session.id, seen);
|
|
170
215
|
if (done.isError || (call.connector !== 'ask' && call.connector !== 'delegate'))
|
|
171
216
|
return result(toolCall.id, done);
|
|
172
217
|
if (call.connector === 'delegate') {
|
|
173
218
|
try {
|
|
174
|
-
return await delegateOutcome(env, toolCall.id, call, held);
|
|
219
|
+
return await (call.command === 'continue' ? continueOutcome(env, toolCall.id, call, held) : delegateOutcome(env, toolCall.id, call, held));
|
|
175
220
|
}
|
|
176
221
|
catch (error) {
|
|
177
222
|
if (!(error instanceof ProblemError) || ctx.job.signal.aborted)
|
|
@@ -181,6 +226,7 @@ async function evaluateCurrentCall(env, toolCall, call, held) {
|
|
|
181
226
|
}
|
|
182
227
|
return isAskKind(call.command) ? { kind: 'question', questionKind: call.command, question: call.payload } : result(toolCall.id, done);
|
|
183
228
|
}
|
|
229
|
+
// Whether the chat at the root has let web fetch reach the host.
|
|
184
230
|
/** What an approved call of the old shell tool returns: it is never run (ADR 0011, 12). */
|
|
185
231
|
const oldCallText = 'denied by the user\nMake this call again with the run tool.';
|
|
186
232
|
/** Runs an approved call held in the turn. */
|