@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
|
@@ -13,7 +13,10 @@ export declare function records(store: Store): {
|
|
|
13
13
|
readOnly: boolean;
|
|
14
14
|
} | null;
|
|
15
15
|
model: string | null;
|
|
16
|
-
thinking: "off" | "minimal" | "low" | "medium" | "high";
|
|
16
|
+
thinking: "off" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max";
|
|
17
|
+
decides: boolean;
|
|
18
|
+
clearedThroughSeq: number | null;
|
|
19
|
+
webHosts: string[];
|
|
17
20
|
usageBy: {
|
|
18
21
|
summary: {
|
|
19
22
|
input: number;
|
|
@@ -158,10 +161,10 @@ export declare function records(store: Store): {
|
|
|
158
161
|
details: import("zod").JSONType;
|
|
159
162
|
isError: boolean;
|
|
160
163
|
run: {
|
|
161
|
-
description: string;
|
|
162
164
|
connector: string;
|
|
163
165
|
command: string;
|
|
164
166
|
payload: Record<string, import("zod").JSONType>;
|
|
167
|
+
description?: string;
|
|
165
168
|
} | {
|
|
166
169
|
command: string;
|
|
167
170
|
timeoutMs: number;
|
|
@@ -170,10 +173,10 @@ export declare function records(store: Store): {
|
|
|
170
173
|
deferredCalls: {
|
|
171
174
|
toolCallId: string;
|
|
172
175
|
call: {
|
|
173
|
-
description: string;
|
|
174
176
|
connector: string;
|
|
175
177
|
command: string;
|
|
176
178
|
payload: Record<string, import("zod").JSONType>;
|
|
179
|
+
description?: string;
|
|
177
180
|
};
|
|
178
181
|
}[];
|
|
179
182
|
}>;
|
|
@@ -213,6 +216,12 @@ export declare function records(store: Store): {
|
|
|
213
216
|
written: string;
|
|
214
217
|
createdAt: string;
|
|
215
218
|
}>;
|
|
219
|
+
fileChanges: import("@kvman/sdk").Collection<{
|
|
220
|
+
sessionId: string;
|
|
221
|
+
path: string;
|
|
222
|
+
firstAt: string;
|
|
223
|
+
lastAt: string;
|
|
224
|
+
}>;
|
|
216
225
|
fileParts: import("@kvman/sdk").Collection<{
|
|
217
226
|
sessionId: string;
|
|
218
227
|
path: string;
|
|
@@ -236,7 +245,7 @@ export declare function records(store: Store): {
|
|
|
236
245
|
steps: {
|
|
237
246
|
id: string;
|
|
238
247
|
title: string;
|
|
239
|
-
|
|
248
|
+
details: string | null;
|
|
240
249
|
after: string[];
|
|
241
250
|
uses: string | null;
|
|
242
251
|
check: string;
|
|
@@ -373,7 +382,10 @@ export declare function txRecords(tx: Transaction): {
|
|
|
373
382
|
readOnly: boolean;
|
|
374
383
|
} | null;
|
|
375
384
|
model: string | null;
|
|
376
|
-
thinking: "off" | "minimal" | "low" | "medium" | "high";
|
|
385
|
+
thinking: "off" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max";
|
|
386
|
+
decides: boolean;
|
|
387
|
+
clearedThroughSeq: number | null;
|
|
388
|
+
webHosts: string[];
|
|
377
389
|
usageBy: {
|
|
378
390
|
summary: {
|
|
379
391
|
input: number;
|
|
@@ -518,10 +530,10 @@ export declare function txRecords(tx: Transaction): {
|
|
|
518
530
|
details: import("zod").JSONType;
|
|
519
531
|
isError: boolean;
|
|
520
532
|
run: {
|
|
521
|
-
description: string;
|
|
522
533
|
connector: string;
|
|
523
534
|
command: string;
|
|
524
535
|
payload: Record<string, import("zod").JSONType>;
|
|
536
|
+
description?: string;
|
|
525
537
|
} | {
|
|
526
538
|
command: string;
|
|
527
539
|
timeoutMs: number;
|
|
@@ -530,10 +542,10 @@ export declare function txRecords(tx: Transaction): {
|
|
|
530
542
|
deferredCalls: {
|
|
531
543
|
toolCallId: string;
|
|
532
544
|
call: {
|
|
533
|
-
description: string;
|
|
534
545
|
connector: string;
|
|
535
546
|
command: string;
|
|
536
547
|
payload: Record<string, import("zod").JSONType>;
|
|
548
|
+
description?: string;
|
|
537
549
|
};
|
|
538
550
|
}[];
|
|
539
551
|
}>;
|
|
@@ -573,6 +585,12 @@ export declare function txRecords(tx: Transaction): {
|
|
|
573
585
|
written: string;
|
|
574
586
|
createdAt: string;
|
|
575
587
|
}>;
|
|
588
|
+
fileChanges: import("@kvman/sdk").TransactionCollection<{
|
|
589
|
+
sessionId: string;
|
|
590
|
+
path: string;
|
|
591
|
+
firstAt: string;
|
|
592
|
+
lastAt: string;
|
|
593
|
+
}>;
|
|
576
594
|
fileParts: import("@kvman/sdk").TransactionCollection<{
|
|
577
595
|
sessionId: string;
|
|
578
596
|
path: string;
|
|
@@ -596,7 +614,7 @@ export declare function txRecords(tx: Transaction): {
|
|
|
596
614
|
steps: {
|
|
597
615
|
id: string;
|
|
598
616
|
title: string;
|
|
599
|
-
|
|
617
|
+
details: string | null;
|
|
600
618
|
after: string[];
|
|
601
619
|
uses: string | null;
|
|
602
620
|
check: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"collections.d.ts","sourceRoot":"","sources":["../../src/store/collections.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAUrD,yDAAyD;AACzD,wBAAgB,OAAO,CAAC,KAAK,EAAE,KAAK
|
|
1
|
+
{"version":3,"file":"collections.d.ts","sourceRoot":"","sources":["../../src/store/collections.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAUrD,yDAAyD;AACzD,wBAAgB,OAAO,CAAC,KAAK,EAAE,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2BnC;AAED,iDAAiD;AACjD,wBAAgB,SAAS,CAAC,EAAE,EAAE,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2BxC;AAED,MAAM,MAAM,SAAS,GAAG,UAAU,CAAC,OAAO,SAAS,CAAC,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { answerReceiptDocSchema, artifactDocSchema, backgroundDocSchema, fileBackupDocSchema, filePartDocSchema, fileViewDocSchema, messageDocSchema, processDocSchema, questionDocSchema, queuedDocSchema, runDocSchema, sendReceiptDocSchema, sessionDocSchema, stepIntentDocSchema, turnDocSchema } from "../schemas/records.js";
|
|
1
|
+
import { answerReceiptDocSchema, artifactDocSchema, backgroundDocSchema, fileBackupDocSchema, fileChangeDocSchema, filePartDocSchema, fileViewDocSchema, messageDocSchema, processDocSchema, questionDocSchema, queuedDocSchema, runDocSchema, sendReceiptDocSchema, sessionDocSchema, stepIntentDocSchema, turnDocSchema } from "../schemas/records.js";
|
|
2
2
|
import { mapDocSchema } from "../maps/map-schema.js";
|
|
3
3
|
import { signInDocSchema } from "../mcp/sign-in-record.js";
|
|
4
4
|
import { connectorDocSchema, handlerDocSchema, handlerJobDocSchema, sectionDocSchema, slashDocSchema } from "../schemas/registry.js";
|
|
@@ -18,6 +18,7 @@ export function records(store) {
|
|
|
18
18
|
sendReceipts: store.collection('send-receipts', sendReceiptDocSchema),
|
|
19
19
|
fileViews: store.collection('file-views', fileViewDocSchema),
|
|
20
20
|
fileBackups: store.collection('file-backups', fileBackupDocSchema),
|
|
21
|
+
fileChanges: store.collection('file-changes', fileChangeDocSchema),
|
|
21
22
|
fileParts: store.collection('file-parts', filePartDocSchema),
|
|
22
23
|
artifacts: store.collection('artifacts', artifactDocSchema),
|
|
23
24
|
maps: store.collection('maps', mapDocSchema),
|
|
@@ -46,6 +47,7 @@ export function txRecords(tx) {
|
|
|
46
47
|
sendReceipts: tx.collection('send-receipts', sendReceiptDocSchema),
|
|
47
48
|
fileViews: tx.collection('file-views', fileViewDocSchema),
|
|
48
49
|
fileBackups: tx.collection('file-backups', fileBackupDocSchema),
|
|
50
|
+
fileChanges: tx.collection('file-changes', fileChangeDocSchema),
|
|
49
51
|
fileParts: tx.collection('file-parts', filePartDocSchema),
|
|
50
52
|
artifacts: tx.collection('artifacts', artifactDocSchema),
|
|
51
53
|
maps: tx.collection('maps', mapDocSchema),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"collections.js","sourceRoot":"","sources":["../../src/store/collections.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,eAAe,EAAE,YAAY,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"collections.js","sourceRoot":"","sources":["../../src/store/collections.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/** Every thinking level, from none to the most. */
|
|
2
|
+
export declare const thinkingLevels: readonly ["off", "minimal", "low", "medium", "high", "xhigh", "max"];
|
|
3
|
+
export type ThinkingLevel = (typeof thinkingLevels)[number];
|
|
4
|
+
/** The level a model whose levels are `levels` uses for `wanted`: itself, else the next higher it has, else the next lower. */
|
|
5
|
+
export declare function nearestLevel(levels: readonly ThinkingLevel[], wanted: ThinkingLevel): ThinkingLevel;
|
|
6
|
+
//# sourceMappingURL=thinking-levels.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"thinking-levels.d.ts","sourceRoot":"","sources":["../src/thinking-levels.ts"],"names":[],"mappings":"AAGA,mDAAmD;AACnD,eAAO,MAAM,cAAc,sEAAuE,CAAC;AAEnG,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC;AAE5D,+HAA+H;AAC/H,wBAAgB,YAAY,CAAC,MAAM,EAAE,SAAS,aAAa,EAAE,EAAE,MAAM,EAAE,aAAa,GAAG,aAAa,CAKnG"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
// The thinking levels (ADR 0087, 11): all of them in order, and the one a model uses for a level it lacks, by pi-ai's
|
|
2
|
+
// rule. The server and the web app share this module, so it imports nothing.
|
|
3
|
+
/** Every thinking level, from none to the most. */
|
|
4
|
+
export const thinkingLevels = ['off', 'minimal', 'low', 'medium', 'high', 'xhigh', 'max'];
|
|
5
|
+
/** The level a model whose levels are `levels` uses for `wanted`: itself, else the next higher it has, else the next lower. */
|
|
6
|
+
export function nearestLevel(levels, wanted) {
|
|
7
|
+
if (levels.includes(wanted))
|
|
8
|
+
return wanted;
|
|
9
|
+
const index = thinkingLevels.indexOf(wanted);
|
|
10
|
+
const higher = thinkingLevels.slice(index + 1).find((level) => levels.includes(level));
|
|
11
|
+
return higher ?? thinkingLevels.slice(0, index).findLast((level) => levels.includes(level)) ?? wanted;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=thinking-levels.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"thinking-levels.js","sourceRoot":"","sources":["../src/thinking-levels.ts"],"names":[],"mappings":"AAAA,sHAAsH;AACtH,6EAA6E;AAE7E,mDAAmD;AACnD,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,CAAU,CAAC;AAInG,+HAA+H;AAC/H,MAAM,UAAU,YAAY,CAAC,MAAgC,EAAE,MAAqB;IAClF,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,MAAM,CAAC;IAC3C,MAAM,KAAK,GAAG,cAAc,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC7C,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;IACvF,OAAO,MAAM,IAAI,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,MAAM,CAAC;AACxG,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { z, type Ctx, type Json } from '@kvman/sdk';
|
|
2
|
+
import { type ApprovalRule } from '../schemas/approval-rule.ts';
|
|
3
|
+
import { type QuestionDoc } from '../schemas/records.ts';
|
|
4
|
+
export declare const answerExtrasShape: {
|
|
5
|
+
remember: z.ZodExactOptional<z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
6
|
+
kind: z.ZodLiteral<"line">;
|
|
7
|
+
prefix: z.ZodString;
|
|
8
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
9
|
+
kind: z.ZodLiteral<"files">;
|
|
10
|
+
}, z.core.$strict>], "kind">>;
|
|
11
|
+
reason: z.ZodExactOptional<z.ZodString>;
|
|
12
|
+
};
|
|
13
|
+
export type AnswerExtras = {
|
|
14
|
+
remember?: ApprovalRule | undefined;
|
|
15
|
+
reason?: string | undefined;
|
|
16
|
+
};
|
|
17
|
+
/** Refuses extras that don't belong to the question and its answer, before anything is saved. */
|
|
18
|
+
export declare function checkExtras(question: QuestionDoc, answer: Json, extras: AnswerExtras): void;
|
|
19
|
+
/** Adds the rule to this workspace's approval rules, unless one like it is there (ADR 0091, 3). */
|
|
20
|
+
export declare function rememberRule(ctx: Ctx, rule: ApprovalRule): Promise<void>;
|
|
21
|
+
//# sourceMappingURL=answer-extras.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"answer-extras.d.ts","sourceRoot":"","sources":["../../src/turns/answer-extras.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,KAAK,GAAG,EAAE,KAAK,IAAI,EAAE,MAAM,YAAY,CAAC;AAGpD,OAAO,EAAsB,KAAK,YAAY,EAAE,MAAM,6BAA6B,CAAC;AACpF,OAAO,EAAiB,KAAK,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAKxE,eAAO,MAAM,iBAAiB;;;;;;;;CAG7B,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IAAE,QAAQ,CAAC,EAAE,YAAY,GAAG,SAAS,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CAAC;AAchG,iGAAiG;AACjG,wBAAgB,WAAW,CAAC,QAAQ,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CAK3F;AAID,mGAAmG;AACnG,wBAAsB,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAI9E"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { z } from '@kvman/sdk';
|
|
2
|
+
import { builtinConnectors } from "../connector-call.js";
|
|
3
|
+
import { invalid } from "../problems.js";
|
|
4
|
+
import { approvalRuleSchema } from "../schemas/approval-rule.js";
|
|
5
|
+
import { runCallSchema } from "../schemas/records.js";
|
|
6
|
+
// What an approval's answer may carry besides the decision (plan 08 §8.6, ADR 0091, 3 and 4): a rule to remember with
|
|
7
|
+
// an allowed call, or the reason for a denied one.
|
|
8
|
+
export const answerExtrasShape = {
|
|
9
|
+
remember: approvalRuleSchema.exactOptional(),
|
|
10
|
+
reason: z.string().trim().min(1).max(1000).exactOptional(),
|
|
11
|
+
};
|
|
12
|
+
const fileChanges = new Set(['write', 'edit', 'undo', 'assemble']);
|
|
13
|
+
const confirmedOf = (answer) => (typeof answer === 'object' && answer !== null && !Array.isArray(answer) ? answer['confirmed'] : undefined);
|
|
14
|
+
// Whether a rule of this kind could cover the approval's call: a line for a shell or binary line, files for a file change.
|
|
15
|
+
function fits(rule, question) {
|
|
16
|
+
const call = runCallSchema.safeParse(question.question);
|
|
17
|
+
if (!call.success)
|
|
18
|
+
return false;
|
|
19
|
+
const { connector, command } = call.data;
|
|
20
|
+
if (rule.kind === 'files')
|
|
21
|
+
return connector === 'fs' && fileChanges.has(command);
|
|
22
|
+
return command === 'exec' && (connector === 'shell' || !builtinConnectors.some((name) => name === connector));
|
|
23
|
+
}
|
|
24
|
+
/** Refuses extras that don't belong to the question and its answer, before anything is saved. */
|
|
25
|
+
export function checkExtras(question, answer, extras) {
|
|
26
|
+
if (extras.remember === undefined && extras.reason === undefined)
|
|
27
|
+
return;
|
|
28
|
+
if (question.kind !== 'approval')
|
|
29
|
+
throw invalid('remember and reason belong to the answer of an approval.');
|
|
30
|
+
if (extras.remember !== undefined && (confirmedOf(answer) !== true || !fits(extras.remember, question)))
|
|
31
|
+
throw invalid('remember goes with an allowed call that a rule of its kind could cover.');
|
|
32
|
+
if (extras.reason !== undefined && confirmedOf(answer) !== false)
|
|
33
|
+
throw invalid('reason goes with a denied call.');
|
|
34
|
+
}
|
|
35
|
+
const sameRule = (first, second) => first.kind === second.kind && (first.kind === 'files' || (second.kind === 'line' && first.prefix.replace(/\s+/g, ' ') === second.prefix.replace(/\s+/g, ' ')));
|
|
36
|
+
/** Adds the rule to this workspace's approval rules, unless one like it is there (ADR 0091, 3). */
|
|
37
|
+
export async function rememberRule(ctx, rule) {
|
|
38
|
+
const rules = z.array(approvalRuleSchema).parse(await ctx.settings.get('kvcoder.approval.allowed'));
|
|
39
|
+
if (rules.some((saved) => sameRule(saved, rule)))
|
|
40
|
+
return;
|
|
41
|
+
await ctx.settings.set('kvcoder.approval.allowed', [...rules, rule], { scope: 'workspace' });
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=answer-extras.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"answer-extras.js","sourceRoot":"","sources":["../../src/turns/answer-extras.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,8 @@
|
|
|
1
1
|
import { type QuestionKind } from '../connectors/ask.ts';
|
|
2
|
-
|
|
3
|
-
|
|
2
|
+
import type { AnswerExtras } from './answer-extras.ts';
|
|
3
|
+
/**
|
|
4
|
+
* First application must additionally call checkedAnswer with the current question to validate choice membership. An
|
|
5
|
+
* answer with a rule or a reason covers them too; one without has the fingerprint receipts had before (ADR 0091, 4).
|
|
6
|
+
*/
|
|
7
|
+
export declare function answerFingerprint(kind: QuestionKind, answer: unknown, extras?: AnswerExtras): string;
|
|
4
8
|
//# sourceMappingURL=answer-fingerprint.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"answer-fingerprint.d.ts","sourceRoot":"","sources":["../../src/turns/answer-fingerprint.ts"],"names":[],"mappings":"AACA,OAAO,EAAmB,KAAK,YAAY,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"answer-fingerprint.d.ts","sourceRoot":"","sources":["../../src/turns/answer-fingerprint.ts"],"names":[],"mappings":"AACA,OAAO,EAAmB,KAAK,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAE1E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAavD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAE,YAAiB,GAAG,MAAM,CAKxG"}
|
|
@@ -11,8 +11,14 @@ function canonical(value) {
|
|
|
11
11
|
}
|
|
12
12
|
return JSON.stringify(value);
|
|
13
13
|
}
|
|
14
|
-
/**
|
|
15
|
-
|
|
16
|
-
|
|
14
|
+
/**
|
|
15
|
+
* First application must additionally call checkedAnswer with the current question to validate choice membership. An
|
|
16
|
+
* answer with a rule or a reason covers them too; one without has the fingerprint receipts had before (ADR 0091, 4).
|
|
17
|
+
*/
|
|
18
|
+
export function answerFingerprint(kind, answer, extras = {}) {
|
|
19
|
+
const normalized = normalizeAnswer(kind, answer);
|
|
20
|
+
const extra = { ...(extras.remember === undefined ? {} : { remember: extras.remember }), ...(extras.reason === undefined ? {} : { reason: extras.reason }) };
|
|
21
|
+
const covered = Object.keys(extra).length === 0 ? normalized : { answer: normalized, ...extra };
|
|
22
|
+
return createHash('sha256').update(canonical(covered)).digest('hex');
|
|
17
23
|
}
|
|
18
24
|
//# sourceMappingURL=answer-fingerprint.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"answer-fingerprint.js","sourceRoot":"","sources":["../../src/turns/answer-fingerprint.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,eAAe,EAAqB,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"answer-fingerprint.js","sourceRoot":"","sources":["../../src/turns/answer-fingerprint.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,eAAe,EAAqB,MAAM,sBAAsB,CAAC;AAI1E,0GAA0G;AAC1G,+GAA+G;AAC/G,SAAS,SAAS,CAAC,KAAgB;IACjC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;IACvE,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAChD,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1G,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;IACtG,CAAC;IACD,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;AAC/B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAkB,EAAE,MAAe,EAAE,SAAuB,EAAE;IAC9F,MAAM,UAAU,GAAG,eAAe,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACjD,MAAM,KAAK,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC;IAC7J,MAAM,OAAO,GAAc,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,KAAK,EAAE,CAAC;IAC3G,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACvE,CAAC"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { Ctx, Json, Stored } from '@kvman/sdk';
|
|
2
2
|
import { type AnswerReceiptDoc, type QuestionDoc, type RunCallDoc } from '../schemas/records.ts';
|
|
3
3
|
import type { TxRecords } from '../store/collections.ts';
|
|
4
|
+
import { type AnswerExtras } from './answer-extras.ts';
|
|
4
5
|
import type { StepIdentity } from './step-intents.ts';
|
|
5
6
|
export type AnswerApplication = {
|
|
6
7
|
kind: 'acknowledged';
|
|
@@ -15,5 +16,5 @@ export type AnswerApplication = {
|
|
|
15
16
|
call: RunCallDoc;
|
|
16
17
|
};
|
|
17
18
|
/** No awaits or effects: the first valid ordinary application and all its records commit together. */
|
|
18
|
-
export declare function applyAnswer(ctx: Ctx, store: TxRecords, questionId: string, answer: Json, expected?: Stored<QuestionDoc>): AnswerApplication;
|
|
19
|
+
export declare function applyAnswer(ctx: Ctx, store: TxRecords, questionId: string, answer: Json, extras: AnswerExtras, expected?: Stored<QuestionDoc>): AnswerApplication;
|
|
19
20
|
//# sourceMappingURL=apply-answer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apply-answer.d.ts","sourceRoot":"","sources":["../../src/turns/apply-answer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAIpD,OAAO,EAAiB,KAAK,gBAAgB,EAAmB,KAAK,WAAW,EAAE,KAAK,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAEjI,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAGzD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtD,MAAM,MAAM,iBAAiB,GACzB;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC,gBAAgB,CAAC,CAAA;CAAE,GAC3D;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC,gBAAgB,CAAC,CAAC;IAAC,QAAQ,EAAE,YAAY,GAAG,IAAI,CAAA;CAAE,GACrF;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;IAAC,IAAI,EAAE,UAAU,CAAA;CAAE,CAAC;AAE1E,sGAAsG;AACtG,wBAAgB,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,WAAW,CAAC,GAAG,iBAAiB,
|
|
1
|
+
{"version":3,"file":"apply-answer.d.ts","sourceRoot":"","sources":["../../src/turns/apply-answer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAIpD,OAAO,EAAiB,KAAK,gBAAgB,EAAmB,KAAK,WAAW,EAAE,KAAK,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAEjI,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAGzD,OAAO,EAAe,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEpE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtD,MAAM,MAAM,iBAAiB,GACzB;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC,gBAAgB,CAAC,CAAA;CAAE,GAC3D;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC,gBAAgB,CAAC,CAAC;IAAC,QAAQ,EAAE,YAAY,GAAG,IAAI,CAAA;CAAE,GACrF;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;IAAC,IAAI,EAAE,UAAU,CAAA;CAAE,CAAC;AAE1E,sGAAsG;AACtG,wBAAgB,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,WAAW,CAAC,GAAG,iBAAiB,CAkCjK"}
|
|
@@ -4,13 +4,15 @@ import { invalid } from "../problems.js";
|
|
|
4
4
|
import { runCallSchema } from "../schemas/records.js";
|
|
5
5
|
import { now } from "../sessions/session-lookup.js";
|
|
6
6
|
import { answerFingerprint } from "./answer-fingerprint.js";
|
|
7
|
+
import { allowHostInTx } from "../web-fetch/web-hosts.js";
|
|
8
|
+
import { checkExtras } from "./answer-extras.js";
|
|
7
9
|
import { heldText, resolvePendingInTx } from "./resolve.js";
|
|
8
10
|
/** No awaits or effects: the first valid ordinary application and all its records commit together. */
|
|
9
|
-
export function applyAnswer(ctx, store, questionId, answer, expected) {
|
|
11
|
+
export function applyAnswer(ctx, store, questionId, answer, extras, expected) {
|
|
10
12
|
ctx.job.signal.throwIfAborted();
|
|
11
13
|
const [receipt] = store.answerReceipts.find({ questionId }, { limit: 1 });
|
|
12
14
|
if (receipt !== undefined) {
|
|
13
|
-
if (answerFingerprint(receipt.questionKind, answer) !== receipt.answerFingerprint)
|
|
15
|
+
if (answerFingerprint(receipt.questionKind, answer, extras) !== receipt.answerFingerprint)
|
|
14
16
|
throw invalid('This question already has a different answer.');
|
|
15
17
|
return { kind: 'acknowledged', receipt };
|
|
16
18
|
}
|
|
@@ -28,6 +30,7 @@ export function applyAnswer(ctx, store, questionId, answer, expected) {
|
|
|
28
30
|
if (candidates.length !== 1 || pending?.toolCallId !== question.toolCallId || pending.questionId !== questionId || pending.kind !== (question.kind === 'approval' ? 'approval' : 'question') || pending.childSessionId !== null || pending.runId !== null || pending.question === null || turn.results.some(item => item.toolCallId === question.toolCallId))
|
|
29
31
|
throw missing();
|
|
30
32
|
const checked = checkedAnswer(question, answer);
|
|
33
|
+
checkExtras(question, answer, extras);
|
|
31
34
|
const call = checked.kind === 'approval' && checked.approved ? runCallSchema.parse(question.question) : undefined;
|
|
32
35
|
// Existing run records cannot prove durable launch. Keep grants on their existing separate flow, WITHOUT receipts.
|
|
33
36
|
if (call !== undefined && isDelegateRun(call))
|
|
@@ -36,8 +39,11 @@ export function applyAnswer(ctx, store, questionId, answer, expected) {
|
|
|
36
39
|
? heldText(question.toolCallId, checked.text, false)
|
|
37
40
|
: call !== undefined
|
|
38
41
|
? { toolCallId: question.toolCallId, text: '', details: null, isError: false, run: call }
|
|
39
|
-
: heldText(question.toolCallId, 'denied by the user'
|
|
40
|
-
|
|
42
|
+
: heldText(question.toolCallId, extras.reason === undefined ? 'denied by the user' : `denied by the user: ${extras.reason}`, true);
|
|
43
|
+
// An allowed fetch lets the chat reach its host from now on (ADR 0095, 4).
|
|
44
|
+
if (call !== undefined)
|
|
45
|
+
allowHostInTx(store, question.sessionId, call);
|
|
46
|
+
const fingerprint = answerFingerprint(question.kind, answer, extras);
|
|
41
47
|
ctx.job.signal.throwIfAborted();
|
|
42
48
|
store.questions.delete(questionId);
|
|
43
49
|
const identity = resolvePendingInTx(store, question.sessionId, question.toolCallId, held);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apply-answer.js","sourceRoot":"","sources":["../../src/turns/apply-answer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACzC,OAAO,EAAE,aAAa,EAA6E,MAAM,uBAAuB,CAAC;AACjI,OAAO,EAAE,GAAG,EAAE,MAAM,+BAA+B,CAAC;AAEpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,QAAQ,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAQ5D,sGAAsG;AACtG,MAAM,UAAU,WAAW,CAAC,GAAQ,EAAE,KAAgB,EAAE,UAAkB,EAAE,MAAY,EAAE,QAA8B;
|
|
1
|
+
{"version":3,"file":"apply-answer.js","sourceRoot":"","sources":["../../src/turns/apply-answer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { RunCall } from '../calls/run-tool.ts';
|
|
2
|
+
import type { ApprovalRule } from '../schemas/approval-rule.ts';
|
|
3
|
+
/** The commands of a line, or `undefined` when one of them holds more than plain words. */
|
|
4
|
+
export declare function lineParts(line: string): string[] | undefined;
|
|
5
|
+
/** Whether every command of the line starts with one of the prefixes, at a word's end. */
|
|
6
|
+
export declare function lineCovered(line: string, prefixes: readonly string[]): boolean;
|
|
7
|
+
/** Whether a file, by its path from the workspace folder, runs code or holds secrets: Git's own folder, `.env` files, and the project's rules. */
|
|
8
|
+
export declare function guardedFile(relative: string): boolean;
|
|
9
|
+
/** The line a call runs in the real shell: `shell exec`'s, or a binary's `<name> <args>`. */
|
|
10
|
+
export declare function callLine(call: RunCall, registration: string): string | undefined;
|
|
11
|
+
/** Whether one of the rules covers the call, which would otherwise ask (ADR 0091, 2). */
|
|
12
|
+
export declare function ruleCovers(rules: readonly ApprovalRule[], call: RunCall, registration: string, workspace: string): Promise<boolean>;
|
|
13
|
+
//# sourceMappingURL=approval-rules.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"approval-rules.d.ts","sourceRoot":"","sources":["../../src/turns/approval-rules.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAIpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAWhE,2FAA2F;AAC3F,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAG5D;AAID,0FAA0F;AAC1F,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAI9E;AAMD,kJAAkJ;AAClJ,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAIrD;AAED,6FAA6F;AAC7F,wBAAgB,QAAQ,CAAC,IAAI,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAKhF;AAcD,yFAAyF;AACzF,wBAAsB,UAAU,CAAC,KAAK,EAAE,SAAS,YAAY,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAIzI"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { realpath } from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { ProblemError } from '@kvman/sdk';
|
|
4
|
+
import { binaryExec } from "../connectors/binary.js";
|
|
5
|
+
import { builtinCommands } from "../connectors/builtin-connectors.js";
|
|
6
|
+
import { resolveInWorkspace } from "../files/workspace-path.js";
|
|
7
|
+
// The person's approval rules (plan 08 §8.3, ADR 0091, 1 and 2): a line whose every part starts with an allowed
|
|
8
|
+
// prefix, or a file change, runs without asking. A part is covered only when it holds plain words, so no shell's
|
|
9
|
+
// syntax can run another command inside it; a file that runs code or holds secrets is never covered.
|
|
10
|
+
const separators = /&&|\|\||[;|&\r\n]/;
|
|
11
|
+
// Letters, digits, spaces, and the punctuation of plain arguments: no `$`, backtick, bracket, brace, `<`, `>`, or `\`.
|
|
12
|
+
const plainPart = /^[\p{L}\p{N} \t_.,/:=+@%~*'"-]*$/u;
|
|
13
|
+
const words = (text) => text.trim().replace(/\s+/g, ' ');
|
|
14
|
+
/** The commands of a line, or `undefined` when one of them holds more than plain words. */
|
|
15
|
+
export function lineParts(line) {
|
|
16
|
+
const parts = line.split(separators).map(words).filter((part) => part !== '');
|
|
17
|
+
return parts.every((part) => plainPart.test(part)) ? parts : undefined;
|
|
18
|
+
}
|
|
19
|
+
const startsWith = (part, prefix) => part === prefix || part.startsWith(`${prefix} `);
|
|
20
|
+
/** Whether every command of the line starts with one of the prefixes, at a word's end. */
|
|
21
|
+
export function lineCovered(line, prefixes) {
|
|
22
|
+
const parts = lineParts(line);
|
|
23
|
+
const allowed = prefixes.map(words);
|
|
24
|
+
return parts !== undefined && parts.length > 0 && parts.every((part) => allowed.some((prefix) => startsWith(part, prefix)));
|
|
25
|
+
}
|
|
26
|
+
const shellRun = builtinCommands.shell.exec.registration;
|
|
27
|
+
const fileChanges = new Set([builtinCommands.fs.write, builtinCommands.fs.edit, builtinCommands.fs.undo, builtinCommands.fs.assemble].map((command) => command.registration));
|
|
28
|
+
const projectRules = new Set(['agents.md', 'claude.md']);
|
|
29
|
+
/** Whether a file, by its path from the workspace folder, runs code or holds secrets: Git's own folder, `.env` files, and the project's rules. */
|
|
30
|
+
export function guardedFile(relative) {
|
|
31
|
+
const segments = relative.split(/[\\/]/).filter((segment) => segment !== '' && segment !== '.');
|
|
32
|
+
const name = (segments.at(-1) ?? '').toLowerCase();
|
|
33
|
+
return segments.some((segment) => segment.toLowerCase() === '.git') || name === '.env' || name.startsWith('.env.') || (segments.length === 1 && projectRules.has(name));
|
|
34
|
+
}
|
|
35
|
+
/** The line a call runs in the real shell: `shell exec`'s, or a binary's `<name> <args>`. */
|
|
36
|
+
export function callLine(call, registration) {
|
|
37
|
+
if (registration === shellRun)
|
|
38
|
+
return typeof call.payload['line'] === 'string' ? call.payload['line'] : undefined;
|
|
39
|
+
if (registration !== binaryExec.registration)
|
|
40
|
+
return undefined;
|
|
41
|
+
const args = call.payload['args'];
|
|
42
|
+
return typeof args === 'string' && args.trim() !== '' ? `${call.connector} ${args}` : call.connector;
|
|
43
|
+
}
|
|
44
|
+
// A file change a files rule covers: its real path is inside the workspace folder and isn't a guarded file.
|
|
45
|
+
async function fileCovered(workspace, requested) {
|
|
46
|
+
if (typeof requested !== 'string' || requested === '')
|
|
47
|
+
return false;
|
|
48
|
+
try {
|
|
49
|
+
return !guardedFile(path.relative(await realpath(workspace), await resolveInWorkspace(workspace, requested)));
|
|
50
|
+
}
|
|
51
|
+
catch (error) {
|
|
52
|
+
// A path outside the folder is the call's own failure to report; it is just not covered.
|
|
53
|
+
if (error instanceof ProblemError)
|
|
54
|
+
return false;
|
|
55
|
+
throw error;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/** Whether one of the rules covers the call, which would otherwise ask (ADR 0091, 2). */
|
|
59
|
+
export async function ruleCovers(rules, call, registration, workspace) {
|
|
60
|
+
if (fileChanges.has(registration))
|
|
61
|
+
return rules.some((rule) => rule.kind === 'files') && fileCovered(workspace, call.payload['path']);
|
|
62
|
+
const line = callLine(call, registration);
|
|
63
|
+
return line !== undefined && lineCovered(line, rules.flatMap((rule) => (rule.kind === 'line' ? [rule.prefix] : [])));
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=approval-rules.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"approval-rules.js","sourceRoot":"","sources":["../../src/turns/approval-rules.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { SessionDoc } from '../schemas/records.ts';
|
|
2
|
+
/** The `cacheRetention` a session's step and summary calls send, spread into `kvai.complete`'s input. */
|
|
3
|
+
export declare function cacheRetentionOf(session: Pick<SessionDoc, 'parentId'>): {
|
|
4
|
+
cacheRetention?: 'long';
|
|
5
|
+
};
|
|
6
|
+
//# sourceMappingURL=cache-retention.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache-retention.d.ts","sourceRoot":"","sources":["../../src/turns/cache-retention.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAKxD,yGAAyG;AACzG,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,GAAG;IAAE,cAAc,CAAC,EAAE,MAAM,CAAA;CAAE,CAEnG"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
// The lead of a chat waits on the person, approvals, background runs, and helpers for longer than a provider's short
|
|
2
|
+
// prompt cache, so its calls ask for the long one; a helper's calls run back to back and keep the default (ADR 0087, 4).
|
|
3
|
+
/** The `cacheRetention` a session's step and summary calls send, spread into `kvai.complete`'s input. */
|
|
4
|
+
export function cacheRetentionOf(session) {
|
|
5
|
+
return session.parentId === null ? { cacheRetention: 'long' } : {};
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=cache-retention.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache-retention.js","sourceRoot":"","sources":["../../src/turns/cache-retention.ts"],"names":[],"mappings":"AAEA,qHAAqH;AACrH,yHAAyH;AAEzH,yGAAyG;AACzG,MAAM,UAAU,gBAAgB,CAAC,OAAqC;IACpE,OAAO,OAAO,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;AACrE,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { Stored } from '@kvman/sdk';
|
|
2
|
+
import type { HeldResult, SessionDoc, TurnDoc } from '../schemas/records.ts';
|
|
3
|
+
import type { TxRecords } from '../store/collections.ts';
|
|
4
|
+
/** Appends a step's results as toolResult messages, in the model's call order. */
|
|
5
|
+
export declare function appendResults(store: TxRecords, session: Stored<SessionDoc>, turnId: string, calls: TurnDoc['calls'], results: readonly HeldResult[]): void;
|
|
6
|
+
//# sourceMappingURL=call-results.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"call-results.d.ts","sourceRoot":"","sources":["../../src/turns/call-results.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,KAAK,EAAE,UAAU,EAAa,UAAU,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AACxF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAazD,kFAAkF;AAClF,wBAAgB,aAAa,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,SAAS,UAAU,EAAE,GAAG,IAAI,CAO1J"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { appendMessage } from "./history.js";
|
|
2
|
+
// A reply's results as stored messages (plan 08 §8.2): one toolResult message per call, in the model's call order.
|
|
3
|
+
// A result's details without a second copy of its output (ADR 0034, 7): the output stays only where it differs from the
|
|
4
|
+
// text the model gets, which is a shell line's and a binary's.
|
|
5
|
+
function storedDetails(held) {
|
|
6
|
+
const details = held.details;
|
|
7
|
+
if (typeof details !== 'object' || details === null || Array.isArray(details) || details['output'] !== held.text)
|
|
8
|
+
return details;
|
|
9
|
+
return Object.fromEntries(Object.entries(details).filter(([name]) => name !== 'output'));
|
|
10
|
+
}
|
|
11
|
+
/** Appends a step's results as toolResult messages, in the model's call order. */
|
|
12
|
+
export function appendResults(store, session, turnId, calls, results) {
|
|
13
|
+
for (const call of calls) {
|
|
14
|
+
const held = results.find((candidate) => candidate.toolCallId === call.toolCallId);
|
|
15
|
+
if (held === undefined)
|
|
16
|
+
continue;
|
|
17
|
+
const content = { role: 'toolResult', toolCallId: call.toolCallId, toolName: call.toolName, content: [{ type: 'text', text: held.text }], isError: held.isError, timestamp: Date.now() };
|
|
18
|
+
appendMessage(store, session, { kind: 'toolResult', content: held.details === null ? content : { ...content, details: storedDetails(held) }, turnId });
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=call-results.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"call-results.js","sourceRoot":"","sources":["../../src/turns/call-results.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7C,mHAAmH;AAEnH,wHAAwH;AACxH,+DAA+D;AAC/D,SAAS,aAAa,CAAC,IAAgB;IACrC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;IAC7B,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC,IAAI;QAAE,OAAO,OAAO,CAAC;IACjI,OAAO,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC;AAC3F,CAAC;AAED,kFAAkF;AAClF,MAAM,UAAU,aAAa,CAAC,KAAgB,EAAE,OAA2B,EAAE,MAAc,EAAE,KAAuB,EAAE,OAA8B;IAClJ,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,UAAU,KAAK,IAAI,CAAC,UAAU,CAAC,CAAC;QACnF,IAAI,IAAI,KAAK,SAAS;YAAE,SAAS;QACjC,MAAM,OAAO,GAA8B,EAAE,IAAI,EAAE,YAAY,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;QACpN,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE,aAAa,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;IACzJ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Ctx } from '@kvman/sdk';
|
|
2
|
+
import type { Check } from '../schemas/check.ts';
|
|
3
|
+
import type { RunCall } from '../calls/run-tool.ts';
|
|
4
|
+
/** The reply's last file change that ran at once and succeeded, by its place. */
|
|
5
|
+
export declare function lastFileChange(calls: readonly (RunCall | undefined)[], succeeded: readonly boolean[]): number | undefined;
|
|
6
|
+
/** Runs the check and gives the lines the change's result ends with. */
|
|
7
|
+
export declare function checkLines(ctx: Ctx, sessionId: string, check: NonNullable<Check>): Promise<string>;
|
|
8
|
+
//# sourceMappingURL=check-after-edits.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check-after-edits.d.ts","sourceRoot":"","sources":["../../src/turns/check-after-edits.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAUpD,iFAAiF;AACjF,wBAAgB,cAAc,CAAC,KAAK,EAAE,SAAS,CAAC,OAAO,GAAG,SAAS,CAAC,EAAE,EAAE,SAAS,EAAE,SAAS,OAAO,EAAE,GAAG,MAAM,GAAG,SAAS,CAGzH;AAQD,wEAAwE;AACxE,wBAAsB,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAKxG"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { runLine } from "../calls/line-run.js";
|
|
2
|
+
// The person's check after file changes (plan 08 §8.3, ADR 0094, 3): after a reply whose `fs` change ran at once and
|
|
3
|
+
// succeeded, `kvcoder.check`'s line runs once, without asking, and its exit code and last 4 KB end the last change's result.
|
|
4
|
+
const changes = new Set(['write', 'edit', 'undo', 'assemble']);
|
|
5
|
+
const tailBytes = 4096;
|
|
6
|
+
/** The reply's last file change that ran at once and succeeded, by its place. */
|
|
7
|
+
export function lastFileChange(calls, succeeded) {
|
|
8
|
+
const index = calls.findLastIndex((call, place) => call?.connector === 'fs' && changes.has(call.command) && succeeded[place] === true);
|
|
9
|
+
return index === -1 ? undefined : index;
|
|
10
|
+
}
|
|
11
|
+
// The end of the output, whole characters, at most 4 KB.
|
|
12
|
+
function tail(output) {
|
|
13
|
+
const bytes = Buffer.from(output.trimEnd(), 'utf8');
|
|
14
|
+
return bytes.length <= tailBytes ? bytes.toString('utf8') : `…${bytes.subarray(bytes.length - tailBytes).toString('utf8').replace(/^�+/, '')}`;
|
|
15
|
+
}
|
|
16
|
+
/** Runs the check and gives the lines the change's result ends with. */
|
|
17
|
+
export async function checkLines(ctx, sessionId, check) {
|
|
18
|
+
const run = await runLine(ctx, sessionId, check.line, { timeoutMs: check.timeoutMs });
|
|
19
|
+
const timedOut = run.timedOut ? `, timed out after ${String(Math.round(check.timeoutMs / 1000))} s` : '';
|
|
20
|
+
const output = tail(run.output);
|
|
21
|
+
return `\n\n[kvman ran the check: ${check.line}, exit code ${String(run.exitCode ?? 1)}${timedOut}]${output === '' ? '' : `\n${output}`}`;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=check-after-edits.js.map
|