@markusylisiurunen/tau 0.3.37 → 0.3.39

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 (81) hide show
  1. package/README.md +38 -4
  2. package/dist/core/agent/agent_runtime.js +22 -0
  3. package/dist/core/agent/agent_runtime.js.map +1 -1
  4. package/dist/core/cli.js +3 -0
  5. package/dist/core/cli.js.map +1 -1
  6. package/dist/core/config/content_loader.js +3 -1
  7. package/dist/core/config/content_loader.js.map +1 -1
  8. package/dist/core/config/index.js +1 -1
  9. package/dist/core/config/index.js.map +1 -1
  10. package/dist/core/config/schema.js +67 -0
  11. package/dist/core/config/schema.js.map +1 -1
  12. package/dist/core/history/cli.js +90 -0
  13. package/dist/core/history/cli.js.map +1 -0
  14. package/dist/core/history/config.js +11 -0
  15. package/dist/core/history/config.js.map +1 -0
  16. package/dist/core/history/history_manager.js +170 -0
  17. package/dist/core/history/history_manager.js.map +1 -0
  18. package/dist/core/history/local_history_store.js +407 -0
  19. package/dist/core/history/local_history_store.js.map +1 -0
  20. package/dist/core/history/remote_history_client.js +152 -0
  21. package/dist/core/history/remote_history_client.js.map +1 -0
  22. package/dist/core/history/replication.js +89 -0
  23. package/dist/core/history/replication.js.map +1 -0
  24. package/dist/core/history/setup.js +187 -0
  25. package/dist/core/history/setup.js.map +1 -0
  26. package/dist/core/history/transcript.js +39 -0
  27. package/dist/core/history/transcript.js.map +1 -0
  28. package/dist/core/history/types.js +2 -0
  29. package/dist/core/history/types.js.map +1 -0
  30. package/dist/core/models/tau_model_overrides.js +63 -4
  31. package/dist/core/models/tau_model_overrides.js.map +1 -1
  32. package/dist/core/personas.js +2 -1
  33. package/dist/core/personas.js.map +1 -1
  34. package/dist/core/runtime/chat_runtime.js +9 -0
  35. package/dist/core/runtime/chat_runtime.js.map +1 -1
  36. package/dist/core/static/code_mode/history/documentation.md +133 -0
  37. package/dist/core/static/code_mode/history/sandbox_runner.mjs +108 -0
  38. package/dist/core/static/code_mode/web/documentation.md +7 -7
  39. package/dist/core/subagents/agent_supervisor.js +1 -1
  40. package/dist/core/subagents/agent_supervisor.js.map +1 -1
  41. package/dist/core/subagents/registry.js +2 -1
  42. package/dist/core/subagents/registry.js.map +1 -1
  43. package/dist/core/subagents/types.js +2 -1
  44. package/dist/core/subagents/types.js.map +1 -1
  45. package/dist/core/telegram/adapter.js +30 -0
  46. package/dist/core/telegram/adapter.js.map +1 -1
  47. package/dist/core/telegram/session_manager.js +143 -26
  48. package/dist/core/telegram/session_manager.js.map +1 -1
  49. package/dist/core/tools/catalog.js +11 -2
  50. package/dist/core/tools/catalog.js.map +1 -1
  51. package/dist/core/tools/history.js +125 -0
  52. package/dist/core/tools/history.js.map +1 -0
  53. package/dist/core/tools/spawn_agent.js +1 -0
  54. package/dist/core/tools/spawn_agent.js.map +1 -1
  55. package/dist/core/tools/tool_names.js +2 -0
  56. package/dist/core/tools/tool_names.js.map +1 -1
  57. package/dist/core/tools/web.js +1 -1
  58. package/dist/core/tools/web.js.map +1 -1
  59. package/dist/core/utils/repository.js +44 -0
  60. package/dist/core/utils/repository.js.map +1 -0
  61. package/dist/core/version.js +1 -1
  62. package/dist/history/worker/index.js +1106 -0
  63. package/dist/history/worker/index.js.map +1 -0
  64. package/dist/host/local_session_host.js +285 -179
  65. package/dist/host/local_session_host.js.map +1 -1
  66. package/dist/main.js +30 -3
  67. package/dist/main.js.map +1 -1
  68. package/dist/protocol/session_protocol.d.ts +4 -1
  69. package/dist/protocol/session_protocol.js +14 -6
  70. package/dist/protocol/session_protocol.js.map +1 -1
  71. package/dist/sdk/local_client.js +5 -0
  72. package/dist/sdk/local_client.js.map +1 -1
  73. package/dist/store/session_snapshot_migrations.js +61 -1
  74. package/dist/store/session_snapshot_migrations.js.map +1 -1
  75. package/dist/tui/session_chat_app.js +3 -0
  76. package/dist/tui/session_chat_app.js.map +1 -1
  77. package/dist/tui/session_chat_controller.js +46 -16
  78. package/dist/tui/session_chat_controller.js.map +1 -1
  79. package/dist/tui/session_creation_attributes.js +66 -0
  80. package/dist/tui/session_creation_attributes.js.map +1 -0
  81. package/package.json +2 -1
