@kvman/kvcoder 0.1.20 → 0.1.22

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.
Files changed (133) hide show
  1. package/dist/api.d.ts +48 -0
  2. package/dist/api.d.ts.map +1 -1
  3. package/dist/connectors/artifact.d.ts.map +1 -1
  4. package/dist/connectors/artifact.js +4 -2
  5. package/dist/connectors/artifact.js.map +1 -1
  6. package/dist/connectors/delegate.d.ts.map +1 -1
  7. package/dist/connectors/delegate.js +3 -0
  8. package/dist/connectors/delegate.js.map +1 -1
  9. package/dist/connectors/execution-map.d.ts.map +1 -1
  10. package/dist/connectors/execution-map.js +2 -1
  11. package/dist/connectors/execution-map.js.map +1 -1
  12. package/dist/delegate/permission.d.ts +5 -0
  13. package/dist/delegate/permission.d.ts.map +1 -1
  14. package/dist/delegate/program-permission.d.ts +1 -0
  15. package/dist/delegate/program-permission.d.ts.map +1 -1
  16. package/dist/delegate/runs.d.ts.map +1 -1
  17. package/dist/delegate/runs.js +2 -1
  18. package/dist/delegate/runs.js.map +1 -1
  19. package/dist/files/change-fence.d.ts +5 -0
  20. package/dist/files/change-fence.d.ts.map +1 -0
  21. package/dist/files/change-fence.js +17 -0
  22. package/dist/files/change-fence.js.map +1 -0
  23. package/dist/files/file-change.d.ts +10 -4
  24. package/dist/files/file-change.d.ts.map +1 -1
  25. package/dist/files/file-change.js +19 -21
  26. package/dist/files/file-change.js.map +1 -1
  27. package/dist/files/file-copies.d.ts +31 -0
  28. package/dist/files/file-copies.d.ts.map +1 -0
  29. package/dist/files/file-copies.js +59 -0
  30. package/dist/files/file-copies.js.map +1 -0
  31. package/dist/files/file-parts.d.ts.map +1 -1
  32. package/dist/files/file-parts.js +4 -2
  33. package/dist/files/file-parts.js.map +1 -1
  34. package/dist/files/register-changes.d.ts.map +1 -1
  35. package/dist/files/register-changes.js +19 -7
  36. package/dist/files/register-changes.js.map +1 -1
  37. package/dist/index.d.ts.map +1 -1
  38. package/dist/index.js +2 -0
  39. package/dist/index.js.map +1 -1
  40. package/dist/jobs/notify-watch.d.ts.map +1 -1
  41. package/dist/jobs/notify-watch.js +3 -2
  42. package/dist/jobs/notify-watch.js.map +1 -1
  43. package/dist/jobs/process-handlers.d.ts.map +1 -1
  44. package/dist/jobs/process-handlers.js +7 -3
  45. package/dist/jobs/process-handlers.js.map +1 -1
  46. package/dist/jobs/process-report.d.ts.map +1 -1
  47. package/dist/jobs/process-report.js +7 -2
  48. package/dist/jobs/process-report.js.map +1 -1
  49. package/dist/jobs/process-run.d.ts.map +1 -1
  50. package/dist/jobs/process-run.js +6 -2
  51. package/dist/jobs/process-run.js.map +1 -1
  52. package/dist/maps/map-schema.d.ts +1 -0
  53. package/dist/maps/map-schema.d.ts.map +1 -1
  54. package/dist/maps/map-schema.js +3 -0
  55. package/dist/maps/map-schema.js.map +1 -1
  56. package/dist/messages/attachments.d.ts +7 -0
  57. package/dist/messages/attachments.d.ts.map +1 -1
  58. package/dist/messages/attachments.js +29 -1
  59. package/dist/messages/attachments.js.map +1 -1
  60. package/dist/messages/receive-message.d.ts +1 -0
  61. package/dist/messages/receive-message.d.ts.map +1 -1
  62. package/dist/messages/receive-message.js +4 -3
  63. package/dist/messages/receive-message.js.map +1 -1
  64. package/dist/messages/register-messages.js +3 -3
  65. package/dist/messages/register-messages.js.map +1 -1
  66. package/dist/messages/send-receipt.d.ts +1 -1
  67. package/dist/messages/send-receipt.d.ts.map +1 -1
  68. package/dist/messages/send-receipt.js +4 -2
  69. package/dist/messages/send-receipt.js.map +1 -1
  70. package/dist/prompt/session-grants.d.ts +2 -0
  71. package/dist/prompt/session-grants.d.ts.map +1 -1
  72. package/dist/prompt/working-method.d.ts.map +1 -1
  73. package/dist/prompt/working-method.js +3 -2
  74. package/dist/prompt/working-method.js.map +1 -1
  75. package/dist/rewind/chat-mark.d.ts +4 -0
  76. package/dist/rewind/chat-mark.d.ts.map +1 -0
  77. package/dist/rewind/chat-mark.js +8 -0
  78. package/dist/rewind/chat-mark.js.map +1 -0
  79. package/dist/rewind/register-rewind.d.ts +3 -0
  80. package/dist/rewind/register-rewind.d.ts.map +1 -0
  81. package/dist/rewind/register-rewind.js +88 -0
  82. package/dist/rewind/register-rewind.js.map +1 -0
  83. package/dist/rewind/rewind-chat.d.ts +13 -0
  84. package/dist/rewind/rewind-chat.d.ts.map +1 -0
  85. package/dist/rewind/rewind-chat.js +80 -0
  86. package/dist/rewind/rewind-chat.js.map +1 -0
  87. package/dist/rewind/rewind-files.d.ts +17 -0
  88. package/dist/rewind/rewind-files.d.ts.map +1 -0
  89. package/dist/rewind/rewind-files.js +99 -0
  90. package/dist/rewind/rewind-files.js.map +1 -0
  91. package/dist/rewind/rewind-records.d.ts +7 -0
  92. package/dist/rewind/rewind-records.d.ts.map +1 -0
  93. package/dist/rewind/rewind-records.js +82 -0
  94. package/dist/rewind/rewind-records.js.map +1 -0
  95. package/dist/rewind/rewind-target.d.ts +18 -0
  96. package/dist/rewind/rewind-target.d.ts.map +1 -0
  97. package/dist/rewind/rewind-target.js +47 -0
  98. package/dist/rewind/rewind-target.js.map +1 -0
  99. package/dist/schemas/file-records.d.ts +46 -0
  100. package/dist/schemas/file-records.d.ts.map +1 -0
  101. package/dist/schemas/file-records.js +34 -0
  102. package/dist/schemas/file-records.js.map +1 -0
  103. package/dist/schemas/process-doc.d.ts +2 -0
  104. package/dist/schemas/process-doc.d.ts.map +1 -1
  105. package/dist/schemas/process-doc.js +3 -0
  106. package/dist/schemas/process-doc.js.map +1 -1
  107. package/dist/schemas/records.d.ts +6 -28
  108. package/dist/schemas/records.d.ts.map +1 -1
  109. package/dist/schemas/records.js +10 -8
  110. package/dist/schemas/records.js.map +1 -1
  111. package/dist/sessions/new-session.d.ts.map +1 -1
  112. package/dist/sessions/new-session.js +3 -1
  113. package/dist/sessions/new-session.js.map +1 -1
  114. package/dist/store/collections.d.ts +42 -2
  115. package/dist/store/collections.d.ts.map +1 -1
  116. package/dist/store/collections.js +3 -1
  117. package/dist/store/collections.js.map +1 -1
  118. package/dist/turns/start-turn.d.ts.map +1 -1
  119. package/dist/turns/start-turn.js +2 -1
  120. package/dist/turns/start-turn.js.map +1 -1
  121. package/dist/web/components/approval.css +1 -1
  122. package/dist/web/components/call.css +1 -1
  123. package/dist/web/components/connectors.css +1 -1
  124. package/dist/web/components/conversation.css +1 -1
  125. package/dist/web/components/conversation.js +2458 -2076
  126. package/dist/web/components/mcp-sign-in.css +1 -1
  127. package/dist/web/components/model.css +1 -1
  128. package/dist/web/components/preferences.css +1 -1
  129. package/dist/web/components/question.css +1 -1
  130. package/dist/web/components/sessions.css +1 -1
  131. package/locales/ar.json +16 -0
  132. package/locales/en.json +16 -0
  133. package/package.json +10 -1
