aicodeman 1.47.0 → 1.48.0
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/README.md +3 -0
- package/dist/cli-notify.d.ts +34 -0
- package/dist/cli-notify.d.ts.map +1 -0
- package/dist/cli-notify.js +100 -0
- package/dist/cli-notify.js.map +1 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +16 -0
- package/dist/cli.js.map +1 -1
- package/dist/config/cli-registry/patterns.d.ts +1 -1
- package/dist/config/cli-registry/patterns.d.ts.map +1 -1
- package/dist/config/cli-registry/patterns.js +4 -0
- package/dist/config/cli-registry/patterns.js.map +1 -1
- package/dist/config/cli-registry/schema.d.ts +6 -0
- package/dist/config/cli-registry/schema.d.ts.map +1 -1
- package/dist/config/cli-registry/schema.js +62 -2
- package/dist/config/cli-registry/schema.js.map +1 -1
- package/dist/config/cli-registry/stock.d.ts.map +1 -1
- package/dist/config/cli-registry/stock.js +43 -26
- package/dist/config/cli-registry/stock.js.map +1 -1
- package/dist/config/cli-registry/types.d.ts +47 -17
- package/dist/config/cli-registry/types.d.ts.map +1 -1
- package/dist/config/path-probe.d.ts +6 -0
- package/dist/config/path-probe.d.ts.map +1 -1
- package/dist/config/path-probe.js +6 -0
- package/dist/config/path-probe.js.map +1 -1
- package/dist/config-backup.d.ts +1 -1
- package/dist/config-backup.d.ts.map +1 -1
- package/dist/config-backup.js +2 -0
- package/dist/config-backup.js.map +1 -1
- package/dist/custom-model-hosts.d.ts +32 -8
- package/dist/custom-model-hosts.d.ts.map +1 -1
- package/dist/custom-model-hosts.js +10 -0
- package/dist/custom-model-hosts.js.map +1 -1
- package/dist/custom-model-injection-apply.d.ts +19 -5
- package/dist/custom-model-injection-apply.d.ts.map +1 -1
- package/dist/custom-model-injection-apply.js +88 -8
- package/dist/custom-model-injection-apply.js.map +1 -1
- package/dist/custom-model-injection.d.ts +6 -0
- package/dist/custom-model-injection.d.ts.map +1 -1
- package/dist/custom-model-injection.js +92 -10
- package/dist/custom-model-injection.js.map +1 -1
- package/dist/discord-bridge.d.ts +338 -0
- package/dist/discord-bridge.d.ts.map +1 -0
- package/dist/discord-bridge.js +1256 -0
- package/dist/discord-bridge.js.map +1 -0
- package/dist/edit-history-local-source.d.ts +83 -0
- package/dist/edit-history-local-source.d.ts.map +1 -0
- package/dist/edit-history-local-source.js +198 -0
- package/dist/edit-history-local-source.js.map +1 -0
- package/dist/edit-history-parse.d.ts +114 -0
- package/dist/edit-history-parse.d.ts.map +1 -0
- package/dist/edit-history-parse.js +312 -0
- package/dist/edit-history-parse.js.map +1 -0
- package/dist/edit-history-store.d.ts +209 -0
- package/dist/edit-history-store.d.ts.map +1 -0
- package/dist/edit-history-store.js +599 -0
- package/dist/edit-history-store.js.map +1 -0
- package/dist/git-clone.d.ts +6 -1
- package/dist/git-clone.d.ts.map +1 -1
- package/dist/git-clone.js +79 -14
- package/dist/git-clone.js.map +1 -1
- package/dist/image-watcher.js +4 -4
- package/dist/image-watcher.js.map +1 -1
- package/dist/mux-interface.d.ts +10 -1
- package/dist/mux-interface.d.ts.map +1 -1
- package/dist/session-cli-registry-bridge.d.ts.map +1 -1
- package/dist/session-cli-registry-bridge.js +4 -0
- package/dist/session-cli-registry-bridge.js.map +1 -1
- package/dist/session.d.ts +70 -3
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +147 -4
- package/dist/session.js.map +1 -1
- package/dist/tmux-manager.d.ts +40 -0
- package/dist/tmux-manager.d.ts.map +1 -1
- package/dist/tmux-manager.js +62 -0
- package/dist/tmux-manager.js.map +1 -1
- package/dist/types/discord.d.ts +55 -0
- package/dist/types/discord.d.ts.map +1 -0
- package/dist/types/discord.js +18 -0
- package/dist/types/discord.js.map +1 -0
- package/dist/types/index.d.ts +2 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -1
- package/dist/types/session.d.ts +13 -0
- package/dist/types/session.d.ts.map +1 -1
- package/dist/types/session.js.map +1 -1
- package/dist/web/case-path.d.ts +2 -0
- package/dist/web/case-path.d.ts.map +1 -1
- package/dist/web/case-path.js +3 -3
- package/dist/web/case-path.js.map +1 -1
- package/dist/web/edit-history-sync.d.ts +158 -0
- package/dist/web/edit-history-sync.d.ts.map +1 -0
- package/dist/web/edit-history-sync.js +445 -0
- package/dist/web/edit-history-sync.js.map +1 -0
- package/dist/web/paste-image-gc.d.ts +6 -0
- package/dist/web/paste-image-gc.d.ts.map +1 -1
- package/dist/web/paste-image-gc.js +6 -0
- package/dist/web/paste-image-gc.js.map +1 -1
- package/dist/web/ports/session-port.d.ts +13 -0
- package/dist/web/ports/session-port.d.ts.map +1 -1
- package/dist/web/public/admin-ui.js.gz +0 -0
- package/dist/web/public/api-client.c9b1cddc.js.gz +0 -0
- package/dist/web/public/{app.fe8a6b4c.js → app.963b5ba8.js} +6 -6
- package/dist/web/public/app.963b5ba8.js.br +0 -0
- package/dist/web/public/app.963b5ba8.js.gz +0 -0
- package/dist/web/public/approvals-ui.js.gz +0 -0
- package/dist/web/public/{constants.affcdde6.js → constants.782170e1.js} +114 -25
- package/dist/web/public/constants.782170e1.js.br +0 -0
- package/dist/web/public/constants.782170e1.js.gz +0 -0
- package/dist/web/public/cron-ui.js.gz +0 -0
- package/dist/web/public/edit-history-ui.js +630 -0
- package/dist/web/public/edit-history-ui.js.br +0 -0
- package/dist/web/public/edit-history-ui.js.gz +0 -0
- package/dist/web/public/entrance-animations.js.gz +0 -0
- package/dist/web/public/git-status-ui.js.gz +0 -0
- package/dist/web/public/header-divider.eb2d2463.js.gz +0 -0
- package/dist/web/public/home-sessions.js.gz +0 -0
- package/dist/web/public/host-wake-ui.js.gz +0 -0
- package/dist/web/public/i18n.33f930d7.js +2 -0
- package/dist/web/public/i18n.33f930d7.js.br +0 -0
- package/dist/web/public/i18n.33f930d7.js.gz +0 -0
- package/dist/web/public/image-input.a5d0f8f3.js.gz +0 -0
- package/dist/web/public/index.html +160 -14
- package/dist/web/public/index.html.br +0 -0
- package/dist/web/public/index.html.gz +0 -0
- package/dist/web/public/input-cjk.8bc46081.js.gz +0 -0
- package/dist/web/public/{keyboard-accessory.ff64fafc.js → keyboard-accessory.d4ec5957.js} +72 -1
- package/dist/web/public/keyboard-accessory.d4ec5957.js.br +0 -0
- package/dist/web/public/keyboard-accessory.d4ec5957.js.gz +0 -0
- package/dist/web/public/mobile-handlers.f7c3f692.js.gz +0 -0
- package/dist/web/public/mobile-ime-preview.2dbaf262.js.gz +0 -0
- package/dist/web/public/mobile-overview.js.gz +0 -0
- package/dist/web/public/mobile.5ef2ce85.css +1 -0
- package/dist/web/public/mobile.5ef2ce85.css.br +0 -0
- package/dist/web/public/mobile.5ef2ce85.css.gz +0 -0
- package/dist/web/public/notification-manager.feb82c04.js.gz +0 -0
- package/dist/web/public/orchestrator-panel.js.gz +0 -0
- package/dist/web/public/{panels-ui.4a56ee63.js → panels-ui.b100727d.js} +2 -2
- package/dist/web/public/panels-ui.b100727d.js.br +0 -0
- package/dist/web/public/{panels-ui.4a56ee63.js.gz → panels-ui.b100727d.js.gz} +0 -0
- package/dist/web/public/ralph-panel.b350e2ef.js.gz +0 -0
- package/dist/web/public/ralph-wizard.b6c0dd19.js.gz +0 -0
- package/dist/web/public/readmymind-ui.js.gz +0 -0
- package/dist/web/public/reboot-restore-ui.js.gz +0 -0
- package/dist/web/public/{respawn-ui.d7adcf6a.js → respawn-ui.304ba0d4.js} +1 -1
- package/dist/web/public/respawn-ui.304ba0d4.js.br +0 -0
- package/dist/web/public/respawn-ui.304ba0d4.js.gz +0 -0
- package/dist/web/public/sanitize-html.e7147e76.js.gz +0 -0
- package/dist/web/public/security-notices.json +1 -21
- package/dist/web/public/session-lineage.js.gz +0 -0
- package/dist/web/public/{session-ui.426fb671.js → session-ui.5ac82f2c.js} +30 -30
- package/dist/web/public/session-ui.5ac82f2c.js.br +0 -0
- package/dist/web/public/session-ui.5ac82f2c.js.gz +0 -0
- package/dist/web/public/settings-ui.d1d4fb99.js +106 -0
- package/dist/web/public/settings-ui.d1d4fb99.js.br +0 -0
- package/dist/web/public/settings-ui.d1d4fb99.js.gz +0 -0
- package/dist/web/public/spreadsheet-preview-worker.js.gz +0 -0
- package/dist/web/public/spreadsheet-preview.75c751de.js.gz +0 -0
- package/dist/web/public/spreadsheet-xlsx-core.js.gz +0 -0
- package/dist/web/public/styles.77dc538f.css +1 -0
- package/dist/web/public/styles.77dc538f.css.br +0 -0
- package/dist/web/public/styles.77dc538f.css.gz +0 -0
- package/dist/web/public/subagent-windows.07277a58.js.gz +0 -0
- package/dist/web/public/sw.js +2 -2
- package/dist/web/public/sw.js.br +0 -0
- package/dist/web/public/sw.js.gz +0 -0
- package/dist/web/public/tab-layout-browser.2d6189f7.js.gz +0 -0
- package/dist/web/public/tab-rail-resize.b5cdceaf.js.gz +0 -0
- package/dist/web/public/terminal-keycode229-recovery.98843069.js.gz +0 -0
- package/dist/web/public/terminal-split.js.gz +0 -0
- package/dist/web/public/terminal-tile.js.gz +0 -0
- package/dist/web/public/{terminal-ui.7e787829.js → terminal-ui.d7c75ce8.js} +3 -3
- package/dist/web/public/terminal-ui.d7c75ce8.js.br +0 -0
- package/dist/web/public/terminal-ui.d7c75ce8.js.gz +0 -0
- package/dist/web/public/tile-grid.js.gz +0 -0
- package/dist/web/public/ultracode-panel.js.gz +0 -0
- package/dist/web/public/ultracode-windows.js.gz +0 -0
- package/dist/web/public/vendor/dompurify.min.js.gz +0 -0
- package/dist/web/public/vendor/exceljs.min.js.gz +0 -0
- package/dist/web/public/vendor/fflate.min.js.gz +0 -0
- package/dist/web/public/vendor/marked.min.js.gz +0 -0
- package/dist/web/public/vendor/xterm-addon-fit.min.js.gz +0 -0
- package/dist/web/public/vendor/xterm-addon-serialize.min.js.gz +0 -0
- package/dist/web/public/vendor/xterm-addon-unicode11.min.js.gz +0 -0
- package/dist/web/public/vendor/xterm-addon-webgl.min.js.gz +0 -0
- package/dist/web/public/vendor/xterm-predictive-echo.276b11d9.js.gz +0 -0
- package/dist/web/public/vendor/xterm-zerolag-input.1be42307.js.gz +0 -0
- package/dist/web/public/vendor/xterm.css.gz +0 -0
- package/dist/web/public/vendor/xterm.min.js.gz +0 -0
- package/dist/web/public/voice-input.2342c37b.js.gz +0 -0
- package/dist/web/public/voice-pcm-worklet.js.gz +0 -0
- package/dist/web/public/webview-tabs.js.gz +0 -0
- package/dist/web/public/whats-new.json +9 -8
- package/dist/web/routes/case-routes.d.ts.map +1 -1
- package/dist/web/routes/case-routes.js +104 -8
- package/dist/web/routes/case-routes.js.map +1 -1
- package/dist/web/routes/config-backup-routes.d.ts +5 -1
- package/dist/web/routes/config-backup-routes.d.ts.map +1 -1
- package/dist/web/routes/config-backup-routes.js +4 -1
- package/dist/web/routes/config-backup-routes.js.map +1 -1
- package/dist/web/routes/custom-model-routes.d.ts +7 -2
- package/dist/web/routes/custom-model-routes.d.ts.map +1 -1
- package/dist/web/routes/custom-model-routes.js +51 -6
- package/dist/web/routes/custom-model-routes.js.map +1 -1
- package/dist/web/routes/discord-routes.d.ts +25 -0
- package/dist/web/routes/discord-routes.d.ts.map +1 -0
- package/dist/web/routes/discord-routes.js +206 -0
- package/dist/web/routes/discord-routes.js.map +1 -0
- package/dist/web/routes/edit-history-routes.d.ts +43 -0
- package/dist/web/routes/edit-history-routes.d.ts.map +1 -0
- package/dist/web/routes/edit-history-routes.js +106 -0
- package/dist/web/routes/edit-history-routes.js.map +1 -0
- package/dist/web/routes/file-routes.d.ts.map +1 -1
- package/dist/web/routes/file-routes.js +62 -2
- package/dist/web/routes/file-routes.js.map +1 -1
- package/dist/web/routes/index.d.ts +2 -0
- package/dist/web/routes/index.d.ts.map +1 -1
- package/dist/web/routes/index.js +2 -0
- package/dist/web/routes/index.js.map +1 -1
- package/dist/web/routes/session-routes.d.ts +17 -0
- package/dist/web/routes/session-routes.d.ts.map +1 -1
- package/dist/web/routes/session-routes.js +87 -37
- package/dist/web/routes/session-routes.js.map +1 -1
- package/dist/web/routes/system-routes.d.ts.map +1 -1
- package/dist/web/routes/system-routes.js +1 -0
- package/dist/web/routes/system-routes.js.map +1 -1
- package/dist/web/schemas.d.ts +68 -1
- package/dist/web/schemas.d.ts.map +1 -1
- package/dist/web/schemas.js +77 -1
- package/dist/web/schemas.js.map +1 -1
- package/dist/web/sensitive-path.d.ts.map +1 -1
- package/dist/web/sensitive-path.js +15 -0
- package/dist/web/sensitive-path.js.map +1 -1
- package/dist/web/server.d.ts +43 -0
- package/dist/web/server.d.ts.map +1 -1
- package/dist/web/server.js +219 -11
- package/dist/web/server.js.map +1 -1
- package/package.json +1 -1
- package/dist/web/public/app.fe8a6b4c.js.br +0 -0
- package/dist/web/public/app.fe8a6b4c.js.gz +0 -0
- package/dist/web/public/constants.affcdde6.js.br +0 -0
- package/dist/web/public/constants.affcdde6.js.gz +0 -0
- package/dist/web/public/i18n.a618ef4e.js +0 -2
- package/dist/web/public/i18n.a618ef4e.js.br +0 -0
- package/dist/web/public/i18n.a618ef4e.js.gz +0 -0
- package/dist/web/public/keyboard-accessory.ff64fafc.js.br +0 -0
- package/dist/web/public/keyboard-accessory.ff64fafc.js.gz +0 -0
- package/dist/web/public/mobile.1bbd2d67.css +0 -1
- package/dist/web/public/mobile.1bbd2d67.css.br +0 -0
- package/dist/web/public/mobile.1bbd2d67.css.gz +0 -0
- package/dist/web/public/panels-ui.4a56ee63.js.br +0 -0
- package/dist/web/public/respawn-ui.d7adcf6a.js.br +0 -0
- package/dist/web/public/respawn-ui.d7adcf6a.js.gz +0 -0
- package/dist/web/public/session-ui.426fb671.js.br +0 -0
- package/dist/web/public/session-ui.426fb671.js.gz +0 -0
- package/dist/web/public/settings-ui.a191154e.js +0 -106
- package/dist/web/public/settings-ui.a191154e.js.br +0 -0
- package/dist/web/public/settings-ui.a191154e.js.gz +0 -0
- package/dist/web/public/styles.4f0c67a0.css +0 -1
- package/dist/web/public/styles.4f0c67a0.css.br +0 -0
- package/dist/web/public/styles.4f0c67a0.css.gz +0 -0
- package/dist/web/public/terminal-ui.7e787829.js.br +0 -0
- package/dist/web/public/terminal-ui.7e787829.js.gz +0 -0
|
@@ -0,0 +1,445 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Reads a claude session's edit history on request: the new bytes of its
|
|
3
|
+
* transcripts (main + subagents) go into its `EditHistoryStore`, and the Bash image
|
|
4
|
+
* candidates that came with them are confirmed against the files on disk.
|
|
5
|
+
*
|
|
6
|
+
* WHEN. Only when the panel asks (`GET …/edits?sync=1` on open and while it follows the
|
|
7
|
+
* session, `POST …/edits/older`): no timer, no hook, no background read for sessions nobody
|
|
8
|
+
* looks at. One sync per session runs at a time; requests during a run are folded into one
|
|
9
|
+
* more forward read and/or one more older read afterwards.
|
|
10
|
+
*
|
|
11
|
+
* HOW MUCH. A forward read shares one budget over all files, main first. A file whose chunk
|
|
12
|
+
* the shared budget cut short is not applied (the store would take a chunk with no line end
|
|
13
|
+
* for a line longer than the budget) but read in the next pass; up to
|
|
14
|
+
* {@link MAX_FORWARD_PASSES} passes per sync, the rest with the next one.
|
|
15
|
+
*
|
|
16
|
+
* NEW CONVERSATION. When the transcript path names another conversation (`/clear`, resume),
|
|
17
|
+
* the previous transcript (same directory) is first read to its end, so edits it got after
|
|
18
|
+
* the last read are not lost with its cursors; then the new one is read from its end.
|
|
19
|
+
* "Load older" reaches back within the current conversation only.
|
|
20
|
+
*
|
|
21
|
+
* MEMORY. At most {@link MAX_LOADED_STORES} stores stay loaded; past that the least recently
|
|
22
|
+
* used one without a run is written (if it changed) and dropped, and loaded again on demand.
|
|
23
|
+
*
|
|
24
|
+
* GONE. `remove()` (the session's record is deleted) marks the session gone, deletes the file
|
|
25
|
+
* and then drops the session's slot: a run in flight stops after its current read and its
|
|
26
|
+
* store no longer writes; a request during the removal reads nothing (`unavailable`, reason
|
|
27
|
+
* `removed`). A session that comes back with the same id (reboot restore) starts afresh.
|
|
28
|
+
* `sweep()` deletes, at startup, the stored history of sessions that no longer exist. A
|
|
29
|
+
* subagent transcript that vanished loses its cursor (`dropSource`), not its entries.
|
|
30
|
+
*
|
|
31
|
+
* OLDER. "Load older" reads a full budget block of up to {@link MAX_OLDER_SOURCES} sources
|
|
32
|
+
* with older lines per click; with more sources they take turns.
|
|
33
|
+
*
|
|
34
|
+
* WHICH SESSIONS. Local claude sessions. Remote, Docker and non-claude sessions answer
|
|
35
|
+
* `unsupported` and are never read.
|
|
36
|
+
*
|
|
37
|
+
* IMAGES. A Bash candidate counts only when the file's mtime lies in the call's window
|
|
38
|
+
* (start − 2 s … end + 2 s), so `ls *.png` lists nothing.
|
|
39
|
+
*
|
|
40
|
+
* Tests: `test/edit-history-sync.test.ts`.
|
|
41
|
+
*
|
|
42
|
+
* @module web/edit-history-sync
|
|
43
|
+
*/
|
|
44
|
+
import { basename, dirname, join } from 'node:path';
|
|
45
|
+
import { READ_BUDGET_BYTES } from '../edit-history-store.js';
|
|
46
|
+
import { getCli } from '../config/cli-registry/registry.js';
|
|
47
|
+
/** Slack around a Bash call's window for the image mtime check. */
|
|
48
|
+
export const IMAGE_MTIME_SLACK_MS = 2000;
|
|
49
|
+
/** Forward passes per sync when files grew by more than one budget. */
|
|
50
|
+
export const MAX_FORWARD_PASSES = 3;
|
|
51
|
+
/** Sources read back per "Load older" click, a full budget each. */
|
|
52
|
+
export const MAX_OLDER_SOURCES = 3;
|
|
53
|
+
/** Stores kept in memory; the least recently used one past this is dropped. */
|
|
54
|
+
export const MAX_LOADED_STORES = 3;
|
|
55
|
+
/** `reason` when the session has no transcript yet (no prompt yet, or not found). */
|
|
56
|
+
export const NO_TRANSCRIPT = 'no-transcript';
|
|
57
|
+
/** `reason` once the session's history was deleted. */
|
|
58
|
+
export const REMOVED = 'removed';
|
|
59
|
+
/** Why a session has no edit history, or undefined when it can have one. */
|
|
60
|
+
export function unsupportedReason(session) {
|
|
61
|
+
if (session.remote)
|
|
62
|
+
return 'remote';
|
|
63
|
+
if (session.docker)
|
|
64
|
+
return 'docker';
|
|
65
|
+
if (getCli(session.mode)?.capabilities.transcript !== 'claude-jsonl')
|
|
66
|
+
return 'mode';
|
|
67
|
+
return undefined;
|
|
68
|
+
}
|
|
69
|
+
/** One turn of the event loop, between synchronous parses of up to one budget each. */
|
|
70
|
+
function breathe() {
|
|
71
|
+
return new Promise((resolve) => setImmediate(resolve));
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Bash candidates whose probed file is a regular file with an mtime inside the call's window
|
|
75
|
+
* (files claude sent to the user skip the window: they exist and were shown on purpose).
|
|
76
|
+
* A candidate whose file version is already recorded is skipped: `known(path)` is the newest
|
|
77
|
+
* entry time for that path, and an entry at or after `mtime − slack` saw this version: the
|
|
78
|
+
* `ls *.png` right after the render, or a Write followed by a listing. Candidates are taken
|
|
79
|
+
* in call order so a batch dedupes itself the same way.
|
|
80
|
+
*/
|
|
81
|
+
export function confirmImages(candidates, probe, known = () => undefined) {
|
|
82
|
+
const out = [];
|
|
83
|
+
const seen = new Map();
|
|
84
|
+
for (const c of [...candidates].sort((a, b) => a.end - b.end)) {
|
|
85
|
+
for (const path of c.paths) {
|
|
86
|
+
const p = probe(path);
|
|
87
|
+
if (!p || p.kind !== 'file' || !p.mtimeMs)
|
|
88
|
+
continue;
|
|
89
|
+
const inWindow = p.mtimeMs >= c.start - IMAGE_MTIME_SLACK_MS && p.mtimeMs <= c.end + IMAGE_MTIME_SLACK_MS;
|
|
90
|
+
if (!c.sent && !inWindow)
|
|
91
|
+
continue;
|
|
92
|
+
const entryPath = path.startsWith('~/') ? p.realPath : path;
|
|
93
|
+
const last = Math.max(seen.get(entryPath) ?? -Infinity, known(entryPath) ?? -Infinity);
|
|
94
|
+
if (last >= p.mtimeMs - IMAGE_MTIME_SLACK_MS)
|
|
95
|
+
continue;
|
|
96
|
+
seen.set(entryPath, c.end);
|
|
97
|
+
const img = {
|
|
98
|
+
toolUseId: c.toolUseId,
|
|
99
|
+
path: entryPath,
|
|
100
|
+
ts: c.end,
|
|
101
|
+
tool: c.sent ? 'sent' : 'bash',
|
|
102
|
+
};
|
|
103
|
+
if (c.agentId)
|
|
104
|
+
img.agentId = c.agentId;
|
|
105
|
+
out.push(img);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return out;
|
|
109
|
+
}
|
|
110
|
+
export class EditHistorySync {
|
|
111
|
+
deps;
|
|
112
|
+
/** By session, least recently used first. */
|
|
113
|
+
slots = new Map();
|
|
114
|
+
/** Writes of dropped stores; loading that session again waits for its write. */
|
|
115
|
+
unloading = new Map();
|
|
116
|
+
budget;
|
|
117
|
+
constructor(deps) {
|
|
118
|
+
this.deps = deps;
|
|
119
|
+
this.budget = deps.budget ?? READ_BUDGET_BYTES;
|
|
120
|
+
}
|
|
121
|
+
/** The session's store, loaded from disk on first use (one load for concurrent callers). */
|
|
122
|
+
getStore(sessionId) {
|
|
123
|
+
return this.storeOf(sessionId, this.slot(sessionId));
|
|
124
|
+
}
|
|
125
|
+
getStatus(sessionId) {
|
|
126
|
+
return { ...this.slot(sessionId).status };
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Read what is new (or, with `older`, the next older block). Resolves when this
|
|
130
|
+
* request's run is done; never rejects. A call during a run queues one more run.
|
|
131
|
+
*/
|
|
132
|
+
async sync(session, opts = {}) {
|
|
133
|
+
const why = unsupportedReason(session);
|
|
134
|
+
const slot = this.slot(session.id);
|
|
135
|
+
if (slot.gone)
|
|
136
|
+
return { ...slot.status };
|
|
137
|
+
if (why) {
|
|
138
|
+
slot.status = { state: 'unsupported', reason: why };
|
|
139
|
+
return { ...slot.status };
|
|
140
|
+
}
|
|
141
|
+
const want = { forward: !opts.older, older: !!opts.older };
|
|
142
|
+
if (slot.running) {
|
|
143
|
+
slot.again = {
|
|
144
|
+
forward: (slot.again?.forward ?? false) || want.forward,
|
|
145
|
+
older: (slot.again?.older ?? false) || want.older,
|
|
146
|
+
};
|
|
147
|
+
await slot.running;
|
|
148
|
+
// The queued run starts when the current one ends; wait for it too.
|
|
149
|
+
if (slot.running)
|
|
150
|
+
await slot.running;
|
|
151
|
+
return { ...slot.status };
|
|
152
|
+
}
|
|
153
|
+
slot.running = this.runLoop(session, slot, want);
|
|
154
|
+
try {
|
|
155
|
+
await slot.running;
|
|
156
|
+
}
|
|
157
|
+
finally {
|
|
158
|
+
slot.running = undefined;
|
|
159
|
+
this.unloadIdle(slot);
|
|
160
|
+
}
|
|
161
|
+
return { ...slot.status };
|
|
162
|
+
}
|
|
163
|
+
/** Write every loaded store's pending changes (server shutdown). */
|
|
164
|
+
async flushAll() {
|
|
165
|
+
await Promise.all([
|
|
166
|
+
...[...this.slots.values()].map(async (slot) => (await slot.store?.catch(() => undefined))?.settle()),
|
|
167
|
+
...this.unloading.values(),
|
|
168
|
+
]);
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Delete a session's stored history (its record is gone). While it runs the session is
|
|
172
|
+
* marked, so a run in flight or a request meanwhile cannot load and write a new store for
|
|
173
|
+
* it; then its slot goes, and a session that comes back with this id starts afresh.
|
|
174
|
+
*/
|
|
175
|
+
async remove(sessionId) {
|
|
176
|
+
const slot = this.slot(sessionId);
|
|
177
|
+
slot.gone = true;
|
|
178
|
+
slot.again = undefined;
|
|
179
|
+
slot.status = { state: 'unavailable', reason: REMOVED };
|
|
180
|
+
try {
|
|
181
|
+
const store = await slot.store?.catch(() => undefined);
|
|
182
|
+
if (store) {
|
|
183
|
+
await store.remove();
|
|
184
|
+
}
|
|
185
|
+
else {
|
|
186
|
+
await this.unloading.get(sessionId);
|
|
187
|
+
await this.deps.deleteStore(sessionId);
|
|
188
|
+
}
|
|
189
|
+
await slot.running;
|
|
190
|
+
}
|
|
191
|
+
finally {
|
|
192
|
+
if (this.slots.get(sessionId) === slot)
|
|
193
|
+
this.slots.delete(sessionId);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Delete the stored history of sessions that no longer exist (startup: left behind by a
|
|
198
|
+
* crash during deletion, or by an older build). A session in use here is kept.
|
|
199
|
+
*/
|
|
200
|
+
sweep(exists) {
|
|
201
|
+
return this.deps.sweepStores((id) => this.slots.has(id) || exists(id));
|
|
202
|
+
}
|
|
203
|
+
/** The session's slot, now the most recently used. */
|
|
204
|
+
slot(sessionId) {
|
|
205
|
+
const slot = this.slots.get(sessionId) ?? { status: { state: 'ok' } };
|
|
206
|
+
this.slots.delete(sessionId);
|
|
207
|
+
this.slots.set(sessionId, slot);
|
|
208
|
+
return slot;
|
|
209
|
+
}
|
|
210
|
+
storeOf(sessionId, slot) {
|
|
211
|
+
if (!slot.store) {
|
|
212
|
+
const loading = (async () => {
|
|
213
|
+
await this.unloading.get(sessionId);
|
|
214
|
+
return this.deps.loadStore(sessionId);
|
|
215
|
+
})();
|
|
216
|
+
slot.store = loading;
|
|
217
|
+
loading.catch(() => {
|
|
218
|
+
if (slot.store === loading)
|
|
219
|
+
slot.store = undefined;
|
|
220
|
+
});
|
|
221
|
+
this.unloadIdle(slot);
|
|
222
|
+
}
|
|
223
|
+
return slot.store;
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Past {@link MAX_LOADED_STORES}, drop the least recently used stores no run uses: each is
|
|
227
|
+
* written if it changed, and a later request loads it again (after that write).
|
|
228
|
+
*/
|
|
229
|
+
unloadIdle(keep) {
|
|
230
|
+
let loaded = 0;
|
|
231
|
+
for (const slot of this.slots.values())
|
|
232
|
+
if (slot.store)
|
|
233
|
+
loaded++;
|
|
234
|
+
for (const [sessionId, slot] of this.slots) {
|
|
235
|
+
if (loaded <= MAX_LOADED_STORES)
|
|
236
|
+
break;
|
|
237
|
+
if (!slot.store || slot.running || slot.gone || slot === keep)
|
|
238
|
+
continue;
|
|
239
|
+
this.slots.delete(sessionId);
|
|
240
|
+
loaded--;
|
|
241
|
+
const writing = slot.store
|
|
242
|
+
.then((store) => store.settle())
|
|
243
|
+
.catch((err) => {
|
|
244
|
+
console.warn(`[EditHistory] Saving the history of ${sessionId} failed:`, err);
|
|
245
|
+
})
|
|
246
|
+
.finally(() => {
|
|
247
|
+
if (this.unloading.get(sessionId) === writing)
|
|
248
|
+
this.unloading.delete(sessionId);
|
|
249
|
+
});
|
|
250
|
+
this.unloading.set(sessionId, writing);
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
async runLoop(session, slot, want) {
|
|
254
|
+
let next = want;
|
|
255
|
+
while (next && !slot.gone) {
|
|
256
|
+
if (next.forward)
|
|
257
|
+
await this.runOnce(session, slot, false);
|
|
258
|
+
if (next.older && !slot.gone)
|
|
259
|
+
await this.runOnce(session, slot, true);
|
|
260
|
+
next = slot.again;
|
|
261
|
+
slot.again = undefined;
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
async runOnce(session, slot, older) {
|
|
265
|
+
let status;
|
|
266
|
+
try {
|
|
267
|
+
// This slot's store: a run still in flight after `remove()` cannot reach a later one.
|
|
268
|
+
const store = await this.storeOf(session.id, slot);
|
|
269
|
+
const path = slot.gone ? null : await this.deps.transcriptPath(session);
|
|
270
|
+
let found;
|
|
271
|
+
if (!path) {
|
|
272
|
+
found = false;
|
|
273
|
+
}
|
|
274
|
+
else if (older) {
|
|
275
|
+
found = await this.readOlder(path, store, slot);
|
|
276
|
+
}
|
|
277
|
+
else {
|
|
278
|
+
found = true;
|
|
279
|
+
for (let pass = 0; pass < MAX_FORWARD_PASSES && found && !slot.gone; pass++) {
|
|
280
|
+
const r = await this.readForward(path, store);
|
|
281
|
+
found = r.found;
|
|
282
|
+
if (!r.more)
|
|
283
|
+
break;
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
status = found ? { state: 'ok' } : { state: 'unavailable', reason: NO_TRANSCRIPT };
|
|
287
|
+
}
|
|
288
|
+
catch (err) {
|
|
289
|
+
status = { state: 'unavailable', reason: err instanceof Error ? err.message : String(err) };
|
|
290
|
+
}
|
|
291
|
+
if (!slot.gone)
|
|
292
|
+
slot.status = status;
|
|
293
|
+
}
|
|
294
|
+
forwardRequests(store) {
|
|
295
|
+
const out = [];
|
|
296
|
+
for (const relPath of store.knownSources()) {
|
|
297
|
+
const c = store.getCursor(relPath);
|
|
298
|
+
if (c)
|
|
299
|
+
out.push({ relPath, offset: c.offset });
|
|
300
|
+
}
|
|
301
|
+
return out;
|
|
302
|
+
}
|
|
303
|
+
/**
|
|
304
|
+
* One forward read of all sources. `more` = some file has unread bytes after it, or was cut
|
|
305
|
+
* short by the shared budget and left for the next pass. A transcript other than the stored
|
|
306
|
+
* one (`/clear`, resume) is read like a first read, once the stored one is read to its end.
|
|
307
|
+
*/
|
|
308
|
+
async readForward(path, store) {
|
|
309
|
+
const own = this.storedTranscript(path, store);
|
|
310
|
+
if (own !== path && store.knownSources().length > 0) {
|
|
311
|
+
const previous = await this.readFrom(own, store, this.forwardRequests(store));
|
|
312
|
+
if (previous.more)
|
|
313
|
+
return { found: true, more: true };
|
|
314
|
+
}
|
|
315
|
+
return this.readFrom(path, store, own === path ? this.forwardRequests(store) : []);
|
|
316
|
+
}
|
|
317
|
+
/**
|
|
318
|
+
* The path of the conversation the store holds cursors for: `path` itself, or the previous
|
|
319
|
+
* conversation's transcript next to it (`/clear` and resume keep the project directory).
|
|
320
|
+
*/
|
|
321
|
+
storedTranscript(path, store) {
|
|
322
|
+
const known = store.getTranscriptId();
|
|
323
|
+
return known === null || basename(path) === `${known}.jsonl` ? path : join(dirname(path), `${known}.jsonl`);
|
|
324
|
+
}
|
|
325
|
+
async readFrom(path, store, requests) {
|
|
326
|
+
const res = await this.deps.readSources(path, requests, this.budget);
|
|
327
|
+
if (!res)
|
|
328
|
+
return { found: false, more: false };
|
|
329
|
+
this.dropMissing(store, requests, res);
|
|
330
|
+
for (const [agentId, text] of Object.entries(res.metas)) {
|
|
331
|
+
if (!store.hasAgentMeta(agentId))
|
|
332
|
+
store.setAgentMeta(agentId, text);
|
|
333
|
+
}
|
|
334
|
+
const requested = new Set(requests.map((r) => r.relPath));
|
|
335
|
+
let more = false;
|
|
336
|
+
const candidates = [];
|
|
337
|
+
let parsed = false;
|
|
338
|
+
for (const f of res.files) {
|
|
339
|
+
// Each file is up to one budget (8 MiB) of synchronous parsing: yield between them.
|
|
340
|
+
if (parsed)
|
|
341
|
+
await breathe();
|
|
342
|
+
if (store.isRemoved())
|
|
343
|
+
break;
|
|
344
|
+
// A requested file reads on from its cursor, a new one its tail.
|
|
345
|
+
const available = requested.has(f.relPath) ? f.size - f.startOffset : f.size;
|
|
346
|
+
if (f.chunk.length < Math.min(this.budget, available)) {
|
|
347
|
+
more = true;
|
|
348
|
+
continue;
|
|
349
|
+
}
|
|
350
|
+
parsed = true;
|
|
351
|
+
const r = store.apply({
|
|
352
|
+
transcriptId: res.transcriptId,
|
|
353
|
+
source: f.relPath,
|
|
354
|
+
startOffset: f.startOffset,
|
|
355
|
+
chunk: f.chunk,
|
|
356
|
+
size: f.size,
|
|
357
|
+
});
|
|
358
|
+
candidates.push(...r.candidates);
|
|
359
|
+
if (f.startOffset + f.chunk.length < f.size)
|
|
360
|
+
more = true;
|
|
361
|
+
}
|
|
362
|
+
await this.addImages(store, candidates);
|
|
363
|
+
return { found: true, more };
|
|
364
|
+
}
|
|
365
|
+
async readOlder(path, store, slot) {
|
|
366
|
+
if (!store.backfillTruncated)
|
|
367
|
+
return true;
|
|
368
|
+
// Older lines belong to the stored conversation, even before a forward read moved on.
|
|
369
|
+
path = this.storedTranscript(path, store);
|
|
370
|
+
const sources = store.sourcesWithOlder().sort();
|
|
371
|
+
if (sources.length === 0)
|
|
372
|
+
return true;
|
|
373
|
+
// Take turns: start after the last source the previous click read.
|
|
374
|
+
const after = slot.olderAfter;
|
|
375
|
+
const first = after === undefined
|
|
376
|
+
? 0
|
|
377
|
+
: Math.max(0, sources.findIndex((s) => s > after));
|
|
378
|
+
const picked = [...sources.slice(first), ...sources.slice(0, first)].slice(0, MAX_OLDER_SOURCES);
|
|
379
|
+
const requests = [];
|
|
380
|
+
for (const relPath of picked) {
|
|
381
|
+
const range = store.olderRange(relPath, this.budget);
|
|
382
|
+
if (range)
|
|
383
|
+
requests.push({ relPath, offset: range.offset, len: range.len });
|
|
384
|
+
}
|
|
385
|
+
if (requests.length === 0)
|
|
386
|
+
return true;
|
|
387
|
+
slot.olderAfter = picked[picked.length - 1];
|
|
388
|
+
const res = await this.deps.readSources(path, requests, this.budget * requests.length, { onlyRequested: true });
|
|
389
|
+
if (!res)
|
|
390
|
+
return false;
|
|
391
|
+
if (res.transcriptId !== store.getTranscriptId())
|
|
392
|
+
return true;
|
|
393
|
+
this.dropMissing(store, requests, res);
|
|
394
|
+
const wanted = new Set(requests.map((r) => r.relPath));
|
|
395
|
+
const candidates = [];
|
|
396
|
+
let parsed = false;
|
|
397
|
+
for (const f of res.files) {
|
|
398
|
+
if (!wanted.has(f.relPath))
|
|
399
|
+
continue;
|
|
400
|
+
// Each file is up to one budget (8 MiB) of synchronous parsing: yield between them.
|
|
401
|
+
if (parsed)
|
|
402
|
+
await breathe();
|
|
403
|
+
parsed = true;
|
|
404
|
+
if (slot.gone)
|
|
405
|
+
return true;
|
|
406
|
+
const r = store.applyOlder({
|
|
407
|
+
transcriptId: res.transcriptId,
|
|
408
|
+
source: f.relPath,
|
|
409
|
+
startOffset: f.startOffset,
|
|
410
|
+
chunk: f.chunk,
|
|
411
|
+
size: f.size,
|
|
412
|
+
});
|
|
413
|
+
candidates.push(...r.candidates);
|
|
414
|
+
}
|
|
415
|
+
await this.addImages(store, candidates);
|
|
416
|
+
return true;
|
|
417
|
+
}
|
|
418
|
+
/** Requested files the reader no longer lists are gone: their cursors go too. */
|
|
419
|
+
dropMissing(store, requests, res) {
|
|
420
|
+
const listed = new Set(res.files.map((f) => f.relPath));
|
|
421
|
+
for (const r of requests)
|
|
422
|
+
if (!listed.has(r.relPath))
|
|
423
|
+
store.dropSource(r.relPath);
|
|
424
|
+
}
|
|
425
|
+
async addImages(store, candidates) {
|
|
426
|
+
const paths = [...new Set(candidates.flatMap((c) => c.paths))];
|
|
427
|
+
// A removed store keeps nothing: do not probe agent-printed paths for it.
|
|
428
|
+
if (paths.length === 0 || store.isRemoved())
|
|
429
|
+
return;
|
|
430
|
+
let probes;
|
|
431
|
+
try {
|
|
432
|
+
probes = await this.deps.probe(paths);
|
|
433
|
+
}
|
|
434
|
+
catch {
|
|
435
|
+
// The edits of this read are in; only its images are lost. The read itself succeeded.
|
|
436
|
+
return;
|
|
437
|
+
}
|
|
438
|
+
const byPath = new Map(paths.map((p, i) => [p, probes[i]]));
|
|
439
|
+
const newest = new Map();
|
|
440
|
+
for (const e of store.list())
|
|
441
|
+
newest.set(e.path, Math.max(newest.get(e.path) ?? -Infinity, e.ts));
|
|
442
|
+
store.addImageEntries(confirmImages(candidates, (p) => byPath.get(p), (p) => newest.get(p)));
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
//# sourceMappingURL=edit-history-sync.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"edit-history-sync.js","sourceRoot":"","sources":["../../src/web/edit-history-sync.ts"],"names":[],"mappings":"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"}
|
|
@@ -15,6 +15,12 @@ export declare const UPLOADS_DIR = ".codeman-uploads";
|
|
|
15
15
|
export declare const LEGACY_UPLOADS_DIR = ".claude-images";
|
|
16
16
|
/** Every upload dir name, current first. Retiring the legacy one here retires it for every reader. */
|
|
17
17
|
export declare const UPLOAD_DIR_NAMES: string[];
|
|
18
|
+
/**
|
|
19
|
+
* Where files a person sent from Discord land (discord-bridge.ts). Named here with the others so the
|
|
20
|
+
* image watcher can skip it without importing the bridge. Not an upload dir: neither the sweep nor a
|
|
21
|
+
* session delete touches it.
|
|
22
|
+
*/
|
|
23
|
+
export declare const DISCORD_RECEIVED_DIR = ".codeman-discord";
|
|
18
24
|
/**
|
|
19
25
|
* Every directory a session's uploads sit in, current first. Both consumers
|
|
20
26
|
* act on what this returns, the hourly sweep and the recursive delete in
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paste-image-gc.d.ts","sourceRoot":"","sources":["../../src/web/paste-image-gc.ts"],"names":[],"mappings":"AAkBA,OAAO,EAAiB,KAAK,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AACtF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAMpD;;;;;;;;;GASG;AACH,eAAO,MAAM,WAAW,qBAAqB,CAAC;AAC9C,6FAA6F;AAC7F,eAAO,MAAM,kBAAkB,mBAAmB,CAAC;AACnD,sGAAsG;AACtG,eAAO,MAAM,gBAAgB,UAAoC,CAAC;
|
|
1
|
+
{"version":3,"file":"paste-image-gc.d.ts","sourceRoot":"","sources":["../../src/web/paste-image-gc.ts"],"names":[],"mappings":"AAkBA,OAAO,EAAiB,KAAK,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AACtF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAMpD;;;;;;;;;GASG;AACH,eAAO,MAAM,WAAW,qBAAqB,CAAC;AAC9C,6FAA6F;AAC7F,eAAO,MAAM,kBAAkB,mBAAmB,CAAC;AACnD,sGAAsG;AACtG,eAAO,MAAM,gBAAgB,UAAoC,CAAC;AAClE;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,qBAAqB,CAAC;AAEvD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,UAAU,CAC9B,OAAO,EAAE;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,EACjD,KAAK,GAAE,gBAAqB,GAC3B,OAAO,CAAC,MAAM,EAAE,CAAC,CAYnB;AAoBD,wBAAsB,oBAAoB,CACxC,GAAG,EAAE,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,EAClC,GAAG,GAAE,MAAmB,GACvB,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CA8B/C;AAgBD,0GAA0G;AAC1G,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,gCAAgC,CAAC,KAAK,EAAE;IACtD,IAAI,EAAE,QAAQ,CAAC,iBAAiB,CAAC,CAAC;IAClC,SAAS,EAAE,QAAQ,CAAC,iBAAiB,CAAC,CAAC;IACvC,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CAC9B,GAAG,OAAO,CAeV;AAED,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,GAAG,MAAM,IAAI,CAahF"}
|
|
@@ -35,6 +35,12 @@ export const UPLOADS_DIR = '.codeman-uploads';
|
|
|
35
35
|
export const LEGACY_UPLOADS_DIR = '.claude-images';
|
|
36
36
|
/** Every upload dir name, current first. Retiring the legacy one here retires it for every reader. */
|
|
37
37
|
export const UPLOAD_DIR_NAMES = [UPLOADS_DIR, LEGACY_UPLOADS_DIR];
|
|
38
|
+
/**
|
|
39
|
+
* Where files a person sent from Discord land (discord-bridge.ts). Named here with the others so the
|
|
40
|
+
* image watcher can skip it without importing the bridge. Not an upload dir: neither the sweep nor a
|
|
41
|
+
* session delete touches it.
|
|
42
|
+
*/
|
|
43
|
+
export const DISCORD_RECEIVED_DIR = '.codeman-discord';
|
|
38
44
|
/**
|
|
39
45
|
* Every directory a session's uploads sit in, current first. Both consumers
|
|
40
46
|
* act on what this returns, the hourly sweep and the recursive delete in
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paste-image-gc.js","sourceRoot":"","sources":["../../src/web/paste-image-gc.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAyB,MAAM,gCAAgC,CAAC;AAGtF,MAAM,UAAU,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,SAAS;AACrD,MAAM,iBAAiB,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,SAAS;AACnD,MAAM,gBAAgB,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,oBAAoB;AAExD;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,kBAAkB,CAAC;AAC9C,6FAA6F;AAC7F,MAAM,CAAC,MAAM,kBAAkB,GAAG,gBAAgB,CAAC;AACnD,sGAAsG;AACtG,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,WAAW,EAAE,kBAAkB,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"paste-image-gc.js","sourceRoot":"","sources":["../../src/web/paste-image-gc.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,6 +8,14 @@ import type { TabLayout } from '../../tab-layout.js';
|
|
|
8
8
|
import type { SessionPlacementHint } from '../../tab-layout-service.js';
|
|
9
9
|
export interface SessionPort {
|
|
10
10
|
readonly sessions: ReadonlyMap<string, Session>;
|
|
11
|
+
/**
|
|
12
|
+
* The last-response reader (the body of `GET /api/sessions/:id/last-response`), filled in when the
|
|
13
|
+
* session routes register, so other server code reads the same per-CLI transcript the viewer does.
|
|
14
|
+
*/
|
|
15
|
+
lastResponseFor?: (session: Session, context?: string) => Promise<{
|
|
16
|
+
text: string;
|
|
17
|
+
timestamp?: string;
|
|
18
|
+
}>;
|
|
11
19
|
/**
|
|
12
20
|
* Register a created session with the owner's tab layout. `placement.tabGroupId`
|
|
13
21
|
* puts it at the end of that group in the same layout write (ignored when the
|
|
@@ -17,6 +25,11 @@ export interface SessionPort {
|
|
|
17
25
|
*/
|
|
18
26
|
addSession(session: Session, placement?: SessionPlacementHint): Promise<TabLayout>;
|
|
19
27
|
cleanupSession(sessionId: string, killMux?: boolean, reason?: string): Promise<void>;
|
|
28
|
+
/**
|
|
29
|
+
* Delete a session's stored edit history once its record is gone. `cleanupSession` does it
|
|
30
|
+
* itself; this is for removing a record without a live session (DELETE route).
|
|
31
|
+
*/
|
|
32
|
+
forgetEditHistory(sessionId: string): void;
|
|
20
33
|
setupSessionListeners(session: Session): Promise<void>;
|
|
21
34
|
persistSessionState(session: Session): void;
|
|
22
35
|
persistSessionStateNow(session: Session): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-port.d.ts","sourceRoot":"","sources":["../../../src/web/ports/session-port.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAExE,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChD;;;;;;OAMG;IACH,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IACnF,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrF,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvD,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IAC5C,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IAC/C;;;;;;;;;;OAUG;IACH,4BAA4B,CAC1B,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,YAAY,EACnB,KAAK,EAAE,cAAc,GAAG,aAAa,EACrC,OAAO,CAAC,EAAE;QACR;;;;;;;;WAQG;QACH,uBAAuB,CAAC,EAAE,OAAO,CAAC;KACnC,GACA,OAAO,CAAC,IAAI,CAAC,CAAC;IACjB;;;;;OAKG;IACH,4BAA4B,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/D,0BAA0B,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC;CACvD"}
|
|
1
|
+
{"version":3,"file":"session-port.d.ts","sourceRoot":"","sources":["../../../src/web/ports/session-port.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAExE,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChD;;;OAGG;IACH,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACxG;;;;;;OAMG;IACH,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IACnF,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrF;;;OAGG;IACH,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3C,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvD,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IAC5C,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IAC/C;;;;;;;;;;OAUG;IACH,4BAA4B,CAC1B,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,YAAY,EACnB,KAAK,EAAE,cAAc,GAAG,aAAa,EACrC,OAAO,CAAC,EAAE;QACR;;;;;;;;WAQG;QACH,uBAAuB,CAAC,EAAE,OAAO,CAAC;KACnC,GACA,OAAO,CAAC,IAAI,CAAC,CAAC;IACjB;;;;;OAKG;IACH,4BAA4B,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/D,0BAA0B,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC;CACvD"}
|
|
Binary file
|
|
Binary file
|