@@ -0,0 +1,170 @@
1
+ import { LocalHistoryStore } from "./local_history_store.js";
2
+ import { RemoteHistoryClient } from "./remote_history_client.js";
3
+ const REPLICATION_BATCH_SIZE = 10;
4
+ const REPLICATION_BATCH_BYTES = 6 * 1024 * 1024;
5
+ const REPLICATION_TIMEOUT_MS = 15_000;
6
+ export class HistoryManager {
7
+ replicationRuns = new Map();
8
+ targets = new Map();
9
+ local;
10
+ failureReason;
11
+ constructor(local, failureReason) {
12
+ if (!local && !failureReason) {
13
+ throw new Error("history manager requires a local store or failure reason");
14
+ }
15
+ this.local = local;
16
+ this.failureReason = failureReason;
17
+ }
18
+ static open(path) {
19
+ try {
20
+ return new HistoryManager(new LocalHistoryStore(path));
21
+ }
22
+ catch (error) {
23
+ return new HistoryManager(undefined, formatFailureReason(error));
24
+ }
25
+ }
26
+ registerSession(session, remote) {
27
+ return this.runLocalMutation((local) => {
28
+ local.createSession(session, remote);
29
+ if (remote)
30
+ this.scheduleReplication(remote);
31
+ });
32
+ }
33
+ append(sessionId, entries, remote) {
34
+ return this.runLocalMutation((local) => {
35
+ const inserted = local.append(sessionId, entries, remote);
36
+ if (inserted.length > 0 && remote)
37
+ this.scheduleReplication(remote);
38
+ });
39
+ }
40
+ truncateFromSources(sessionId, sourceIds, remote) {
41
+ return this.runLocalMutation((local) => {
42
+ const truncated = local.truncateFromSources(sessionId, sourceIds, remote);
43
+ if (truncated !== undefined && remote)
44
+ this.scheduleReplication(remote);
45
+ });
46
+ }
47
+ query(remote) {
48
+ if (remote) {
49
+ const client = new RemoteHistoryClient(remote);
50
+ return {
51
+ search: async (input, signal) => {
52
+ this.requireLocal();
53
+ return await client.search(input, signal);
54
+ },
55
+ read: async (input, signal) => {
56
+ this.requireLocal();
57
+ return await client.read(input, signal);
58
+ },
59
+ };
60
+ }
61
+ return {
62
+ search: async (input) => await this.searchLocal(input),
63
+ read: async (input) => await this.readLocal(input),
64
+ };
65
+ }
66
+ async flush() {
67
+ await Promise.allSettled([...this.replicationRuns.values()]);
68
+ }
69
+ close() {
70
+ const local = this.local;
71
+ this.local = undefined;
72
+ this.failureReason ??= "history manager is closed";
73
+ if (!local)
74
+ return;
75
+ try {
76
+ local.close();
77
+ }
78
+ catch {
79
+ // History is best-effort, including during host shutdown.
80
+ }
81
+ }
82
+ runLocalMutation(action) {
83
+ const local = this.local;
84
+ if (!local)
85
+ return this.failureReason;
86
+ try {
87
+ action(local);
88
+ return undefined;
89
+ }
90
+ catch (error) {
91
+ return this.disable(error);
92
+ }
93
+ }
94
+ async searchLocal(input) {
95
+ const local = this.requireLocal();
96
+ return await local.search(input);
97
+ }
98
+ async readLocal(input) {
99
+ const local = this.requireLocal();
100
+ return await local.read(input);
101
+ }
102
+ requireLocal() {
103
+ if (this.local)
104
+ return this.local;
105
+ throw new Error(`session history is unavailable: ${this.failureReason ?? "unknown failure"}`);
106
+ }
107
+ disable(error) {
108
+ const reason = formatFailureReason(error);
109
+ this.failureReason = reason;
110
+ const local = this.local;
111
+ this.local = undefined;
112
+ if (local) {
113
+ try {
114
+ local.close();
115
+ }
116
+ catch {
117
+ // Preserve the original failure reason.
118
+ }
119
+ }
120
+ return reason;
121
+ }
122
+ scheduleReplication(target) {
123
+ this.targets.set(target.endpoint, target);
124
+ if (this.replicationRuns.has(target.endpoint))
125
+ return;
126
+ const run = this.replicate(target.endpoint).finally(() => {
127
+ if (this.replicationRuns.get(target.endpoint) === run) {
128
+ this.replicationRuns.delete(target.endpoint);
129
+ }
130
+ });
131
+ this.replicationRuns.set(target.endpoint, run);
132
+ void run.catch(() => undefined);
133
+ }
134
+ async replicate(endpoint) {
135
+ const target = this.targets.get(endpoint);
136
+ if (!target)
137
+ return;
138
+ const client = new RemoteHistoryClient(target);
139
+ while (true) {
140
+ const local = this.local;
141
+ if (!local)
142
+ return;
143
+ const pending = local.listPendingOperations(endpoint, REPLICATION_BATCH_SIZE);
144
+ if (pending.length === 0)
145
+ return;
146
+ const batch = boundedReplicationBatch(pending);
147
+ await client.applyOperations(batch.map((item) => item.operation), AbortSignal.timeout(REPLICATION_TIMEOUT_MS));
148
+ local.acknowledgeOperations(batch.map((item) => item.rowId));
149
+ }
150
+ }
151
+ }
152
+ function formatFailureReason(error) {
153
+ if (error instanceof Error && error.message.trim())
154
+ return error.message.trim();
155
+ const text = String(error).trim();
156
+ return text || "unknown failure";
157
+ }
158
+ function boundedReplicationBatch(pending) {
159
+ const batch = [];
160
+ let bytes = 0;
161
+ for (const item of pending) {
162
+ const itemBytes = Buffer.byteLength(JSON.stringify(item.operation), "utf8");
163
+ if (batch.length > 0 && bytes + itemBytes > REPLICATION_BATCH_BYTES)
164
+ break;
165
+ batch.push(item);
166
+ bytes += itemBytes;
167
+ }
168
+ return batch;
169
+ }
170
+ //# sourceMappingURL=history_manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history_manager.js","sourceRoot":"","sources":["../../../src/core/history/history_manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAUjE,MAAM,sBAAsB,GAAG,EAAE,CAAC;AAClC,MAAM,uBAAuB,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;AAChD,MAAM,sBAAsB,GAAG,MAAM,CAAC;AAEtC,MAAM,OAAO,cAAc;IACR,eAAe,GAAG,IAAI,GAAG,EAAyB,CAAC;IACnD,OAAO,GAAG,IAAI,GAAG,EAA+B,CAAC;IAC1D,KAAK,CAAgC;IACrC,aAAa,CAAqB;IAE1C,YAAY,KAAoC,EAAE,aAAsB;QACtE,IAAI,CAAC,KAAK,IAAI,CAAC,aAAa,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAC;QAC9E,CAAC;QACD,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;IACrC,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,IAAY;QACtB,IAAI,CAAC;YACH,OAAO,IAAI,cAAc,CAAC,IAAI,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC;QACzD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,IAAI,cAAc,CAAC,SAAS,EAAE,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC;QACnE,CAAC;IACH,CAAC;IAED,eAAe,CAAC,OAA6B,EAAE,MAA4B;QACzE,OAAO,IAAI,CAAC,gBAAgB,CAAC,CAAC,KAAK,EAAE,EAAE;YACrC,KAAK,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YACrC,IAAI,MAAM;gBAAE,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;IACL,CAAC;IAED,MAAM,CACJ,SAAiB,EACjB,OAAuB,EACvB,MAA4B;QAE5B,OAAO,IAAI,CAAC,gBAAgB,CAAC,CAAC,KAAK,EAAE,EAAE;YACrC,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;YAC1D,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM;gBAAE,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC;QACtE,CAAC,CAAC,CAAC;IACL,CAAC;IAED,mBAAmB,CACjB,SAAiB,EACjB,SAAmB,EACnB,MAA4B;QAE5B,OAAO,IAAI,CAAC,gBAAgB,CAAC,CAAC,KAAK,EAAE,EAAE;YACrC,MAAM,SAAS,GAAG,KAAK,CAAC,mBAAmB,CAAC,SAAS,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;YAC1E,IAAI,SAAS,KAAK,SAAS,IAAI,MAAM;gBAAE,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC;QAC1E,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,MAA4B;QAChC,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,MAAM,GAAG,IAAI,mBAAmB,CAAC,MAAM,CAAC,CAAC;YAC/C,OAAO;gBACL,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;oBAC9B,IAAI,CAAC,YAAY,EAAE,CAAC;oBACpB,OAAO,MAAM,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;gBAC5C,CAAC;gBACD,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;oBAC5B,IAAI,CAAC,YAAY,EAAE,CAAC;oBACpB,OAAO,MAAM,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;gBAC1C,CAAC;aACF,CAAC;QACJ,CAAC;QAED,OAAO;YACL,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;YACtD,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;SACnD,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAC/D,CAAC;IAED,KAAK;QACH,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACzB,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC;QACvB,IAAI,CAAC,aAAa,KAAK,2BAA2B,CAAC;QACnD,IAAI,CAAC,KAAK;YAAE,OAAO;QACnB,IAAI,CAAC;YACH,KAAK,CAAC,KAAK,EAAE,CAAC;QAChB,CAAC;QAAC,MAAM,CAAC;YACP,0DAA0D;QAC5D,CAAC;IACH,CAAC;IAEO,gBAAgB,CAAC,MAA0C;QACjE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACzB,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC,aAAa,CAAC;QACtC,IAAI,CAAC;YACH,MAAM,CAAC,KAAK,CAAC,CAAC;YACd,OAAO,SAAS,CAAC;QACnB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,WAAW,CAAC,KAAyB;QACjD,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;QAClC,OAAO,MAAM,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC;IAEO,KAAK,CAAC,SAAS,CAAC,KAAuB;QAC7C,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;QAClC,OAAO,MAAM,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC;IAEO,YAAY;QAClB,IAAI,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC,KAAK,CAAC;QAClC,MAAM,IAAI,KAAK,CAAC,mCAAmC,IAAI,CAAC,aAAa,IAAI,iBAAiB,EAAE,CAAC,CAAC;IAChG,CAAC;IAEO,OAAO,CAAC,KAAc;QAC5B,MAAM,MAAM,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;QAC1C,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC;QAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACzB,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC;QACvB,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,CAAC;gBACH,KAAK,CAAC,KAAK,EAAE,CAAC;YAChB,CAAC;YAAC,MAAM,CAAC;gBACP,wCAAwC;YAC1C,CAAC;QACH,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,mBAAmB,CAAC,MAA2B;QACrD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC1C,IAAI,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC;YAAE,OAAO;QACtD,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE;YACvD,IAAI,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,GAAG,EAAE,CAAC;gBACtD,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC/C,CAAC;QACH,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QAC/C,KAAK,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IAClC,CAAC;IAEO,KAAK,CAAC,SAAS,CAAC,QAAgB;QACtC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC1C,IAAI,CAAC,MAAM;YAAE,OAAO;QACpB,MAAM,MAAM,GAAG,IAAI,mBAAmB,CAAC,MAAM,CAAC,CAAC;QAC/C,OAAO,IAAI,EAAE,CAAC;YACZ,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;YACzB,IAAI,CAAC,KAAK;gBAAE,OAAO;YACnB,MAAM,OAAO,GAAG,KAAK,CAAC,qBAAqB,CAAC,QAAQ,EAAE,sBAAsB,CAAC,CAAC;YAC9E,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO;YACjC,MAAM,KAAK,GAAG,uBAAuB,CAAC,OAAO,CAAC,CAAC;YAC/C,MAAM,MAAM,CAAC,eAAe,CAC1B,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,EACnC,WAAW,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAC5C,CAAC;YACF,KAAK,CAAC,qBAAqB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC;CACF;AAED,SAAS,mBAAmB,CAAC,KAAc;IACzC,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE;QAAE,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;IAChF,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;IAClC,OAAO,IAAI,IAAI,iBAAiB,CAAC;AACnC,CAAC;AAED,SAAS,uBAAuB,CAAmC,OAAY;IAC7E,MAAM,KAAK,GAAQ,EAAE,CAAC;IACtB,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;QAC3B,MAAM,SAAS,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC,CAAC;QAC5E,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,GAAG,SAAS,GAAG,uBAAuB;YAAE,MAAM;QAC3E,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjB,KAAK,IAAI,SAAS,CAAC;IACrB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,407 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { chmodSync, mkdirSync } from "node:fs";
3
+ import { homedir } from "node:os";
4
+ import { dirname, join } from "node:path";
5
+ import { DatabaseSync } from "node:sqlite";
6
+ import { batchHistoryEntriesForRemote } from "./replication.js";
7
+ const PRIVATE_DIRECTORY_MODE = 0o700;
8
+ const PRIVATE_FILE_MODE = 0o600;
9
+ const HISTORY_READ_PAGE_MAX_BYTES = 12 * 1024 * 1024;
10
+ const MAX_SEARCH_SNIPPETS = 3;
11
+ export function getDefaultHistoryDatabasePath(homeDir) {
12
+ return join(homeDir ?? homedir(), ".config", "tau", "history.sqlite");
13
+ }
14
+ export class LocalHistoryStore {
15
+ database;
16
+ constructor(path) {
17
+ if (path !== ":memory:") {
18
+ mkdirSync(dirname(path), { recursive: true, mode: PRIVATE_DIRECTORY_MODE });
19
+ chmodSync(dirname(path), PRIVATE_DIRECTORY_MODE);
20
+ }
21
+ this.database = new DatabaseSync(path);
22
+ if (path !== ":memory:")
23
+ chmodSync(path, PRIVATE_FILE_MODE);
24
+ this.initialize();
25
+ }
26
+ close() {
27
+ this.database.close();
28
+ }
29
+ createSession(session, remote) {
30
+ this.transaction(() => {
31
+ const existing = this.database
32
+ .prepare("SELECT attributes_json, created_at FROM history_sessions WHERE session_id = ?")
33
+ .get(session.sessionId);
34
+ const attributesJson = stableJson(session.attributes);
35
+ if (existing) {
36
+ if (existing.attributes_json !== attributesJson ||
37
+ existing.created_at !== session.createdAt) {
38
+ throw new Error(`history session '${session.sessionId}' has conflicting immutable data`);
39
+ }
40
+ }
41
+ else {
42
+ this.database
43
+ .prepare("INSERT INTO history_sessions (session_id, attributes_json, created_at, updated_at) VALUES (?, ?, ?, ?)")
44
+ .run(session.sessionId, attributesJson, session.createdAt, session.createdAt);
45
+ const insertAttribute = this.database.prepare("INSERT INTO history_attributes (session_id, key, value) VALUES (?, ?, ?)");
46
+ for (const [key, value] of Object.entries(session.attributes)) {
47
+ insertAttribute.run(session.sessionId, key, value);
48
+ }
49
+ }
50
+ if (remote) {
51
+ const targetInsert = this.database
52
+ .prepare("INSERT OR IGNORE INTO history_replication_targets (session_id, endpoint) VALUES (?, ?)")
53
+ .run(session.sessionId, remote.endpoint);
54
+ if (Number(targetInsert.changes) > 0) {
55
+ this.enqueue(remote.endpoint, {
56
+ id: randomUUID(),
57
+ sessionId: session.sessionId,
58
+ type: "create",
59
+ session,
60
+ });
61
+ }
62
+ }
63
+ });
64
+ }
65
+ append(sessionId, entries, remote) {
66
+ if (entries.length === 0)
67
+ return [];
68
+ return this.transaction(() => {
69
+ this.requireSession(sessionId);
70
+ const existingIds = new Set(this.database
71
+ .prepare(`SELECT entry_id FROM history_entries WHERE session_id = ? AND entry_id IN (${entries.map(() => "?").join(", ")})`)
72
+ .all(sessionId, ...entries.map((entry) => entry.id)).map((row) => String(row.entry_id)));
73
+ const inserted = entries.filter((entry) => !existingIds.has(entry.id));
74
+ if (inserted.length === 0)
75
+ return [];
76
+ const lastPosition = this.database
77
+ .prepare("SELECT COALESCE(MAX(position), 0) AS position FROM history_entries WHERE session_id = ?")
78
+ .get(sessionId);
79
+ let position = Number(lastPosition.position);
80
+ const insertEntry = this.database.prepare("INSERT INTO history_entries (session_id, position, entry_id, type, timestamp, payload_json, search_text) VALUES (?, ?, ?, ?, ?, ?, ?)");
81
+ const insertSearch = this.database.prepare("INSERT INTO history_entries_fts (rowid, session_id, text) VALUES (?, ?, ?)");
82
+ const insertSource = this.database.prepare("INSERT INTO history_entry_sources (session_id, entry_id, source_id) VALUES (?, ?, ?)");
83
+ for (const entry of inserted) {
84
+ position += 1;
85
+ const searchText = historyEntrySearchText(entry);
86
+ const result = insertEntry.run(sessionId, position, entry.id, entry.type, entry.timestamp, JSON.stringify(entry), searchText);
87
+ insertSearch.run(Number(result.lastInsertRowid), sessionId, searchText);
88
+ for (const sourceId of new Set(entry.sourceIds)) {
89
+ insertSource.run(sessionId, entry.id, sourceId);
90
+ }
91
+ }
92
+ const updatedAt = Math.max(...inserted.map((entry) => entry.timestamp), Date.now());
93
+ this.database
94
+ .prepare("UPDATE history_sessions SET updated_at = MAX(updated_at, ?) WHERE session_id = ?")
95
+ .run(updatedAt, sessionId);
96
+ if (remote) {
97
+ for (const entries of batchHistoryEntriesForRemote(sessionId, inserted)) {
98
+ this.enqueue(remote.endpoint, {
99
+ id: randomUUID(),
100
+ sessionId,
101
+ type: "append",
102
+ entries,
103
+ });
104
+ }
105
+ }
106
+ return inserted;
107
+ });
108
+ }
109
+ truncateFromSources(sessionId, sourceIds, remote) {
110
+ if (sourceIds.length === 0)
111
+ return undefined;
112
+ return this.transaction(() => {
113
+ const firstRemoved = this.database
114
+ .prepare(`SELECT MIN(e.position) AS position
115
+ FROM history_entries e
116
+ JOIN history_entry_sources s
117
+ ON s.session_id = e.session_id AND s.entry_id = e.entry_id
118
+ WHERE e.session_id = ? AND s.source_id IN (${sourceIds.map(() => "?").join(", ")})`)
119
+ .get(sessionId, ...sourceIds);
120
+ if (firstRemoved.position === null)
121
+ return undefined;
122
+ const position = Number(firstRemoved.position);
123
+ const removedRows = this.database
124
+ .prepare("SELECT rowid, entry_id FROM history_entries WHERE session_id = ? AND position >= ? ORDER BY position")
125
+ .all(sessionId, position);
126
+ const deleteSearch = this.database.prepare("DELETE FROM history_entries_fts WHERE rowid = ?");
127
+ for (const row of removedRows) {
128
+ deleteSearch.run(Number(row.rowid));
129
+ }
130
+ this.database
131
+ .prepare("DELETE FROM history_entries WHERE session_id = ? AND position >= ?")
132
+ .run(sessionId, position);
133
+ const previous = this.database
134
+ .prepare("SELECT entry_id FROM history_entries WHERE session_id = ? ORDER BY position DESC LIMIT 1")
135
+ .get(sessionId);
136
+ const afterEntryId = previous ? String(previous.entry_id) : null;
137
+ this.database
138
+ .prepare("UPDATE history_sessions SET updated_at = ? WHERE session_id = ?")
139
+ .run(Date.now(), sessionId);
140
+ if (remote) {
141
+ this.enqueue(remote.endpoint, {
142
+ id: randomUUID(),
143
+ sessionId,
144
+ type: "truncate",
145
+ afterEntryId,
146
+ });
147
+ }
148
+ return afterEntryId;
149
+ });
150
+ }
151
+ async search(input) {
152
+ const offset = decodeOffsetCursor(input.cursor);
153
+ const values = [];
154
+ const attributeClauses = Object.entries(input.attributes ?? {}).map(([key, filter]) => {
155
+ if (typeof filter === "string") {
156
+ values.push(key, filter);
157
+ return "EXISTS (SELECT 1 FROM history_attributes a WHERE a.session_id = s.session_id AND a.key = ? AND a.value = ?)";
158
+ }
159
+ values.push(key, filter.contains);
160
+ return "EXISTS (SELECT 1 FROM history_attributes a WHERE a.session_id = s.session_id AND a.key = ? AND INSTR(a.value, ?) > 0)";
161
+ });
162
+ const query = input.query?.trim();
163
+ let sql;
164
+ if (query) {
165
+ const matchQuery = buildFtsQuery(query);
166
+ values.unshift(matchQuery);
167
+ sql = `
168
+ WITH matches AS (
169
+ SELECT e.session_id,
170
+ GROUP_CONCAT(SUBSTR(e.search_text, 1, 360), '\n') AS snippets
171
+ FROM history_entries_fts
172
+ JOIN history_entries e ON e.rowid = history_entries_fts.rowid
173
+ WHERE history_entries_fts MATCH ?
174
+ GROUP BY e.session_id
175
+ )
176
+ SELECT s.*, m.snippets
177
+ FROM history_sessions s
178
+ JOIN matches m ON m.session_id = s.session_id
179
+ ${attributeClauses.length > 0 ? `WHERE ${attributeClauses.join(" AND ")}` : ""}
180
+ ORDER BY s.updated_at DESC, s.session_id ASC
181
+ LIMIT ? OFFSET ?`;
182
+ }
183
+ else {
184
+ sql = `
185
+ SELECT s.*, NULL AS snippets
186
+ FROM history_sessions s
187
+ ${attributeClauses.length > 0 ? `WHERE ${attributeClauses.join(" AND ")}` : ""}
188
+ ORDER BY s.updated_at DESC, s.session_id ASC
189
+ LIMIT ? OFFSET ?`;
190
+ }
191
+ values.push(input.limit + 1, offset);
192
+ const rows = this.database.prepare(sql).all(...values);
193
+ const hasMore = rows.length > input.limit;
194
+ const selected = rows.slice(0, input.limit);
195
+ return {
196
+ sessions: selected.map(descriptorFromRow),
197
+ ...(hasMore ? { nextCursor: encodeOffsetCursor(offset + input.limit) } : {}),
198
+ };
199
+ }
200
+ async read(input) {
201
+ const position = decodePositionCursor(input.cursor);
202
+ const sessionRow = this.database
203
+ .prepare("SELECT *, NULL AS snippets FROM history_sessions WHERE session_id = ?")
204
+ .get(input.sessionId);
205
+ if (!sessionRow) {
206
+ throw new Error(`history session '${input.sessionId}' was not found`);
207
+ }
208
+ const candidates = this.database
209
+ .prepare("SELECT position, LENGTH(CAST(payload_json AS BLOB)) AS payload_bytes FROM history_entries WHERE session_id = ? AND position > ? ORDER BY position LIMIT ?")
210
+ .all(input.sessionId, position, input.limit + 1);
211
+ const selectedCount = selectHistoryReadPage(candidates, input.limit);
212
+ const rows = this.database
213
+ .prepare("SELECT position, payload_json FROM history_entries WHERE session_id = ? AND position > ? ORDER BY position LIMIT ?")
214
+ .all(input.sessionId, position, selectedCount);
215
+ const last = rows.at(-1);
216
+ return {
217
+ session: descriptorFromRow(sessionRow),
218
+ entries: rows.map((row) => JSON.parse(String(row.payload_json))),
219
+ ...(candidates.length > selectedCount && last
220
+ ? { nextCursor: encodePositionCursor(Number(last.position)) }
221
+ : {}),
222
+ };
223
+ }
224
+ listPendingOperations(endpoint, limit) {
225
+ return this.database
226
+ .prepare("SELECT id, payload_json FROM history_outbox WHERE endpoint = ? ORDER BY id LIMIT ?")
227
+ .all(endpoint, limit).map((row) => ({
228
+ rowId: Number(row.id),
229
+ operation: JSON.parse(String(row.payload_json)),
230
+ }));
231
+ }
232
+ acknowledgeOperations(rowIds) {
233
+ if (rowIds.length === 0)
234
+ return;
235
+ this.database
236
+ .prepare(`DELETE FROM history_outbox WHERE id IN (${rowIds.map(() => "?").join(", ")})`)
237
+ .run(...rowIds);
238
+ }
239
+ initialize() {
240
+ this.database.exec(`
241
+ PRAGMA journal_mode = WAL;
242
+ PRAGMA busy_timeout = 5000;
243
+ PRAGMA foreign_keys = ON;
244
+ CREATE TABLE IF NOT EXISTS history_sessions (
245
+ session_id TEXT PRIMARY KEY,
246
+ attributes_json TEXT NOT NULL,
247
+ created_at INTEGER NOT NULL,
248
+ updated_at INTEGER NOT NULL,
249
+ digest_title TEXT,
250
+ digest_summary TEXT,
251
+ digest_through_entry_id TEXT
252
+ );
253
+ CREATE TABLE IF NOT EXISTS history_attributes (
254
+ session_id TEXT NOT NULL REFERENCES history_sessions(session_id) ON DELETE CASCADE,
255
+ key TEXT NOT NULL,
256
+ value TEXT NOT NULL,
257
+ PRIMARY KEY (session_id, key)
258
+ );
259
+ CREATE INDEX IF NOT EXISTS history_attributes_lookup
260
+ ON history_attributes(key, value, session_id);
261
+ CREATE TABLE IF NOT EXISTS history_entries (
262
+ session_id TEXT NOT NULL REFERENCES history_sessions(session_id) ON DELETE CASCADE,
263
+ position INTEGER NOT NULL,
264
+ entry_id TEXT NOT NULL,
265
+ type TEXT NOT NULL,
266
+ timestamp INTEGER NOT NULL,
267
+ payload_json TEXT NOT NULL,
268
+ search_text TEXT NOT NULL,
269
+ PRIMARY KEY (session_id, entry_id),
270
+ UNIQUE (session_id, position)
271
+ );
272
+ CREATE INDEX IF NOT EXISTS history_entries_order
273
+ ON history_entries(session_id, position);
274
+ CREATE TABLE IF NOT EXISTS history_entry_sources (
275
+ session_id TEXT NOT NULL,
276
+ entry_id TEXT NOT NULL,
277
+ source_id TEXT NOT NULL,
278
+ PRIMARY KEY (session_id, entry_id, source_id),
279
+ FOREIGN KEY (session_id, entry_id)
280
+ REFERENCES history_entries(session_id, entry_id) ON DELETE CASCADE
281
+ );
282
+ CREATE INDEX IF NOT EXISTS history_entry_sources_lookup
283
+ ON history_entry_sources(session_id, source_id);
284
+ CREATE VIRTUAL TABLE IF NOT EXISTS history_entries_fts USING fts5(session_id UNINDEXED, text);
285
+ CREATE TABLE IF NOT EXISTS history_replication_targets (
286
+ session_id TEXT NOT NULL REFERENCES history_sessions(session_id) ON DELETE CASCADE,
287
+ endpoint TEXT NOT NULL,
288
+ PRIMARY KEY (session_id, endpoint)
289
+ );
290
+ CREATE TABLE IF NOT EXISTS history_outbox (
291
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
292
+ endpoint TEXT NOT NULL,
293
+ payload_json TEXT NOT NULL
294
+ );
295
+ CREATE INDEX IF NOT EXISTS history_outbox_target ON history_outbox(endpoint, id);
296
+ `);
297
+ }
298
+ requireSession(sessionId) {
299
+ const row = this.database
300
+ .prepare("SELECT 1 AS found FROM history_sessions WHERE session_id = ?")
301
+ .get(sessionId);
302
+ if (!row)
303
+ throw new Error(`history session '${sessionId}' was not created`);
304
+ }
305
+ enqueue(endpoint, operation) {
306
+ this.database
307
+ .prepare("INSERT INTO history_outbox (endpoint, payload_json) VALUES (?, ?)")
308
+ .run(endpoint, JSON.stringify(operation));
309
+ }
310
+ transaction(handler) {
311
+ this.database.exec("BEGIN IMMEDIATE");
312
+ try {
313
+ const result = handler();
314
+ this.database.exec("COMMIT");
315
+ return result;
316
+ }
317
+ catch (error) {
318
+ this.database.exec("ROLLBACK");
319
+ throw error;
320
+ }
321
+ }
322
+ }
323
+ function stableJson(value) {
324
+ return JSON.stringify(Object.fromEntries(Object.entries(value).sort(([a], [b]) => a.localeCompare(b))));
325
+ }
326
+ function descriptorFromRow(row) {
327
+ const title = typeof row.digest_title === "string" ? row.digest_title : undefined;
328
+ const summary = typeof row.digest_summary === "string" ? row.digest_summary : undefined;
329
+ const updatedThroughEntryId = typeof row.digest_through_entry_id === "string" ? row.digest_through_entry_id : undefined;
330
+ const rawSnippets = typeof row.snippets === "string" ? row.snippets.split("\n") : [];
331
+ return {
332
+ sessionId: String(row.session_id),
333
+ attributes: JSON.parse(String(row.attributes_json)),
334
+ createdAt: Number(row.created_at),
335
+ updatedAt: Number(row.updated_at),
336
+ ...(title && summary && updatedThroughEntryId
337
+ ? { digest: { title, summary, updatedThroughEntryId } }
338
+ : {}),
339
+ snippets: rawSnippets.filter(Boolean).slice(0, MAX_SEARCH_SNIPPETS),
340
+ };
341
+ }
342
+ function historyEntrySearchText(entry) {
343
+ if (entry.type === "tool") {
344
+ return [entry.name, stringifySearchValue(entry.arguments), stringifySearchValue(entry.result)]
345
+ .filter(Boolean)
346
+ .join("\n");
347
+ }
348
+ return stringifySearchValue(entry.content);
349
+ }
350
+ function stringifySearchValue(value) {
351
+ if (typeof value === "string")
352
+ return value;
353
+ if (Array.isArray(value))
354
+ return value.map(stringifySearchValue).filter(Boolean).join("\n");
355
+ if (typeof value !== "object" || value === null)
356
+ return "";
357
+ return Object.values(value).map(stringifySearchValue).filter(Boolean).join("\n");
358
+ }
359
+ function buildFtsQuery(query) {
360
+ const terms = query.match(/[\p{L}\p{N}_-]+/gu) ?? [];
361
+ if (terms.length === 0)
362
+ return `"${query.replaceAll('"', '""')}"`;
363
+ return terms.map((term) => `"${term.replaceAll('"', '""')}"`).join(" AND ");
364
+ }
365
+ function selectHistoryReadPage(candidates, limit) {
366
+ let count = 0;
367
+ let bytes = 0;
368
+ for (const candidate of candidates.slice(0, limit)) {
369
+ const nextBytes = bytes + Number(candidate.payload_bytes) + 1;
370
+ if (count > 0 && nextBytes > HISTORY_READ_PAGE_MAX_BYTES)
371
+ break;
372
+ count += 1;
373
+ bytes = nextBytes;
374
+ }
375
+ return count;
376
+ }
377
+ function encodeOffsetCursor(offset) {
378
+ return Buffer.from(JSON.stringify({ offset })).toString("base64url");
379
+ }
380
+ function decodeOffsetCursor(cursor) {
381
+ if (!cursor)
382
+ return 0;
383
+ try {
384
+ const parsed = JSON.parse(Buffer.from(cursor, "base64url").toString("utf8"));
385
+ if (Number.isSafeInteger(parsed.offset) && Number(parsed.offset) >= 0) {
386
+ return Number(parsed.offset);
387
+ }
388
+ }
389
+ catch { }
390
+ throw new Error("invalid history search cursor");
391
+ }
392
+ function encodePositionCursor(position) {
393
+ return Buffer.from(JSON.stringify({ position })).toString("base64url");
394
+ }
395
+ function decodePositionCursor(cursor) {
396
+ if (!cursor)
397
+ return 0;
398
+ try {
399
+ const parsed = JSON.parse(Buffer.from(cursor, "base64url").toString("utf8"));
400
+ if (Number.isSafeInteger(parsed.position) && Number(parsed.position) >= 0) {
401
+ return Number(parsed.position);
402
+ }
403
+ }
404
+ catch { }
405
+ throw new Error("invalid history read cursor");
406
+ }
407
+ //# sourceMappingURL=local_history_store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local_history_store.js","sourceRoot":"","sources":["../../../src/core/history/local_history_store.ts"],"names":[],"mappings":"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"}