@@ -0,0 +1,80 @@
1
+ import { realpath } from 'node:fs/promises';
2
+ import { dropRun } from "../delegate/runs.js";
3
+ import { deleteSessionTree } from "../sessions/new-session.js";
4
+ import { allDocs } from "../store/all-docs.js";
5
+ import { records, txRecords } from "../store/collections.js";
6
+ import { cancelTurn } from "../turns/end-turn.js";
7
+ import { changedAfter, rewindFile, treeOf } from "./rewind-files.js";
8
+ import { dropRecords } from "./rewind-records.js";
9
+ import { isAfter } from "./rewind-target.js";
10
+ // Helpers made after the message: deleting is marked first, so no change of theirs lands after it (ADR 0118, 5).
11
+ async function stopHelpers(ctx, chatId, mark) {
12
+ const store = records(ctx.store);
13
+ const helpers = (await allDocs((options) => store.sessions.find({ parentId: chatId }, options))).filter((child) => isAfter(child.atSeq, child.createdAt, mark));
14
+ for (const helper of helpers) {
15
+ await store.sessions.update(helper.id, { deleting: true });
16
+ await cancelTurn(ctx, helper.id, false);
17
+ }
18
+ return helpers.map((helper) => helper.id);
19
+ }
20
+ // Program workers' runs started after the message stop telling no one; processes keep running, but quiet.
21
+ async function stopStarted(ctx, sessions, mark) {
22
+ const store = records(ctx.store);
23
+ for (const sessionId of sessions) {
24
+ for (const run of await allDocs((options) => store.runs.find({ sessionId }, options))) {
25
+ if (!isAfter(run.atSeq, run.startedAt, mark))
26
+ continue;
27
+ await dropRun(ctx, run);
28
+ await store.runs.delete(run.id);
29
+ }
30
+ for (const process of await allDocs((options) => store.processes.find({ sessionId }, options))) {
31
+ if (isAfter(process.atSeq, process.startedAt, mark))
32
+ await store.processes.update(process.id, { quiet: true });
33
+ }
34
+ }
35
+ }
36
+ // Files kept as they are keep their records under the chat, so a later rewind can still take them back.
37
+ async function keepHelperCopies(ctx, chatId, helpers) {
38
+ for (const helper of await treeOfAll(ctx, helpers)) {
39
+ await ctx.store.transaction((tx) => {
40
+ const store = txRecords(tx);
41
+ // A moved record leaves the filter, so each page is a fresh first page.
42
+ for (let page = store.fileBackups.find({ sessionId: helper }, { limit: 1000 }); page.length > 0; page = store.fileBackups.find({ sessionId: helper }, { limit: 1000 }))
43
+ for (const copy of page)
44
+ store.fileBackups.update(copy.id, { sessionId: chatId });
45
+ for (let page = store.fileCopies.find({ sessionId: helper }, { limit: 1000 }); page.length > 0; page = store.fileCopies.find({ sessionId: helper }, { limit: 1000 }))
46
+ for (const kept of page)
47
+ store.fileCopies.update(kept.id, { sessionId: chatId });
48
+ });
49
+ }
50
+ }
51
+ async function treeOfAll(ctx, roots) {
52
+ return (await Promise.all(roots.map((root) => treeOf(ctx, root)))).flat();
53
+ }
54
+ async function rewindFiles(ctx, chatId, sessions, mark) {
55
+ const base = await realpath(ctx.job.workspace.path);
56
+ const decided = [];
57
+ for (const real of await changedAfter(ctx, sessions, mark)) {
58
+ const decision = await rewindFile(ctx, chatId, sessions, real, mark, base);
59
+ if (decision !== undefined)
60
+ decided.push(decision);
61
+ }
62
+ const named = (state) => decided.filter((file) => file.state === state).map((file) => file.path);
63
+ return { restored: named('restore'), deleted: named('delete'), left: decided.flatMap((file) => (file.state === 'changedSince' || file.state === 'tooLarge' ? [{ path: file.path, reason: file.state }] : [])) };
64
+ }
65
+ /** Rewinds the chat to just before `message`; with `files`, kvman's own changes after it go back too. */
66
+ export async function rewindChat(ctx, chat, message, files) {
67
+ const mark = { seq: message.seq, createdAt: message.createdAt };
68
+ await cancelTurn(ctx, chat.id, false);
69
+ const helpers = await stopHelpers(ctx, chat.id, mark);
70
+ const sessions = await treeOf(ctx, chat.id);
71
+ await stopStarted(ctx, sessions, mark);
72
+ const rewound = files ? await rewindFiles(ctx, chat.id, sessions, mark) : { restored: [], deleted: [], left: [] };
73
+ if (!files)
74
+ await keepHelperCopies(ctx, chat.id, helpers);
75
+ await dropRecords(ctx, chat.id, sessions, mark, helpers);
76
+ for (const helper of helpers)
77
+ await deleteSessionTree(ctx, helper);
78
+ return rewound;
79
+ }
80
+ //# sourceMappingURL=rewind-chat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rewind-chat.js","sourceRoot":"","sources":["../../src/rewind/rewind-chat.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { Ctx } from '@kvman/sdk';
2
+ import { type TxRecords } from '../store/collections.ts';
3
+ import { type Mark } from './rewind-target.ts';
4
+ export type FileState = 'restore' | 'delete' | 'changedSince' | 'tooLarge';
5
+ export type FileDecision = {
6
+ path: string;
7
+ state: FileState;
8
+ };
9
+ /** The chat and every session below it. */
10
+ export declare function treeOf(ctx: Ctx, chatId: string): Promise<string[]>;
11
+ /** The files the tree changed after the message, by real path. */
12
+ export declare function changedAfter(ctx: Ctx, sessions: readonly string[], mark: Mark): Promise<string[]>;
13
+ /** What rewinding to the message would do to one file, writing nothing; `undefined` when nothing would change. */
14
+ export declare function decideFile(store: TxRecords, sessions: readonly string[], real: string, mark: Mark, base: string): FileDecision | undefined;
15
+ /** Rewinds one file, with its records, in one transaction. */
16
+ export declare function rewindFile(ctx: Ctx, chatId: string, sessions: readonly string[], real: string, mark: Mark, base: string): Promise<FileDecision | undefined>;
17
+ //# sourceMappingURL=rewind-files.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rewind-files.d.ts","sourceRoot":"","sources":["../../src/rewind/rewind-files.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AAItC,OAAO,EAAsB,KAAK,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAC7E,OAAO,EAAW,KAAK,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAOxD,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,QAAQ,GAAG,cAAc,GAAG,UAAU,CAAC;AAC3E,MAAM,MAAM,YAAY,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,SAAS,CAAA;CAAE,CAAC;AAI9D,2CAA2C;AAC3C,wBAAsB,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAOxE;AAED,kEAAkE;AAClE,wBAAsB,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,SAAS,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAMvG;AAkBD,kHAAkH;AAClH,wBAAgB,UAAU,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAG1I;AA+BD,8DAA8D;AAC9D,wBAAgB,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC,CAW3J"}
@@ -0,0 +1,99 @@
1
+ import { mkdirSync, unlinkSync } from 'node:fs';
2
+ import path from 'node:path';
3
+ import { existing, fingerprintOf, refusal, replace } from "../files/file-change.js";
4
+ import { beforeOf, byOrder, copiesOf, dropCopy } from "../files/file-copies.js";
5
+ import { allDocs } from "../store/all-docs.js";
6
+ import { records, txRecords } from "../store/collections.js";
7
+ import { isAfter } from "./rewind-target.js";
8
+ /** The chat and every session below it. */
9
+ export async function treeOf(ctx, chatId) {
10
+ const found = [chatId];
11
+ for (let index = 0; index < found.length; index += 1) {
12
+ const parent = found[index] ?? '';
13
+ found.push(...(await allDocs((options) => records(ctx.store).sessions.find({ parentId: parent }, options))).map((child) => child.id));
14
+ }
15
+ return found;
16
+ }
17
+ /** The files the tree changed after the message, by real path. */
18
+ export async function changedAfter(ctx, sessions, mark) {
19
+ const paths = new Set();
20
+ for (const sessionId of sessions) {
21
+ for (const copy of await allDocs((options) => records(ctx.store).fileBackups.find({ sessionId }, options)))
22
+ if (isAfter(copy.atSeq, copy.createdAt, mark))
23
+ paths.add(copy.path);
24
+ }
25
+ return [...paths].sort();
26
+ }
27
+ const shownPath = (base, real) => path.relative(base, real).split(path.sep).join('/');
28
+ function planFile(store, sessions, real, mark, base) {
29
+ const after = sessions.flatMap((sessionId) => copiesOf(store, sessionId, real)).filter((copy) => isAfter(copy.atSeq, copy.createdAt, mark)).sort(byOrder);
30
+ const [oldest, newest] = [after[0], after.at(-1)];
31
+ if (oldest === undefined || newest === undefined)
32
+ return undefined;
33
+ const target = beforeOf(store, oldest);
34
+ const found = existing({ shown: shownPath(base, real), real });
35
+ const holdsNewest = newest.written === null ? found === undefined : found !== undefined && fingerprintOf(found.bytes) === newest.written;
36
+ const plan = (state) => ({ state, after, target, mode: found?.mode });
37
+ if (!holdsNewest)
38
+ return plan('changedSince');
39
+ if (target.kind === 'tooLarge')
40
+ return plan('tooLarge');
41
+ if (target.kind === 'absent')
42
+ return plan(found === undefined ? 'none' : 'delete');
43
+ return plan(found !== undefined && found.bytes.equals(target.bytes) ? 'none' : 'restore');
44
+ }
45
+ /** What rewinding to the message would do to one file, writing nothing; `undefined` when nothing would change. */
46
+ export function decideFile(store, sessions, real, mark, base) {
47
+ const planned = planFile(store, sessions, real, mark, base);
48
+ return planned === undefined || planned.state === 'none' ? undefined : { path: shownPath(base, real), state: planned.state };
49
+ }
50
+ // The tree's record of the file in the Changes view follows its newest change left, or goes with the last one.
51
+ function followChanges(store, sessions, chatId, real) {
52
+ const [noted] = store.fileChanges.find({ sessionId: chatId, path: real }, { limit: 1 });
53
+ if (noted === undefined)
54
+ return;
55
+ const newest = sessions.flatMap((sessionId) => copiesOf(store, sessionId, real)).sort(byOrder).at(-1);
56
+ if (newest === undefined)
57
+ store.fileChanges.delete(noted.id);
58
+ else
59
+ store.fileChanges.update(noted.id, { lastAt: newest.createdAt, turnId: newest.turnId });
60
+ }
61
+ // The records taken back go; a change an undo among them had undone counts again.
62
+ function dropAfter(store, after) {
63
+ const dropped = new Set(after.map((copy) => copy.id));
64
+ for (const copy of after) {
65
+ dropCopy(store, copy);
66
+ if (copy.undoes !== null && !dropped.has(copy.undoes) && store.fileBackups.get(copy.undoes) !== undefined)
67
+ store.fileBackups.update(copy.undoes, { undone: false });
68
+ }
69
+ }
70
+ function write(real, planned, jobId) {
71
+ try {
72
+ if (planned.state === 'delete')
73
+ unlinkSync(real);
74
+ if (planned.state !== 'restore' || planned.target.kind !== 'content')
75
+ return;
76
+ mkdirSync(path.dirname(real), { recursive: true });
77
+ }
78
+ catch (error) {
79
+ throw refusal(error);
80
+ }
81
+ replace(real, planned.target.bytes, planned.mode, jobId);
82
+ }
83
+ /** Rewinds one file, with its records, in one transaction. */
84
+ export function rewindFile(ctx, chatId, sessions, real, mark, base) {
85
+ return ctx.store.transaction((tx) => {
86
+ const store = txRecords(tx);
87
+ const planned = planFile(store, sessions, real, mark, base);
88
+ if (planned === undefined)
89
+ return undefined;
90
+ write(real, planned, ctx.job.id);
91
+ dropAfter(store, planned.after);
92
+ for (const sessionId of sessions)
93
+ for (const view of store.fileViews.find({ sessionId, path: real }, { limit: 1 }))
94
+ store.fileViews.delete(view.id);
95
+ followChanges(store, sessions, chatId, real);
96
+ return planned.state === 'none' ? undefined : { path: shownPath(base, real), state: planned.state };
97
+ });
98
+ }
99
+ //# sourceMappingURL=rewind-files.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rewind-files.js","sourceRoot":"","sources":["../../src/rewind/rewind-files.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { Ctx } from '@kvman/sdk';
2
+ import { type Mark } from './rewind-target.ts';
3
+ /** A mark of cleared or collapsed messages, moved back below `seq`. */
4
+ export declare const markBelow: (value: number | null, seq: number) => number | null;
5
+ /** Deletes the chat's records from the message on, and says how many stored messages went. */
6
+ export declare function dropRecords(ctx: Ctx, chatId: string, sessions: readonly string[], mark: Mark, helpers: readonly string[]): Promise<number>;
7
+ //# sourceMappingURL=rewind-records.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rewind-records.d.ts","sourceRoot":"","sources":["../../src/rewind/rewind-records.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAU,MAAM,YAAY,CAAC;AAK9C,OAAO,EAAW,KAAK,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAqDxD,uEAAuE;AACvE,eAAO,MAAM,SAAS,GAAI,OAAO,MAAM,GAAG,IAAI,EAAE,KAAK,MAAM,KAAG,MAAM,GAAG,IAA0E,CAAC;AAElJ,8FAA8F;AAC9F,wBAAgB,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAa1I"}
@@ -0,0 +1,82 @@
1
+ import { now } from "../sessions/session-lookup.js";
2
+ import { txRecords } from "../store/collections.js";
3
+ import { blockOf } from "../turns/history.js";
4
+ import { isAfter } from "./rewind-target.js";
5
+ // The chat's records of a rewind (ADR 0118, 1), in one transaction: the message and every message after it, every
6
+ // queued message, the turns opened after it with their questions, what was made after it (artifacts, the map, the
7
+ // pieces of a long file), the chat's views of files, and the background rows of the helpers that go. The marks of
8
+ // cleared and collapsed messages move back below the message; `nextSeq` stays, so no `seq` is used twice.
9
+ const pageSize = 1000;
10
+ // Every document `find` gives inside the transaction, in pages.
11
+ function everyInTx(find) {
12
+ const found = [];
13
+ for (let page = find(undefined); page.length > 0; page = find(found.at(-1)?.id)) {
14
+ found.push(...page);
15
+ if (page.length < pageSize)
16
+ break;
17
+ }
18
+ return found;
19
+ }
20
+ const paged = (after) => ({ limit: pageSize, ...(after === undefined ? {} : { after }) });
21
+ function dropMessages(store, chat, mark) {
22
+ let removed = 0;
23
+ for (let block = blockOf(mark.seq); block <= blockOf(Math.max(chat.nextSeq - 1, 0)); block += 1) {
24
+ for (const message of store.messages.find({ sessionId: chat.id, block }, { limit: pageSize })) {
25
+ if (message.seq < mark.seq)
26
+ continue;
27
+ store.messages.delete(message.id);
28
+ removed += 1;
29
+ }
30
+ }
31
+ for (const queued of everyInTx((after) => store.queued.find({ sessionId: chat.id }, paged(after))))
32
+ store.queued.delete(queued.id);
33
+ return removed;
34
+ }
35
+ function dropTurns(store, chatId, mark) {
36
+ const gone = new Set();
37
+ for (const turn of everyInTx((after) => store.turns.find({ sessionId: chatId }, paged(after)))) {
38
+ if (!isAfter(turn.atSeq, turn.startedAt, mark))
39
+ continue;
40
+ store.turns.delete(turn.id);
41
+ gone.add(turn.id);
42
+ }
43
+ for (const question of everyInTx((after) => store.questions.find({ sessionId: chatId }, paged(after))))
44
+ if (gone.has(question.turnId))
45
+ store.questions.delete(question.id);
46
+ }
47
+ function dropMade(store, chatId, sessions, mark) {
48
+ for (const artifact of everyInTx((after) => store.artifacts.find({ sessionId: chatId }, paged(after))))
49
+ if (isAfter(artifact.atSeq, artifact.createdAt, mark))
50
+ store.artifacts.delete(artifact.id);
51
+ for (const map of store.maps.find({ sessionId: chatId }, { limit: pageSize }))
52
+ if (isAfter(map.atSeq, map.createdAt, mark))
53
+ store.maps.delete(map.id);
54
+ for (const sessionId of sessions) {
55
+ for (const part of everyInTx((after) => store.fileParts.find({ sessionId }, paged(after))))
56
+ if (isAfter(part.atSeq, part.updatedAt, mark))
57
+ store.fileParts.delete(part.id);
58
+ }
59
+ for (const view of everyInTx((after) => store.fileViews.find({ sessionId: chatId }, paged(after))))
60
+ store.fileViews.delete(view.id);
61
+ }
62
+ /** A mark of cleared or collapsed messages, moved back below `seq`. */
63
+ export const markBelow = (value, seq) => (value === null || value < seq ? value : seq > 0 ? seq - 1 : null);
64
+ /** Deletes the chat's records from the message on, and says how many stored messages went. */
65
+ export function dropRecords(ctx, chatId, sessions, mark, helpers) {
66
+ return ctx.store.transaction((tx) => {
67
+ const store = txRecords(tx);
68
+ const chat = store.sessions.get(chatId);
69
+ if (chat === undefined)
70
+ throw ctx.problem('kvcoder/SESSION_NOT_FOUND', { sessionId: chatId });
71
+ const removed = dropMessages(store, chat, mark);
72
+ dropTurns(store, chatId, mark);
73
+ dropMade(store, chatId, sessions, mark);
74
+ const gone = new Set(helpers);
75
+ for (const row of everyInTx((after) => store.background.find({ sessionId: chatId }, paged(after))))
76
+ if (gone.has(row.ref))
77
+ store.background.delete(row.id);
78
+ store.sessions.update(chatId, { clearedThroughSeq: markBelow(chat.clearedThroughSeq, mark.seq), collapsedThroughSeq: markBelow(chat.collapsedThroughSeq, mark.seq), updatedAt: now() });
79
+ return removed;
80
+ });
81
+ }
82
+ //# sourceMappingURL=rewind-records.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rewind-records.js","sourceRoot":"","sources":["../../src/rewind/rewind-records.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { Ctx, Stored } from '@kvman/sdk';
2
+ import type { MessageDoc, SessionDoc } from '../schemas/records.ts';
3
+ /** The message rewound to: its `seq`, and its time for records from before ADR 0118. */
4
+ export type Mark = {
5
+ seq: number;
6
+ createdAt: string;
7
+ };
8
+ /** Whether a record was made after the message: by its `atSeq`, or for an older record by its time. */
9
+ export declare function isAfter(atSeq: number | null | undefined, at: string, mark: Mark): boolean;
10
+ /** The chat a rewind works on: a top-level session. */
11
+ export declare function rewoundChat(ctx: Ctx, sessionId: string): Promise<Stored<SessionDoc>>;
12
+ /** The message the person typed at `seq`, for an edit. */
13
+ export declare function editedMessage(ctx: Ctx, chat: Stored<SessionDoc>, seq: number): Promise<Stored<MessageDoc>>;
14
+ /** The message at `seq` when it may be edited or undone, for the preview. */
15
+ export declare function rewindableMessage(ctx: Ctx, chat: Stored<SessionDoc>, seq: number): Promise<Stored<MessageDoc>>;
16
+ /** The latest message the person typed or a slash command sent, for an undo. */
17
+ export declare function undoneMessage(ctx: Ctx, chat: Stored<SessionDoc>): Promise<Stored<MessageDoc>>;
18
+ //# sourceMappingURL=rewind-target.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rewind-target.d.ts","sourceRoot":"","sources":["../../src/rewind/rewind-target.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAG9C,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AASpE,wFAAwF;AACxF,MAAM,MAAM,IAAI,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtD,uGAAuG;AACvG,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,OAAO,CAEzF;AAKD,uDAAuD;AACvD,wBAAsB,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAI1F;AAOD,0DAA0D;AAC1D,wBAAsB,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,UAAU,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAIhH;AAED,6EAA6E;AAC7E,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,UAAU,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAIpH;AAED,gFAAgF;AAChF,wBAAsB,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,UAAU,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAMnG"}
@@ -0,0 +1,47 @@
1
+ import { ownerName } from "../jobs/process-records.js";
2
+ import { invalid } from "../problems.js";
3
+ import { ownSession } from "../sessions/session-lookup.js";
4
+ import { records } from "../store/collections.js";
5
+ import { blockOf } from "../turns/history.js";
6
+ import { messagesBefore } from "../turns/message-blocks.js";
7
+ /** Whether a record was made after the message: by its `atSeq`, or for an older record by its time. */
8
+ export function isAfter(atSeq, at, mark) {
9
+ return atSeq === null || atSeq === undefined ? at > mark.createdAt : atSeq > mark.seq;
10
+ }
11
+ const typed = (message) => message.kind === 'user' && message.source?.kind === 'user';
12
+ const undoable = (message) => typed(message) || (message.kind === 'user' && message.source?.kind === 'extension' && message.source.name !== ownerName);
13
+ /** The chat a rewind works on: a top-level session. */
14
+ export async function rewoundChat(ctx, sessionId) {
15
+ const session = await ownSession(ctx, sessionId);
16
+ if (session.parentId !== null)
17
+ throw invalid("A helper's chat is for reading; edit or undo in its chat.", { sessionId });
18
+ return session;
19
+ }
20
+ async function messageAt(ctx, chat, seq) {
21
+ const block = await records(ctx.store).messages.find({ sessionId: chat.id, block: blockOf(seq) }, { limit: 1000 });
22
+ return block.find((message) => message.seq === seq);
23
+ }
24
+ /** The message the person typed at `seq`, for an edit. */
25
+ export async function editedMessage(ctx, chat, seq) {
26
+ const message = await messageAt(ctx, chat, seq);
27
+ if (message === undefined || !typed(message))
28
+ throw invalid(`Message ${String(seq)} isn't one the person typed in this chat, so it can't be edited.`, { seq });
29
+ return message;
30
+ }
31
+ /** The message at `seq` when it may be edited or undone, for the preview. */
32
+ export async function rewindableMessage(ctx, chat, seq) {
33
+ const message = await messageAt(ctx, chat, seq);
34
+ if (message === undefined || !undoable(message))
35
+ throw invalid(`Message ${String(seq)} isn't one the person or a slash command sent in this chat.`, { seq });
36
+ return message;
37
+ }
38
+ /** The latest message the person typed or a slash command sent, for an undo. */
39
+ export async function undoneMessage(ctx, chat) {
40
+ for (let page = await messagesBefore(ctx, chat.id, 200, chat.nextSeq); page.length > 0; page = await messagesBefore(ctx, chat.id, 200, page[0]?.seq ?? 0)) {
41
+ const found = page.findLast(undoable);
42
+ if (found !== undefined)
43
+ return found;
44
+ }
45
+ throw invalid('This chat has no message to undo.', { sessionId: chat.id });
46
+ }
47
+ //# sourceMappingURL=rewind-target.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rewind-target.js","sourceRoot":"","sources":["../../src/rewind/rewind-target.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ import { z } from '@kvman/sdk';
2
+ declare const atSeq: z.ZodDefault<z.ZodNullable<z.ZodNumber>>;
3
+ export declare const fileViewDocSchema: z.ZodObject<{
4
+ sessionId: z.ZodString;
5
+ path: z.ZodString;
6
+ fingerprint: z.ZodString;
7
+ updatedAt: z.ZodISODateTime;
8
+ }, z.core.$strip>;
9
+ export declare const fileChangeDocSchema: z.ZodObject<{
10
+ sessionId: z.ZodString;
11
+ path: z.ZodString;
12
+ firstAt: z.ZodISODateTime;
13
+ lastAt: z.ZodISODateTime;
14
+ turnId: z.ZodDefault<z.ZodNullable<z.ZodString>>;
15
+ }, z.core.$strip>;
16
+ export declare const fileBackupDocSchema: z.ZodObject<{
17
+ sessionId: z.ZodString;
18
+ path: z.ZodString;
19
+ previous: z.ZodNullable<z.ZodString>;
20
+ kept: z.ZodDefault<z.ZodNullable<z.ZodString>>;
21
+ written: z.ZodNullable<z.ZodString>;
22
+ tooLarge: z.ZodDefault<z.ZodBoolean>;
23
+ atSeq: z.ZodDefault<z.ZodNullable<z.ZodNumber>>;
24
+ order: z.ZodDefault<z.ZodNullable<z.ZodNumber>>;
25
+ turnId: z.ZodDefault<z.ZodNullable<z.ZodString>>;
26
+ undoes: z.ZodDefault<z.ZodNullable<z.ZodString>>;
27
+ undone: z.ZodDefault<z.ZodBoolean>;
28
+ createdAt: z.ZodISODateTime;
29
+ }, z.core.$strip>;
30
+ export declare const fileCopyDocSchema: z.ZodObject<{
31
+ sessionId: z.ZodString;
32
+ content: z.ZodString;
33
+ }, z.core.$strip>;
34
+ export declare const filePartDocSchema: z.ZodObject<{
35
+ sessionId: z.ZodString;
36
+ path: z.ZodString;
37
+ part: z.ZodNumber;
38
+ content: z.ZodString;
39
+ atSeq: z.ZodDefault<z.ZodNullable<z.ZodNumber>>;
40
+ updatedAt: z.ZodISODateTime;
41
+ }, z.core.$strip>;
42
+ export { atSeq as atSeqSchema };
43
+ export type FileViewDoc = z.output<typeof fileViewDocSchema>;
44
+ export type FileChangeDoc = z.output<typeof fileChangeDocSchema>;
45
+ export type FileBackupDoc = z.output<typeof fileBackupDocSchema>;
46
+ //# sourceMappingURL=file-records.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-records.d.ts","sourceRoot":"","sources":["../../src/schemas/file-records.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,YAAY,CAAC;AAO/B,QAAA,MAAM,KAAK,0CAA0D,CAAC;AAEtE,eAAO,MAAM,iBAAiB;;;;;iBAAkG,CAAC;AAIjI,eAAO,MAAM,mBAAmB;;;;;;iBAA0J,CAAC;AAM3L,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;iBAa9B,CAAC;AAGH,eAAO,MAAM,iBAAiB;;;iBAA2D,CAAC;AAG1F,eAAO,MAAM,iBAAiB;;;;;;;iBAAgJ,CAAC;AAE/K,OAAO,EAAE,KAAK,IAAI,WAAW,EAAE,CAAC;AAEhC,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAC7D,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,mBAAmB,CAAC,CAAC;AACjE,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,mBAAmB,CAAC,CAAC"}
@@ -0,0 +1,34 @@
1
+ import { z } from '@kvman/sdk';
2
+ // What a chat knows of the files it changes (plan 08 §8.5): what it last saw of a file, the files it changed, a copy of
3
+ // each change, and the pieces of a long file it is writing (ADR 0053, 2 and 4; ADR 0093, 2; ADR 0118, 3 and 4).
4
+ const fingerprint = z.string().regex(/^[0-9a-f]{64}$/);
5
+ // The chat's `nextSeq` when a record was made, which tells what came after a message (ADR 0118, 4); none before it.
6
+ const atSeq = z.number().int().nonnegative().nullable().default(null);
7
+ export const fileViewDocSchema = z.object({ sessionId: z.string(), path: z.string(), fingerprint, updatedAt: z.iso.datetime() });
8
+ // A file a chat changed with `fs`, under the chat at the root, for its Changes view (ADR 0093, 2).
9
+ // `turnId` is the root chat's turn of the latest change (ADR 0102, 9); records from before it read `null`.
10
+ export const fileChangeDocSchema = z.object({ sessionId: z.string(), path: z.string(), firstAt: z.iso.datetime(), lastAt: z.iso.datetime(), turnId: z.string().nullable().default(null) });
11
+ // One change: what the file held before it and the fingerprint after it (`null` when it removed the file). The content
12
+ // before is in `file-copies` under `kept` (inline as `previous` in records from before ADR 0118); with neither, and not
13
+ // `tooLarge` (over 1 MB, so none was kept), the file didn't exist. `order` is the chat's change counter; an undo's own
14
+ // record names the record it undid in `undoes`, and that one is `undone`.
15
+ export const fileBackupDocSchema = z.object({
16
+ sessionId: z.string(),
17
+ path: z.string(),
18
+ previous: z.string().nullable(),
19
+ kept: z.string().nullable().default(null),
20
+ written: fingerprint.nullable(),
21
+ tooLarge: z.boolean().default(false),
22
+ atSeq,
23
+ order: z.number().int().nonnegative().nullable().default(null),
24
+ turnId: z.string().nullable().default(null),
25
+ undoes: z.string().nullable().default(null),
26
+ undone: z.boolean().default(false),
27
+ createdAt: z.iso.datetime(),
28
+ });
29
+ // The content a change replaced, base64, apart from its record so a chat's records read light (ADR 0118, 3).
30
+ export const fileCopyDocSchema = z.object({ sessionId: z.string(), content: z.string() });
31
+ // One numbered piece of a long file a chat is writing, held until `fs assemble` (ADR 0054, 2).
32
+ export const filePartDocSchema = z.object({ sessionId: z.string(), path: z.string(), part: z.number().int().min(1), content: z.string(), atSeq, updatedAt: z.iso.datetime() });
33
+ export { atSeq as atSeqSchema };
34
+ //# sourceMappingURL=file-records.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-records.js","sourceRoot":"","sources":["../../src/schemas/file-records.ts"],"names":[],"mappings":"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"}
@@ -17,6 +17,8 @@ export declare const processDocSchema: z.ZodObject<{
17
17
  reported: z.ZodBoolean;
18
18
  starting: z.ZodExactOptional<z.ZodBoolean>;
19
19
  notify: z.ZodExactOptional<z.ZodBoolean>;
20
+ atSeq: z.ZodExactOptional<z.ZodNumber>;
21
+ quiet: z.ZodExactOptional<z.ZodBoolean>;
20
22
  }, z.core.$strip>;
