@kvman/kvcoder 0.1.21 → 0.1.23

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 (148) hide show
  1. package/dist/api.d.ts +48 -0
  2. package/dist/api.d.ts.map +1 -1
  3. package/dist/connector-call.d.ts.map +1 -1
  4. package/dist/connector-call.js +17 -2
  5. package/dist/connector-call.js.map +1 -1
  6. package/dist/connectors/artifact.d.ts.map +1 -1
  7. package/dist/connectors/artifact.js +4 -2
  8. package/dist/connectors/artifact.js.map +1 -1
  9. package/dist/connectors/delegate.d.ts.map +1 -1
  10. package/dist/connectors/delegate.js +3 -0
  11. package/dist/connectors/delegate.js.map +1 -1
  12. package/dist/connectors/execution-map.d.ts.map +1 -1
  13. package/dist/connectors/execution-map.js +2 -1
  14. package/dist/connectors/execution-map.js.map +1 -1
  15. package/dist/delegate/permission.d.ts +5 -0
  16. package/dist/delegate/permission.d.ts.map +1 -1
  17. package/dist/delegate/program-permission.d.ts +1 -0
  18. package/dist/delegate/program-permission.d.ts.map +1 -1
  19. package/dist/delegate/runs.d.ts.map +1 -1
  20. package/dist/delegate/runs.js +2 -1
  21. package/dist/delegate/runs.js.map +1 -1
  22. package/dist/files/change-fence.d.ts +5 -0
  23. package/dist/files/change-fence.d.ts.map +1 -0
  24. package/dist/files/change-fence.js +17 -0
  25. package/dist/files/change-fence.js.map +1 -0
  26. package/dist/files/file-change.d.ts +10 -4
  27. package/dist/files/file-change.d.ts.map +1 -1
  28. package/dist/files/file-change.js +19 -21
  29. package/dist/files/file-change.js.map +1 -1
  30. package/dist/files/file-copies.d.ts +31 -0
  31. package/dist/files/file-copies.d.ts.map +1 -0
  32. package/dist/files/file-copies.js +59 -0
  33. package/dist/files/file-copies.js.map +1 -0
  34. package/dist/files/file-parts.d.ts.map +1 -1
  35. package/dist/files/file-parts.js +4 -2
  36. package/dist/files/file-parts.js.map +1 -1
  37. package/dist/files/register-changes.d.ts.map +1 -1
  38. package/dist/files/register-changes.js +19 -7
  39. package/dist/files/register-changes.js.map +1 -1
  40. package/dist/index.d.ts.map +1 -1
  41. package/dist/index.js +2 -0
  42. package/dist/index.js.map +1 -1
  43. package/dist/jobs/notify-watch.d.ts.map +1 -1
  44. package/dist/jobs/notify-watch.js +3 -2
  45. package/dist/jobs/notify-watch.js.map +1 -1
  46. package/dist/jobs/process-handlers.d.ts.map +1 -1
  47. package/dist/jobs/process-handlers.js +7 -3
  48. package/dist/jobs/process-handlers.js.map +1 -1
  49. package/dist/jobs/process-report.d.ts.map +1 -1
  50. package/dist/jobs/process-report.js +7 -2
  51. package/dist/jobs/process-report.js.map +1 -1
  52. package/dist/jobs/process-run.d.ts.map +1 -1
  53. package/dist/jobs/process-run.js +6 -2
  54. package/dist/jobs/process-run.js.map +1 -1
  55. package/dist/maps/map-schema.d.ts +1 -0
  56. package/dist/maps/map-schema.d.ts.map +1 -1
  57. package/dist/maps/map-schema.js +3 -0
  58. package/dist/maps/map-schema.js.map +1 -1
  59. package/dist/messages/attachments.d.ts +7 -0
  60. package/dist/messages/attachments.d.ts.map +1 -1
  61. package/dist/messages/attachments.js +29 -1
  62. package/dist/messages/attachments.js.map +1 -1
  63. package/dist/messages/receive-message.d.ts +1 -0
  64. package/dist/messages/receive-message.d.ts.map +1 -1
  65. package/dist/messages/receive-message.js +4 -3
  66. package/dist/messages/receive-message.js.map +1 -1
  67. package/dist/messages/register-messages.js +3 -3
  68. package/dist/messages/register-messages.js.map +1 -1
  69. package/dist/messages/send-receipt.d.ts +1 -1
  70. package/dist/messages/send-receipt.d.ts.map +1 -1
  71. package/dist/messages/send-receipt.js +4 -2
  72. package/dist/messages/send-receipt.js.map +1 -1
  73. package/dist/prompt/build-prompt.d.ts +5 -0
  74. package/dist/prompt/build-prompt.d.ts.map +1 -1
  75. package/dist/prompt/build-prompt.js +7 -0
  76. package/dist/prompt/build-prompt.js.map +1 -1
  77. package/dist/prompt/session-grants.d.ts +2 -0
  78. package/dist/prompt/session-grants.d.ts.map +1 -1
  79. package/dist/prompt/session-prompt.d.ts.map +1 -1
  80. package/dist/prompt/session-prompt.js +5 -1
  81. package/dist/prompt/session-prompt.js.map +1 -1
  82. package/dist/registry/register-slash-commands.d.ts +5 -0
  83. package/dist/registry/register-slash-commands.d.ts.map +1 -1
  84. package/dist/registry/register-slash-commands.js +23 -3
  85. package/dist/registry/register-slash-commands.js.map +1 -1
  86. package/dist/rewind/chat-mark.d.ts +4 -0
  87. package/dist/rewind/chat-mark.d.ts.map +1 -0
  88. package/dist/rewind/chat-mark.js +8 -0
  89. package/dist/rewind/chat-mark.js.map +1 -0
  90. package/dist/rewind/register-rewind.d.ts +3 -0
  91. package/dist/rewind/register-rewind.d.ts.map +1 -0
  92. package/dist/rewind/register-rewind.js +88 -0
  93. package/dist/rewind/register-rewind.js.map +1 -0
  94. package/dist/rewind/rewind-chat.d.ts +13 -0
  95. package/dist/rewind/rewind-chat.d.ts.map +1 -0
  96. package/dist/rewind/rewind-chat.js +80 -0
  97. package/dist/rewind/rewind-chat.js.map +1 -0
  98. package/dist/rewind/rewind-files.d.ts +17 -0
  99. package/dist/rewind/rewind-files.d.ts.map +1 -0
  100. package/dist/rewind/rewind-files.js +99 -0
  101. package/dist/rewind/rewind-files.js.map +1 -0
  102. package/dist/rewind/rewind-records.d.ts +7 -0
  103. package/dist/rewind/rewind-records.d.ts.map +1 -0
  104. package/dist/rewind/rewind-records.js +82 -0
  105. package/dist/rewind/rewind-records.js.map +1 -0
  106. package/dist/rewind/rewind-target.d.ts +18 -0
  107. package/dist/rewind/rewind-target.d.ts.map +1 -0
  108. package/dist/rewind/rewind-target.js +47 -0
  109. package/dist/rewind/rewind-target.js.map +1 -0
  110. package/dist/schemas/file-records.d.ts +46 -0
  111. package/dist/schemas/file-records.d.ts.map +1 -0
  112. package/dist/schemas/file-records.js +34 -0
  113. package/dist/schemas/file-records.js.map +1 -0
  114. package/dist/schemas/process-doc.d.ts +2 -0
  115. package/dist/schemas/process-doc.d.ts.map +1 -1
  116. package/dist/schemas/process-doc.js +3 -0
  117. package/dist/schemas/process-doc.js.map +1 -1
  118. package/dist/schemas/records.d.ts +6 -28
  119. package/dist/schemas/records.d.ts.map +1 -1
  120. package/dist/schemas/records.js +10 -8
  121. package/dist/schemas/records.js.map +1 -1
  122. package/dist/schemas/registry.d.ts +2 -1
  123. package/dist/schemas/registry.d.ts.map +1 -1
  124. package/dist/schemas/registry.js +2 -2
  125. package/dist/schemas/registry.js.map +1 -1
  126. package/dist/sessions/new-session.d.ts.map +1 -1
  127. package/dist/sessions/new-session.js +3 -1
  128. package/dist/sessions/new-session.js.map +1 -1
  129. package/dist/store/collections.d.ts +44 -2
  130. package/dist/store/collections.d.ts.map +1 -1
  131. package/dist/store/collections.js +3 -1
  132. package/dist/store/collections.js.map +1 -1
  133. package/dist/turns/start-turn.d.ts.map +1 -1
  134. package/dist/turns/start-turn.js +2 -1
  135. package/dist/turns/start-turn.js.map +1 -1
  136. package/dist/web/components/approval.css +1 -1
  137. package/dist/web/components/call.css +1 -1
  138. package/dist/web/components/connectors.css +1 -1
  139. package/dist/web/components/conversation.css +1 -1
  140. package/dist/web/components/conversation.js +2479 -2079
  141. package/dist/web/components/mcp-sign-in.css +1 -1
  142. package/dist/web/components/model.css +1 -1
  143. package/dist/web/components/preferences.css +1 -1
  144. package/dist/web/components/question.css +1 -1
  145. package/dist/web/components/sessions.css +1 -1
  146. package/locales/ar.json +16 -0
  147. package/locales/en.json +16 -0
  148. package/package.json +10 -1