21
23
  export type ProcessDoc = z.output<typeof processDocSchema>;
22
24
  //# sourceMappingURL=process-doc.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"process-doc.d.ts","sourceRoot":"","sources":["../../src/schemas/process-doc.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,YAAY,CAAC;AAK/B,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;iBAc3B,CAAC;AAGH,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,gBAAgB,CAAC,CAAC"}
1
+ {"version":3,"file":"process-doc.d.ts","sourceRoot":"","sources":["../../src/schemas/process-doc.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,YAAY,CAAC;AAK/B,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;iBAiB3B,CAAC;AAGH,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,gBAAgB,CAAC,CAAC"}
@@ -16,5 +16,8 @@ export const processDocSchema = z.object({
16
16
  starting: z.boolean().exactOptional(),
17
17
  /** Started with `notify: true`: its watcher, not the exit handler, reports its end (ADR 0108, 16). */
18
18
  notify: z.boolean().exactOptional(),
19
+ /** The chat's `nextSeq` when it started, and, once a rewind went back past that, `quiet`: its end is never told (ADR 0118, 1). */
20
+ atSeq: z.number().int().nonnegative().exactOptional(),
21
+ quiet: z.boolean().exactOptional(),
19
22
  });
20
23
  //# sourceMappingURL=process-doc.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"process-doc.js","sourceRoot":"","sources":["../../src/schemas/process-doc.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,YAAY,CAAC;AAE/B,0HAA0H;AAC1H,sHAAsH;AACtH,sCAAsC;AACtC,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;IACvB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;IACrB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;IACjB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;IACrB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,aAAa,EAAE;IACnC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,aAAa,EAAE;IACzE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,aAAa,EAAE;IACrD,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,aAAa,EAAE;IAC7C,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE;IACrB,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,aAAa,EAAE;IACrC,sGAAsG;IACtG,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,aAAa,EAAE;CACpC,CAAC,CAAC"}
1
+ {"version":3,"file":"process-doc.js","sourceRoot":"","sources":["../../src/schemas/process-doc.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,YAAY,CAAC;AAE/B,0HAA0H;AAC1H,sHAAsH;AACtH,sCAAsC;AACtC,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;IACvB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;IACrB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;IACjB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;IACrB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,aAAa,EAAE;IACnC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,aAAa,EAAE;IACzE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,aAAa,EAAE;IACrD,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,aAAa,EAAE;IAC7C,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE;IACrB,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,aAAa,EAAE;IACrC,sGAAsG;IACtG,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,aAAa,EAAE;IACnC,kIAAkI;IAClI,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,aAAa,EAAE;IACrD,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,aAAa,EAAE;CACnC,CAAC,CAAC"}
@@ -1,6 +1,7 @@
1
1
  import { z } from '@kvman/sdk';
2
2
  import type { JsonValue } from '../connector-call.ts';
3
3
  export { processDocSchema, type ProcessDoc } from './process-doc.ts';
4
+ export { fileBackupDocSchema, fileChangeDocSchema, fileCopyDocSchema, filePartDocSchema, fileViewDocSchema, type FileBackupDoc, type FileChangeDoc } from './file-records.ts';
4
5
  export type { JsonValue };
5
6
  /** How hard the model thinks, as kvai takes it (ADR 0087, 11). */
6
7
  export declare const thinkingSchema: z.ZodEnum<{
@@ -176,6 +177,8 @@ export declare const sessionDocSchema: z.ZodObject<{
176
177
  content: z.ZodString;
177
178
  told: z.ZodNullable<z.ZodString>;
178
179
  }, z.core.$strip>>>;
180
+ changes: z.ZodDefault<z.ZodNumber>;
181
+ atSeq: z.ZodDefault<z.ZodNullable<z.ZodNumber>>;
179
182
  createdAt: z.ZodString;
180
183
  updatedAt: z.ZodString;
181
184
  }, z.core.$strip>;
@@ -363,6 +366,7 @@ export declare const turnDocSchema: z.ZodObject<{
363
366
  }, z.core.$strict>;
364
367
  }, z.core.$strip>>>;
365
368
  connectionWaits: z.ZodDefault<z.ZodNumber>;
369
+ atSeq: z.ZodDefault<z.ZodNullable<z.ZodNumber>>;
366
370
  }, z.core.$strip>;
367
371
  export declare const questionDocSchema: z.ZodObject<{
368
372
  sessionId: z.ZodString;
@@ -394,33 +398,6 @@ export declare const answerReceiptDocSchema: z.ZodObject<{
394
398
  answerFingerprint: z.ZodString;
395
399
  createdAt: z.ZodISODateTime;
396
400
  }, z.core.$strip>;
397
- export declare const fileViewDocSchema: z.ZodObject<{
398
- sessionId: z.ZodString;
399
- path: z.ZodString;
400
- fingerprint: z.ZodString;
401
- updatedAt: z.ZodISODateTime;
402
- }, z.core.$strip>;
403
- export declare const fileChangeDocSchema: z.ZodObject<{
404
- sessionId: z.ZodString;
405
- path: z.ZodString;
406
- firstAt: z.ZodISODateTime;
407
- lastAt: z.ZodISODateTime;
408
- turnId: z.ZodDefault<z.ZodNullable<z.ZodString>>;
409
- }, z.core.$strip>;
410
- export declare const fileBackupDocSchema: z.ZodObject<{
411
- sessionId: z.ZodString;
412
- path: z.ZodString;
413
- previous: z.ZodNullable<z.ZodString>;
414
- written: z.ZodString;
415
- createdAt: z.ZodISODateTime;
416
- }, z.core.$strip>;
417
- export declare const filePartDocSchema: z.ZodObject<{
418
- sessionId: z.ZodString;
419
- path: z.ZodString;
420
- part: z.ZodNumber;
421
- content: z.ZodString;
422
- updatedAt: z.ZodISODateTime;
423
- }, z.core.$strip>;
424
401
  export declare const sendReceiptDocSchema: z.ZodObject<{
425
402
  sendId: z.ZodString;
426
403
  sessionId: z.ZodString;
@@ -486,6 +463,7 @@ export declare const runDocSchema: z.ZodObject<{
486
463
  paths: z.ZodNumber;
487
464
  restored: z.ZodBoolean;
488
465
  }, z.core.$strip>>>;
466
+ atSeq: z.ZodDefault<z.ZodNullable<z.ZodNumber>>;
489
467
  }, z.core.$strip>;
490
468
  export declare const artifactDocSchema: z.ZodObject<{
491
469
  sessionId: z.ZodString;
@@ -498,6 +476,7 @@ export declare const artifactDocSchema: z.ZodObject<{
498
476
  }>;
499
477
  content: z.ZodString;
500
478
  version: z.ZodNumber;
479
+ atSeq: z.ZodDefault<z.ZodNullable<z.ZodNumber>>;
501
480
  createdAt: z.ZodString;
502
481
  updatedAt: z.ZodString;
503
482
  }, z.core.$strip>;
@@ -506,7 +485,6 @@ export type StepIntentDoc = z.output<typeof stepIntentDocSchema>;
506
485
  export type MessageDoc = z.output<typeof messageDocSchema>;
507
486
  export type QueuedDoc = z.output<typeof queuedDocSchema>;
508
487
  export type TurnDoc = z.output<typeof turnDocSchema>;
509
- export type FileChangeDoc = z.output<typeof fileChangeDocSchema>;
510
488
  export type Pending = z.output<typeof pendingSchema>;
511
489
  export type HeldResult = z.output<typeof heldResultSchema>;
512
490
  export type RunCallDoc = z.output<typeof runCallSchema>;