@@ -1 +1 @@
1
- {"version":3,"file":"register-slash-commands.js","sourceRoot":"","sources":["../../src/registry/register-slash-commands.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"register-slash-commands.js","sourceRoot":"","sources":["../../src/registry/register-slash-commands.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { TxRecords } from '../store/collections.ts';
2
+ /** The `nextSeq` of the chat at the root of `sessionId`, or `null` when its chat is gone or being deleted. */
3
+ export declare function chatSeqInTx(store: TxRecords, sessionId: string): number | null;
4
+ //# sourceMappingURL=chat-mark.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-mark.d.ts","sourceRoot":"","sources":["../../src/rewind/chat-mark.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAMzD,8GAA8G;AAC9G,wBAAgB,WAAW,CAAC,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAE9E"}
@@ -0,0 +1,8 @@
1
+ import { executionRootInTx } from "../sessions/execution-root.js";
2
+ // What came after a message (ADR 0118, 4): a record keeps its chat's `nextSeq` from the transaction that made it, so one
3
+ // made after the message has `atSeq` above the message's `seq`, whatever the clocks say.
4
+ /** The `nextSeq` of the chat at the root of `sessionId`, or `null` when its chat is gone or being deleted. */
5
+ export function chatSeqInTx(store, sessionId) {
6
+ return executionRootInTx(store, sessionId)?.nextSeq ?? null;
7
+ }
8
+ //# sourceMappingURL=chat-mark.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-mark.js","sourceRoot":"","sources":["../../src/rewind/chat-mark.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAElE,yHAAyH;AACzH,yFAAyF;AAEzF,8GAA8G;AAC9G,MAAM,UAAU,WAAW,CAAC,KAAgB,EAAE,SAAiB;IAC7D,OAAO,iBAAiB,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE,OAAO,IAAI,IAAI,CAAC;AAC9D,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { type Ctx } from '@kvman/sdk';
2
+ export declare function registerRewind(ctx: Ctx): void;
3
+ //# sourceMappingURL=register-rewind.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register-rewind.d.ts","sourceRoot":"","sources":["../../src/rewind/register-rewind.ts"],"names":[],"mappings":"AACA,OAAO,EAAK,KAAK,GAAG,EAAe,MAAM,YAAY,CAAC;AAsCtD,wBAAgB,cAAc,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI,CAkD7C"}
@@ -0,0 +1,88 @@
1
+ import { realpath } from 'node:fs/promises';
2
+ import { z } from '@kvman/sdk';
3
+ import { splitAttachments } from "../messages/attachments.js";
4
+ import { receiveMessage } from "../messages/receive-message.js";
5
+ import { acknowledged, sentBy } from "../messages/send-receipt.js";
6
+ import { invalid } from "../problems.js";
7
+ import { ownSession, userOnly } from "../sessions/session-lookup.js";
8
+ import { records, txRecords } from "../store/collections.js";
9
+ import { blockOf } from "../turns/history.js";
10
+ import { textOf } from "../turns/model-context.js";
11
+ import { rewindChat } from "./rewind-chat.js";
12
+ import { changedAfter, decideFile, treeOf } from "./rewind-files.js";
13
+ import { editedMessage, rewindableMessage, rewoundChat, undoneMessage } from "./rewind-target.js";
14
+ // Editing and undoing a message (plan 08 §8.6, ADR 0118, 6): the preview of what a rewind would do to files, the edit
15
+ // that rewinds and sends in its place, and the undo that rewinds and gives the message back for the send box.
16
+ const leftSchema = z.object({ path: z.string(), reason: z.enum(['changedSince', 'tooLarge']) });
17
+ const rewoundShape = { restored: z.array(z.string()), deleted: z.array(z.string()), left: z.array(leftSchema) };
18
+ const markOf = (message) => ({ seq: message.seq, createdAt: message.createdAt });
19
+ // The stored messages from the message on, by block (a block holds at most 500), and the queued ones.
20
+ async function removedCount(ctx, chat, seq) {
21
+ const store = records(ctx.store);
22
+ const first = (await store.messages.find({ sessionId: chat.id, block: blockOf(seq) }, { limit: 1000 })).filter((message) => message.seq >= seq).length;
23
+ let later = 0;
24
+ for (let block = blockOf(seq) + 1; block <= blockOf(Math.max(chat.nextSeq - 1, 0)); block += 1)
25
+ later += await store.messages.count({ sessionId: chat.id, block });
26
+ return first + later + (await store.queued.count({ sessionId: chat.id }));
27
+ }
28
+ // What an edit may keep of the message: its own images and attached files, never new ones.
29
+ function requireKept(message, fileIds, attachments) {
30
+ const images = message.fileIds ?? [];
31
+ const saved = splitAttachments(textOf(message.content['content'])).saved;
32
+ const added = [...fileIds.filter((id) => !images.includes(id)), ...attachments.filter((name) => !saved.includes(name))];
33
+ if (added.length > 0)
34
+ throw invalid(`An edit keeps the message's own files and adds none: ${added.join(', ')}.`, { files: added });
35
+ }
36
+ export function registerRewind(ctx) {
37
+ ctx.registerQuery('kvcoder.rewind.files.list', {
38
+ description: "Lists what rewinding a chat to just before a message would do to the files kvman changed after it, how many messages would go, and whether the chat is busy; changes nothing.",
39
+ input: z.object({ sessionId: z.string(), seq: z.number().int().nonnegative() }),
40
+ output: z.object({ files: z.array(z.object({ path: z.string(), state: z.enum(['restore', 'delete', 'changedSince', 'tooLarge']) })), messages: z.number().int(), running: z.boolean() }),
41
+ public: true,
42
+ handle: async ({ sessionId, seq }) => {
43
+ userOnly(ctx, 'kvcoder.rewind.files.list');
44
+ const chat = await rewoundChat(ctx, sessionId);
45
+ const mark = markOf(await rewindableMessage(ctx, chat, seq));
46
+ const sessions = await treeOf(ctx, chat.id);
47
+ const base = await realpath(ctx.job.workspace.path);
48
+ const paths = await changedAfter(ctx, sessions, mark);
49
+ const files = await ctx.store.transaction((tx) => paths.flatMap((real) => decideFile(txRecords(tx), sessions, real, mark, base) ?? []));
50
+ return { files: files.sort((first, second) => first.path.localeCompare(second.path)), messages: await removedCount(ctx, chat, seq), running: chat.status !== 'idle' };
51
+ },
52
+ });
53
+ ctx.registerCommand('kvcoder.message.edit', {
54
+ description: "Rewinds a chat to just before a message the person typed, with kvman's file changes after it when files is true, and sends the new text in its place.",
55
+ input: z.object({ sessionId: z.string(), seq: z.number().int().nonnegative(), text: z.string().min(1), fileIds: z.array(z.string()).exactOptional(), attachments: z.array(z.string().min(1)).exactOptional(), files: z.boolean(), sendId: z.string().min(1).max(100).exactOptional() }),
56
+ output: z.object(rewoundShape),
57
+ public: true,
58
+ retries: 0,
59
+ handle: async ({ sessionId, seq, text, fileIds, attachments, files, sendId }) => {
60
+ userOnly(ctx, 'kvcoder.message.edit');
61
+ const chat = await rewoundChat(ctx, sessionId);
62
+ // A repeat is known by its receipt before anything is rewound (ADR 0048).
63
+ if (sendId !== undefined && acknowledged((await records(ctx.store).sendReceipts.find({ sendId }, { limit: 1 }))[0], sentBy(sendId, chat.id, text, fileIds ?? [], attachments ?? [])))
64
+ return { restored: [], deleted: [], left: [] };
65
+ const message = await editedMessage(ctx, chat, seq);
66
+ requireKept(message, fileIds ?? [], attachments ?? []);
67
+ const rewound = await rewindChat(ctx, chat, message, files);
68
+ await receiveMessage(ctx, await ownSession(ctx, chat.id), { text, fileIds: fileIds ?? [], attachments, source: { kind: 'user' }, mayStart: true, sendId }, true);
69
+ return rewound;
70
+ },
71
+ });
72
+ ctx.registerCommand('kvcoder.message.undo', {
73
+ description: "Rewinds a chat to just before its latest message the person typed or a slash command sent, with kvman's file changes after it when files is true, and returns that message for the send box.",
74
+ input: z.object({ sessionId: z.string(), files: z.boolean() }),
75
+ output: z.object({ text: z.string(), fileIds: z.array(z.string()), fileNames: z.array(z.string()), attachments: z.array(z.string()), ...rewoundShape }),
76
+ public: true,
77
+ retries: 0,
78
+ handle: async ({ sessionId, files }) => {
79
+ userOnly(ctx, 'kvcoder.message.undo');
80
+ const chat = await rewoundChat(ctx, sessionId);
81
+ const message = await undoneMessage(ctx, chat);
82
+ const { typed, saved } = splitAttachments(textOf(message.content['content']));
83
+ const rewound = await rewindChat(ctx, chat, message, files);
84
+ return { text: typed, fileIds: message.fileIds ?? [], fileNames: message.fileNames ?? [], attachments: saved, ...rewound };
85
+ },
86
+ });
87
+ }
88
+ //# sourceMappingURL=register-rewind.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register-rewind.js","sourceRoot":"","sources":["../../src/rewind/register-rewind.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { Ctx, Stored } from '@kvman/sdk';
2
+ import type { MessageDoc, SessionDoc } from '../schemas/records.ts';
3
+ export type Rewound = {
4
+ restored: string[];
5
+ deleted: string[];
6
+ left: {
7
+ path: string;
8
+ reason: 'changedSince' | 'tooLarge';
9
+ }[];
10
+ };
11
+ /** Rewinds the chat to just before `message`; with `files`, kvman's own changes after it go back too. */
12
+ export declare function rewindChat(ctx: Ctx, chat: Stored<SessionDoc>, message: Stored<MessageDoc>, files: boolean): Promise<Rewound>;
13
+ //# sourceMappingURL=rewind-chat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rewind-chat.d.ts","sourceRoot":"","sources":["../../src/rewind/rewind-chat.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAE9C,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAapE,MAAM,MAAM,OAAO,GAAG;IAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,cAAc,GAAG,UAAU,CAAA;KAAE,EAAE,CAAA;CAAE,CAAC;AAuD/H,yGAAyG;AACzG,wBAAsB,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,UAAU,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAWlI"}
@@ -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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"}