atom-lite 0.0.0-stage → 0.4.1

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 (250) hide show
  1. package/CHANGELOG.md +72 -0
  2. package/LICENSE +21 -0
  3. package/README.md +313 -2
  4. package/dist/agent/loop.d.ts +32 -0
  5. package/dist/agent/loop.js +204 -0
  6. package/dist/agent/loop.js.map +1 -0
  7. package/dist/agent/types.d.ts +85 -0
  8. package/dist/agent/types.js +2 -0
  9. package/dist/agent/types.js.map +1 -0
  10. package/dist/cli/activity.d.ts +45 -0
  11. package/dist/cli/activity.js +141 -0
  12. package/dist/cli/activity.js.map +1 -0
  13. package/dist/cli/app.d.ts +1 -0
  14. package/dist/cli/app.js +1576 -0
  15. package/dist/cli/app.js.map +1 -0
  16. package/dist/cli/approval-prompt.d.ts +24 -0
  17. package/dist/cli/approval-prompt.js +82 -0
  18. package/dist/cli/approval-prompt.js.map +1 -0
  19. package/dist/cli/approvals.d.ts +1 -0
  20. package/dist/cli/approvals.js +2 -0
  21. package/dist/cli/approvals.js.map +1 -0
  22. package/dist/cli/banner.d.ts +12 -0
  23. package/dist/cli/banner.js +35 -0
  24. package/dist/cli/banner.js.map +1 -0
  25. package/dist/cli/commands.d.ts +94 -0
  26. package/dist/cli/commands.js +324 -0
  27. package/dist/cli/commands.js.map +1 -0
  28. package/dist/cli/diff.d.ts +1 -0
  29. package/dist/cli/diff.js +28 -0
  30. package/dist/cli/diff.js.map +1 -0
  31. package/dist/cli/input.d.ts +2 -0
  32. package/dist/cli/input.js +10 -0
  33. package/dist/cli/input.js.map +1 -0
  34. package/dist/cli/main.d.ts +2 -0
  35. package/dist/cli/main.js +22 -0
  36. package/dist/cli/main.js.map +1 -0
  37. package/dist/cli/mouse.d.ts +54 -0
  38. package/dist/cli/mouse.js +83 -0
  39. package/dist/cli/mouse.js.map +1 -0
  40. package/dist/cli/palette.d.ts +41 -0
  41. package/dist/cli/palette.js +212 -0
  42. package/dist/cli/palette.js.map +1 -0
  43. package/dist/cli/panel.d.ts +29 -0
  44. package/dist/cli/panel.js +48 -0
  45. package/dist/cli/panel.js.map +1 -0
  46. package/dist/cli/picker.d.ts +34 -0
  47. package/dist/cli/picker.js +173 -0
  48. package/dist/cli/picker.js.map +1 -0
  49. package/dist/cli/renderer.d.ts +1 -0
  50. package/dist/cli/renderer.js +5 -0
  51. package/dist/cli/renderer.js.map +1 -0
  52. package/dist/cli/secret-input.d.ts +21 -0
  53. package/dist/cli/secret-input.js +101 -0
  54. package/dist/cli/secret-input.js.map +1 -0
  55. package/dist/cli/status-line.d.ts +24 -0
  56. package/dist/cli/status-line.js +49 -0
  57. package/dist/cli/status-line.js.map +1 -0
  58. package/dist/cli/stream-text.d.ts +18 -0
  59. package/dist/cli/stream-text.js +63 -0
  60. package/dist/cli/stream-text.js.map +1 -0
  61. package/dist/cli/theme.d.ts +48 -0
  62. package/dist/cli/theme.js +158 -0
  63. package/dist/cli/theme.js.map +1 -0
  64. package/dist/cli/tool-box.d.ts +41 -0
  65. package/dist/cli/tool-box.js +177 -0
  66. package/dist/cli/tool-box.js.map +1 -0
  67. package/dist/cli/transcript.d.ts +26 -0
  68. package/dist/cli/transcript.js +64 -0
  69. package/dist/cli/transcript.js.map +1 -0
  70. package/dist/config/credentials.d.ts +26 -0
  71. package/dist/config/credentials.js +79 -0
  72. package/dist/config/credentials.js.map +1 -0
  73. package/dist/config/defaults.d.ts +34 -0
  74. package/dist/config/defaults.js +35 -0
  75. package/dist/config/defaults.js.map +1 -0
  76. package/dist/config/load.d.ts +9 -0
  77. package/dist/config/load.js +137 -0
  78. package/dist/config/load.js.map +1 -0
  79. package/dist/config/paths.d.ts +4 -0
  80. package/dist/config/paths.js +14 -0
  81. package/dist/config/paths.js.map +1 -0
  82. package/dist/config/schema.d.ts +132 -0
  83. package/dist/config/schema.js +83 -0
  84. package/dist/config/schema.js.map +1 -0
  85. package/dist/config/write.d.ts +20 -0
  86. package/dist/config/write.js +70 -0
  87. package/dist/config/write.js.map +1 -0
  88. package/dist/context/budget.d.ts +2 -0
  89. package/dist/context/budget.js +13 -0
  90. package/dist/context/budget.js.map +1 -0
  91. package/dist/context/builder.d.ts +7 -0
  92. package/dist/context/builder.js +11 -0
  93. package/dist/context/builder.js.map +1 -0
  94. package/dist/context/compaction.d.ts +1 -0
  95. package/dist/context/compaction.js +5 -0
  96. package/dist/context/compaction.js.map +1 -0
  97. package/dist/context/instructions.d.ts +3 -0
  98. package/dist/context/instructions.js +30 -0
  99. package/dist/context/instructions.js.map +1 -0
  100. package/dist/context/manager.d.ts +29 -0
  101. package/dist/context/manager.js +122 -0
  102. package/dist/context/manager.js.map +1 -0
  103. package/dist/extensions/api.d.ts +51 -0
  104. package/dist/extensions/api.js +101 -0
  105. package/dist/extensions/api.js.map +1 -0
  106. package/dist/extensions/discovery.d.ts +26 -0
  107. package/dist/extensions/discovery.js +243 -0
  108. package/dist/extensions/discovery.js.map +1 -0
  109. package/dist/extensions/loader.d.ts +27 -0
  110. package/dist/extensions/loader.js +113 -0
  111. package/dist/extensions/loader.js.map +1 -0
  112. package/dist/extensions/trust.d.ts +4 -0
  113. package/dist/extensions/trust.js +40 -0
  114. package/dist/extensions/trust.js.map +1 -0
  115. package/dist/extensions/types.d.ts +52 -0
  116. package/dist/extensions/types.js +2 -0
  117. package/dist/extensions/types.js.map +1 -0
  118. package/dist/index.d.ts +17 -0
  119. package/dist/index.js +17 -0
  120. package/dist/index.js.map +1 -0
  121. package/dist/mcp/client.d.ts +73 -0
  122. package/dist/mcp/client.js +363 -0
  123. package/dist/mcp/client.js.map +1 -0
  124. package/dist/mcp/format.d.ts +3 -0
  125. package/dist/mcp/format.js +37 -0
  126. package/dist/mcp/format.js.map +1 -0
  127. package/dist/mcp/index.d.ts +6 -0
  128. package/dist/mcp/index.js +7 -0
  129. package/dist/mcp/index.js.map +1 -0
  130. package/dist/mcp/manager.d.ts +53 -0
  131. package/dist/mcp/manager.js +349 -0
  132. package/dist/mcp/manager.js.map +1 -0
  133. package/dist/mcp/stdio-transport.d.ts +26 -0
  134. package/dist/mcp/stdio-transport.js +191 -0
  135. package/dist/mcp/stdio-transport.js.map +1 -0
  136. package/dist/mcp/tools.d.ts +22 -0
  137. package/dist/mcp/tools.js +162 -0
  138. package/dist/mcp/tools.js.map +1 -0
  139. package/dist/mcp/types.d.ts +92 -0
  140. package/dist/mcp/types.js +2 -0
  141. package/dist/mcp/types.js.map +1 -0
  142. package/dist/providers/catalog.d.ts +60 -0
  143. package/dist/providers/catalog.js +289 -0
  144. package/dist/providers/catalog.js.map +1 -0
  145. package/dist/providers/context-window.d.ts +11 -0
  146. package/dist/providers/context-window.js +87 -0
  147. package/dist/providers/context-window.js.map +1 -0
  148. package/dist/providers/factory.d.ts +2 -0
  149. package/dist/providers/factory.js +55 -0
  150. package/dist/providers/factory.js.map +1 -0
  151. package/dist/providers/fake.d.ts +14 -0
  152. package/dist/providers/fake.js +23 -0
  153. package/dist/providers/fake.js.map +1 -0
  154. package/dist/providers/gemini.d.ts +24 -0
  155. package/dist/providers/gemini.js +228 -0
  156. package/dist/providers/gemini.js.map +1 -0
  157. package/dist/providers/index.d.ts +5 -0
  158. package/dist/providers/index.js +4 -0
  159. package/dist/providers/index.js.map +1 -0
  160. package/dist/providers/ollama.d.ts +64 -0
  161. package/dist/providers/ollama.js +433 -0
  162. package/dist/providers/ollama.js.map +1 -0
  163. package/dist/providers/openai-compatible.d.ts +27 -0
  164. package/dist/providers/openai-compatible.js +282 -0
  165. package/dist/providers/openai-compatible.js.map +1 -0
  166. package/dist/providers/registry.d.ts +7 -0
  167. package/dist/providers/registry.js +13 -0
  168. package/dist/providers/registry.js.map +1 -0
  169. package/dist/providers/tool-calls.d.ts +18 -0
  170. package/dist/providers/tool-calls.js +42 -0
  171. package/dist/providers/tool-calls.js.map +1 -0
  172. package/dist/providers/types.d.ts +16 -0
  173. package/dist/providers/types.js +2 -0
  174. package/dist/providers/types.js.map +1 -0
  175. package/dist/runtime/approvals.d.ts +20 -0
  176. package/dist/runtime/approvals.js +20 -0
  177. package/dist/runtime/approvals.js.map +1 -0
  178. package/dist/runtime/executor.d.ts +2 -0
  179. package/dist/runtime/executor.js +4 -0
  180. package/dist/runtime/executor.js.map +1 -0
  181. package/dist/runtime/locks.d.ts +13 -0
  182. package/dist/runtime/locks.js +180 -0
  183. package/dist/runtime/locks.js.map +1 -0
  184. package/dist/runtime/scheduler.d.ts +7 -0
  185. package/dist/runtime/scheduler.js +110 -0
  186. package/dist/runtime/scheduler.js.map +1 -0
  187. package/dist/security/paths.d.ts +1 -0
  188. package/dist/security/paths.js +35 -0
  189. package/dist/security/paths.js.map +1 -0
  190. package/dist/security/process.d.ts +1 -0
  191. package/dist/security/process.js +8 -0
  192. package/dist/security/process.js.map +1 -0
  193. package/dist/security/redaction.d.ts +1 -0
  194. package/dist/security/redaction.js +4 -0
  195. package/dist/security/redaction.js.map +1 -0
  196. package/dist/sessions/events.d.ts +30 -0
  197. package/dist/sessions/events.js +92 -0
  198. package/dist/sessions/events.js.map +1 -0
  199. package/dist/sessions/history.d.ts +18 -0
  200. package/dist/sessions/history.js +76 -0
  201. package/dist/sessions/history.js.map +1 -0
  202. package/dist/sessions/index.d.ts +5 -0
  203. package/dist/sessions/index.js +6 -0
  204. package/dist/sessions/index.js.map +1 -0
  205. package/dist/sessions/recovery.d.ts +6 -0
  206. package/dist/sessions/recovery.js +35 -0
  207. package/dist/sessions/recovery.js.map +1 -0
  208. package/dist/sessions/search.d.ts +16 -0
  209. package/dist/sessions/search.js +136 -0
  210. package/dist/sessions/search.js.map +1 -0
  211. package/dist/sessions/store.d.ts +91 -0
  212. package/dist/sessions/store.js +360 -0
  213. package/dist/sessions/store.js.map +1 -0
  214. package/dist/skills/registry.d.ts +23 -0
  215. package/dist/skills/registry.js +129 -0
  216. package/dist/skills/registry.js.map +1 -0
  217. package/dist/tools/bash.d.ts +2 -0
  218. package/dist/tools/bash.js +159 -0
  219. package/dist/tools/bash.js.map +1 -0
  220. package/dist/tools/diff.d.ts +7 -0
  221. package/dist/tools/diff.js +40 -0
  222. package/dist/tools/diff.js.map +1 -0
  223. package/dist/tools/edit.d.ts +2 -0
  224. package/dist/tools/edit.js +118 -0
  225. package/dist/tools/edit.js.map +1 -0
  226. package/dist/tools/index.d.ts +8 -0
  227. package/dist/tools/index.js +8 -0
  228. package/dist/tools/index.js.map +1 -0
  229. package/dist/tools/read.d.ts +2 -0
  230. package/dist/tools/read.js +138 -0
  231. package/dist/tools/read.js.map +1 -0
  232. package/dist/tools/registry.d.ts +7 -0
  233. package/dist/tools/registry.js +13 -0
  234. package/dist/tools/registry.js.map +1 -0
  235. package/dist/tools/types.d.ts +27 -0
  236. package/dist/tools/types.js +2 -0
  237. package/dist/tools/types.js.map +1 -0
  238. package/dist/tools/webfetch.d.ts +2 -0
  239. package/dist/tools/webfetch.js +97 -0
  240. package/dist/tools/webfetch.js.map +1 -0
  241. package/dist/tools/websearch.d.ts +2 -0
  242. package/dist/tools/websearch.js +88 -0
  243. package/dist/tools/websearch.js.map +1 -0
  244. package/dist/tools/write.d.ts +2 -0
  245. package/dist/tools/write.js +91 -0
  246. package/dist/tools/write.js.map +1 -0
  247. package/dist/types.d.ts +84 -0
  248. package/dist/types.js +10 -0
  249. package/dist/types.js.map +1 -0
  250. package/package.json +74 -4
@@ -0,0 +1,180 @@
1
+ import { resolve } from "node:path";
2
+ import { realpathSync, existsSync } from "node:fs";
3
+ function canonical(key) {
4
+ let cursor = key;
5
+ while (!existsSync(cursor)) {
6
+ const parent = resolve(cursor, "..");
7
+ if (parent === cursor)
8
+ break;
9
+ cursor = parent;
10
+ }
11
+ if (existsSync(cursor)) {
12
+ try {
13
+ const real = realpathSync(cursor);
14
+ return real + key.slice(cursor.length);
15
+ }
16
+ catch {
17
+ // fall through
18
+ }
19
+ }
20
+ return key;
21
+ }
22
+ class RWLock {
23
+ readers = 0;
24
+ writer = false;
25
+ barriers = 0;
26
+ queue = [];
27
+ acquire(mode, signal) {
28
+ const key = ""; // unused; lock instance is per-resource
29
+ return new Promise((resolve, reject) => {
30
+ const waiter = { mode, resolve, reject, signal };
31
+ const tryAcquire = () => {
32
+ if (signal?.aborted)
33
+ return false;
34
+ if (mode === "read") {
35
+ if (!this.writer && this.barriers === 0 && this.queue.length === 0) {
36
+ this.readers++;
37
+ waiter.resolve(() => {
38
+ this.readers--;
39
+ this.drain();
40
+ });
41
+ return true;
42
+ }
43
+ }
44
+ else if (mode === "write") {
45
+ if (this.readers === 0 && !this.writer && this.barriers === 0) {
46
+ this.writer = true;
47
+ waiter.resolve(() => {
48
+ this.writer = false;
49
+ this.drain();
50
+ });
51
+ return true;
52
+ }
53
+ }
54
+ else {
55
+ // Barriers are shared with other barriers but exclusive with all
56
+ // file reads and writes.
57
+ if (this.readers === 0 && !this.writer && this.queue.length === 0) {
58
+ this.barriers++;
59
+ waiter.resolve(() => {
60
+ this.barriers--;
61
+ this.drain();
62
+ });
63
+ return true;
64
+ }
65
+ }
66
+ return false;
67
+ };
68
+ if (tryAcquire())
69
+ return;
70
+ this.queue.push(waiter);
71
+ if (signal) {
72
+ const onAbort = () => {
73
+ const idx = this.queue.indexOf(waiter);
74
+ if (idx >= 0)
75
+ this.queue.splice(idx, 1);
76
+ reject(new Error("USER_CANCELLED"));
77
+ };
78
+ signal.addEventListener("abort", onAbort, { once: true });
79
+ }
80
+ });
81
+ }
82
+ drain() {
83
+ // Process waiters in FIFO order; allow consecutive readers.
84
+ let progressed = true;
85
+ while (progressed && this.queue.length > 0) {
86
+ progressed = false;
87
+ // Find next runnable waiter.
88
+ const idx = this.queue.findIndex((w) => {
89
+ if (w.signal?.aborted)
90
+ return true;
91
+ if (w.mode === "read") {
92
+ return !this.writer && this.barriers === 0;
93
+ }
94
+ if (w.mode === "write") {
95
+ return this.readers === 0 && !this.writer && this.barriers === 0;
96
+ }
97
+ return this.readers === 0 && !this.writer;
98
+ });
99
+ if (idx < 0)
100
+ break;
101
+ const w = this.queue.splice(idx, 1)[0];
102
+ if (w.signal?.aborted) {
103
+ w.reject(new Error("USER_CANCELLED"));
104
+ progressed = true;
105
+ continue;
106
+ }
107
+ if (w.mode === "read") {
108
+ this.readers++;
109
+ w.resolve(() => {
110
+ this.readers--;
111
+ this.drain();
112
+ });
113
+ }
114
+ else if (w.mode === "write") {
115
+ this.writer = true;
116
+ w.resolve(() => {
117
+ this.writer = false;
118
+ this.drain();
119
+ });
120
+ }
121
+ else {
122
+ this.barriers++;
123
+ w.resolve(() => {
124
+ this.barriers--;
125
+ this.drain();
126
+ });
127
+ }
128
+ progressed = true;
129
+ // If a writer just acquired, stop allowing more readers this round.
130
+ if (w.mode === "write")
131
+ break;
132
+ }
133
+ }
134
+ }
135
+ export class LockManager {
136
+ locks = new Map();
137
+ global = new RWLock();
138
+ canonicalCache = new Map();
139
+ canonicalKey(key) {
140
+ const cached = this.canonicalCache.get(key);
141
+ if (cached !== undefined)
142
+ return cached;
143
+ const k = canonical(key);
144
+ this.canonicalCache.set(key, k);
145
+ return k;
146
+ }
147
+ getLock(key) {
148
+ const k = this.canonicalKey(key);
149
+ let l = this.locks.get(k);
150
+ if (!l) {
151
+ l = new RWLock();
152
+ this.locks.set(k, l);
153
+ }
154
+ return l;
155
+ }
156
+ async acquireRead(key, signal) {
157
+ const g = await this.global.acquire("read", signal);
158
+ const f = await this.getLock(key).acquire("read", signal);
159
+ return () => {
160
+ f();
161
+ g();
162
+ };
163
+ }
164
+ async acquireWrite(key, signal) {
165
+ const g = await this.global.acquire("read", signal);
166
+ const f = await this.getLock(key).acquire("write", signal);
167
+ return () => {
168
+ f();
169
+ g();
170
+ };
171
+ }
172
+ async acquireGlobal(signal) {
173
+ return this.global.acquire("write", signal);
174
+ }
175
+ /** Shared barrier used by parallel bash calls: exclusive with file ops. */
176
+ async acquireGlobalBarrier(signal) {
177
+ return this.global.acquire("barrier", signal);
178
+ }
179
+ }
180
+ //# sourceMappingURL=locks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"locks.js","sourceRoot":"","sources":["../../src/runtime/locks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { ToolCall } from "../types.js";
2
+ import type { Tool, ToolContext } from "../tools/types.js";
3
+ import type { ToolResult } from "../tools/types.js";
4
+ import { LockManager, type Release } from "./locks.js";
5
+ export declare function executeToolBatch(calls: ToolCall[], toolMap: Map<string, Tool>, ctx: ToolContext, maxParallel: number, signal: AbortSignal, lockManager?: LockManager, bashConcurrency?: "serial" | "parallel"): Promise<ToolResult[]>;
6
+ export { LockManager };
7
+ export type { Release };
@@ -0,0 +1,110 @@
1
+ import { resolve } from "node:path";
2
+ import { LockManager } from "./locks.js";
3
+ function resourceKey(call, workspace) {
4
+ const args = call.arguments ?? {};
5
+ if (call.name === "bash")
6
+ return "__bash__";
7
+ const p = args.path ?? args.cwd ?? "";
8
+ const key = String(p);
9
+ return key === "" ? "" : resolve(workspace, key);
10
+ }
11
+ function isMutation(call) {
12
+ return call.name === "write" || call.name === "edit";
13
+ }
14
+ function isBash(call) {
15
+ return call.name === "bash";
16
+ }
17
+ function isRemote(call) {
18
+ return call.name.startsWith("mcp__");
19
+ }
20
+ export async function executeToolBatch(calls, toolMap, ctx, maxParallel, signal, lockManager, bashConcurrency = "serial") {
21
+ const lm = lockManager ?? new LockManager();
22
+ const n = calls.length;
23
+ const results = new Array(n);
24
+ const acquire = async (call) => {
25
+ if (isBash(call)) {
26
+ return bashConcurrency === "parallel"
27
+ ? lm.acquireGlobalBarrier(signal)
28
+ : lm.acquireGlobal(signal);
29
+ }
30
+ if (call.name === "webfetch" || call.name === "websearch") {
31
+ // No file lock; network-only. Return a no-op release.
32
+ return () => { };
33
+ }
34
+ if (isRemote(call)) {
35
+ // MCP tools own their side effects; Atom-lite cannot infer file paths.
36
+ return () => { };
37
+ }
38
+ const key = resourceKey(call, ctx.workspace);
39
+ if (key === "")
40
+ return () => { };
41
+ if (isMutation(call))
42
+ return lm.acquireWrite(key, signal);
43
+ return lm.acquireRead(key, signal);
44
+ };
45
+ // Concurrency pool
46
+ let active = 0;
47
+ const queue = [];
48
+ function acquireSlot() {
49
+ return new Promise((resolve) => {
50
+ if (active < maxParallel) {
51
+ active++;
52
+ resolve();
53
+ }
54
+ else {
55
+ queue.push(resolve);
56
+ }
57
+ });
58
+ }
59
+ function releaseSlot() {
60
+ if (queue.length > 0) {
61
+ const next = queue.shift();
62
+ next();
63
+ }
64
+ else {
65
+ active--;
66
+ }
67
+ }
68
+ const tasks = calls.map((call, i) => {
69
+ return (async () => {
70
+ if (signal.aborted) {
71
+ results[i] = { toolCallId: call.id, name: call.name, content: "USER_CANCELLED", isError: true };
72
+ return;
73
+ }
74
+ let release;
75
+ await acquireSlot();
76
+ try {
77
+ release = await acquire(call);
78
+ if (signal.aborted) {
79
+ results[i] = { toolCallId: call.id, name: call.name, content: "USER_CANCELLED", isError: true };
80
+ return;
81
+ }
82
+ const tool = toolMap.get(call.name);
83
+ if (!tool) {
84
+ results[i] = { toolCallId: call.id, name: call.name, content: `TOOL_NOT_FOUND: ${call.name}`, isError: true };
85
+ }
86
+ else {
87
+ const r = await tool.execute(call, ctx);
88
+ results[i] = r;
89
+ }
90
+ }
91
+ catch (err) {
92
+ results[i] = {
93
+ toolCallId: call.id,
94
+ name: call.name,
95
+ content: `COMMAND_FAILED: ${err instanceof Error ? err.message : String(err)}`,
96
+ isError: true,
97
+ };
98
+ }
99
+ finally {
100
+ if (release)
101
+ release();
102
+ releaseSlot();
103
+ }
104
+ })();
105
+ });
106
+ await Promise.all(tasks);
107
+ return results;
108
+ }
109
+ export { LockManager };
110
+ //# sourceMappingURL=scheduler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scheduler.js","sourceRoot":"","sources":["../../src/runtime/scheduler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare function isWithinWorkspace(workspace: string, target: string): boolean;
@@ -0,0 +1,35 @@
1
+ import { resolve, relative, isAbsolute, dirname } from "node:path";
2
+ import { realpathSync, existsSync } from "node:fs";
3
+ export function isWithinWorkspace(workspace, target) {
4
+ const ws = resolve(workspace);
5
+ const wsReal = existsSync(ws) ? safeRealpath(ws) : ws;
6
+ const resolvedTarget = resolve(ws, target);
7
+ // Resolve symlinks for the target or, if it does not exist yet, for the
8
+ // nearest existing ancestor, so symlinked parent directories are caught.
9
+ let realTarget = resolvedTarget;
10
+ let cursor = resolvedTarget;
11
+ while (!existsSync(cursor) && cursor !== ws && cursor !== dirname(cursor)) {
12
+ cursor = dirname(cursor);
13
+ }
14
+ if (existsSync(cursor)) {
15
+ try {
16
+ const realCursor = realpathSync(cursor);
17
+ const suffix = resolvedTarget.slice(cursor.length);
18
+ realTarget = realCursor + suffix;
19
+ }
20
+ catch {
21
+ // fall back to lexical
22
+ }
23
+ }
24
+ const rel = relative(wsReal, realTarget);
25
+ return rel === "" || (!rel.startsWith("..") && !isAbsolute(rel));
26
+ }
27
+ function safeRealpath(p) {
28
+ try {
29
+ return realpathSync(p);
30
+ }
31
+ catch {
32
+ return p;
33
+ }
34
+ }
35
+ //# sourceMappingURL=paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/security/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAEnD,MAAM,UAAU,iBAAiB,CAAC,SAAiB,EAAE,MAAc;IACjE,MAAM,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IAC9B,MAAM,MAAM,GAAG,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACtD,MAAM,cAAc,GAAG,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;IAE3C,wEAAwE;IACxE,yEAAyE;IACzE,IAAI,UAAU,GAAG,cAAc,CAAC;IAChC,IAAI,MAAM,GAAG,cAAc,CAAC;IAC5B,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,MAAM,KAAK,EAAE,IAAI,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1E,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC3B,CAAC;IACD,IAAI,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QACvB,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;YACxC,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACnD,UAAU,GAAG,UAAU,GAAG,MAAM,CAAC;QACnC,CAAC;QAAC,MAAM,CAAC;YACP,uBAAuB;QACzB,CAAC;IACH,CAAC;IAED,MAAM,GAAG,GAAG,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACzC,OAAO,GAAG,KAAK,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;AACnE,CAAC;AAED,SAAS,YAAY,CAAC,CAAS;IAC7B,IAAI,CAAC;QACH,OAAO,YAAY,CAAC,CAAC,CAAC,CAAC;IACzB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,CAAC;IACX,CAAC;AACH,CAAC"}
@@ -0,0 +1 @@
1
+ export declare function defaultShell(): string;
@@ -0,0 +1,8 @@
1
+ // Process policy helpers (full implementation in later tickets).
2
+ export function defaultShell() {
3
+ if (process.platform === "win32") {
4
+ return process.env.ComSpec ?? "cmd.exe";
5
+ }
6
+ return process.env.SHELL ?? "/bin/sh";
7
+ }
8
+ //# sourceMappingURL=process.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process.js","sourceRoot":"","sources":["../../src/security/process.ts"],"names":[],"mappings":"AAAA,iEAAiE;AACjE,MAAM,UAAU,YAAY;IAC1B,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,OAAO,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,SAAS,CAAC;IAC1C,CAAC;IACD,OAAO,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,SAAS,CAAC;AACxC,CAAC"}
@@ -0,0 +1 @@
1
+ export declare function redactSecrets(text: string): string;
@@ -0,0 +1,4 @@
1
+ export function redactSecrets(text) {
2
+ return text.replace(/((?:api[_-]?key|token|secret|password|authorization)\s*[:=]\s*)\S+/gi, "$1[REDACTED]");
3
+ }
4
+ //# sourceMappingURL=redaction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redaction.js","sourceRoot":"","sources":["../../src/security/redaction.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,OAAO,IAAI,CAAC,OAAO,CACjB,sEAAsE,EACtE,cAAc,CACf,CAAC;AACJ,CAAC"}
@@ -0,0 +1,30 @@
1
+ import type { Message } from "../types.js";
2
+ export interface SessionEvent {
3
+ type: string;
4
+ timestamp: string;
5
+ sessionId: string;
6
+ seq: number;
7
+ [key: string]: unknown;
8
+ }
9
+ export interface SessionSummary {
10
+ id: string;
11
+ workspace: string;
12
+ provider: string;
13
+ createdAt?: string;
14
+ updatedAt?: string;
15
+ eventCount?: number;
16
+ filePath?: string;
17
+ /** Derived title: first user message or the latest session_renamed title. */
18
+ title?: string;
19
+ /** Number of retained user, assistant, and tool messages. */
20
+ messageCount?: number;
21
+ /** Combined title/content/workspace haystack used by session search. */
22
+ searchText?: string;
23
+ /** Matching excerpt, populated by searchSessions. */
24
+ snippet?: string;
25
+ }
26
+ export declare function contentPartsText(content: unknown): string;
27
+ export declare function nowIso(): string;
28
+ export declare function messageToEvent(message: Message, sessionId: string, seq: number): SessionEvent;
29
+ export declare function eventToMessage(event: SessionEvent): Message | null;
30
+ export declare function isMessage(value: unknown): value is Message;
@@ -0,0 +1,92 @@
1
+ export function contentPartsText(content) {
2
+ if (typeof content === "string")
3
+ return content;
4
+ if (!Array.isArray(content))
5
+ return "";
6
+ return content
7
+ .map((part) => (part?.type === "text" ? String(part.text ?? "") : ""))
8
+ .join("");
9
+ }
10
+ export function nowIso() {
11
+ return new Date().toISOString();
12
+ }
13
+ export function messageToEvent(message, sessionId, seq) {
14
+ const timestamp = nowIso();
15
+ if (message.role === "user") {
16
+ const text = contentPartsText(message.content);
17
+ return {
18
+ type: "user_message",
19
+ timestamp,
20
+ sessionId,
21
+ seq,
22
+ content: text,
23
+ message,
24
+ };
25
+ }
26
+ if (message.role === "assistant") {
27
+ const text = contentPartsText(message.content ?? []);
28
+ return {
29
+ type: "assistant_message",
30
+ timestamp,
31
+ sessionId,
32
+ seq,
33
+ content: text,
34
+ message,
35
+ toolCalls: message.toolCalls,
36
+ };
37
+ }
38
+ if (message.role === "tool") {
39
+ return {
40
+ type: "tool_result",
41
+ timestamp,
42
+ sessionId,
43
+ seq,
44
+ toolCallId: message.toolCallId,
45
+ name: message.name,
46
+ content: message.content,
47
+ };
48
+ }
49
+ return { type: "assistant_message", timestamp, sessionId, seq, message };
50
+ }
51
+ export function eventToMessage(event) {
52
+ if (event.type === "user_message") {
53
+ if (event.message && typeof event.message === "object") {
54
+ return event.message;
55
+ }
56
+ return {
57
+ role: "user",
58
+ content: [{ type: "text", text: String(event.content ?? "") }],
59
+ };
60
+ }
61
+ if (event.type === "assistant_message") {
62
+ if (event.message && typeof event.message === "object") {
63
+ return event.message;
64
+ }
65
+ const toolCalls = Array.isArray(event.toolCalls)
66
+ ? event.toolCalls
67
+ : undefined;
68
+ return {
69
+ role: "assistant",
70
+ content: event.content
71
+ ? [{ type: "text", text: String(event.content) }]
72
+ : undefined,
73
+ toolCalls,
74
+ };
75
+ }
76
+ if (event.type === "tool_result") {
77
+ return {
78
+ role: "tool",
79
+ toolCallId: String(event.toolCallId ?? ""),
80
+ name: String(event.name ?? ""),
81
+ content: String(event.content ?? ""),
82
+ };
83
+ }
84
+ return null;
85
+ }
86
+ export function isMessage(value) {
87
+ if (!value || typeof value !== "object")
88
+ return false;
89
+ const r = value.role;
90
+ return r === "system" || r === "user" || r === "assistant" || r === "tool";
91
+ }
92
+ //# sourceMappingURL=events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/sessions/events.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { Message } from "../types.js";
2
+ import type { SessionEvent } from "./events.js";
3
+ /**
4
+ * Render retained messages for the restored transcript. System messages are
5
+ * omitted: they are prompt scaffolding, not conversation history.
6
+ */
7
+ export declare function sessionHistoryLines(messages: Message[]): string[];
8
+ export interface SessionSelection {
9
+ provider?: string;
10
+ model?: string;
11
+ }
12
+ /** Provider/model last selected inside a session, newest event wins. */
13
+ export declare function sessionSelectionFromEvents(events: SessionEvent[]): SessionSelection;
14
+ /**
15
+ * A short offer to switch provider/model when a resumed session differs from
16
+ * the currently active one.
17
+ */
18
+ export declare function providerSwitchNotice(current: SessionSelection, saved: SessionSelection): string | undefined;
@@ -0,0 +1,76 @@
1
+ import { contentPartsText } from "./events.js";
2
+ function contentText(content) {
3
+ return contentPartsText(content);
4
+ }
5
+ /**
6
+ * Render retained messages for the restored transcript. System messages are
7
+ * omitted: they are prompt scaffolding, not conversation history.
8
+ */
9
+ export function sessionHistoryLines(messages) {
10
+ const lines = [];
11
+ for (const message of messages) {
12
+ if (message.role === "system")
13
+ continue;
14
+ if (message.role === "user") {
15
+ const text = contentText(message.content).trim();
16
+ if (text)
17
+ lines.push(`> ${text}`);
18
+ continue;
19
+ }
20
+ if (message.role === "assistant") {
21
+ const text = contentText(message.content).trim();
22
+ if (text)
23
+ lines.push(text);
24
+ for (const call of message.toolCalls ?? []) {
25
+ const args = JSON.stringify(call.arguments ?? {});
26
+ lines.push(`⚙ ${call.name} ${args}`);
27
+ }
28
+ continue;
29
+ }
30
+ if (message.role === "tool") {
31
+ const text = message.content.trim();
32
+ if (text)
33
+ lines.push(`[${message.name}] ${text}`);
34
+ }
35
+ }
36
+ return lines;
37
+ }
38
+ /** Provider/model last selected inside a session, newest event wins. */
39
+ export function sessionSelectionFromEvents(events) {
40
+ let provider;
41
+ let model;
42
+ for (const event of events) {
43
+ if (event.type === "session_started") {
44
+ provider = typeof event.provider === "string" ? event.provider : provider;
45
+ }
46
+ else if (event.type === "provider_selected" ||
47
+ event.type === "model_switched") {
48
+ provider =
49
+ typeof event.provider === "string" ? event.provider : provider;
50
+ model = typeof event.model === "string" ? event.model : model;
51
+ }
52
+ }
53
+ return { provider, model };
54
+ }
55
+ /**
56
+ * A short offer to switch provider/model when a resumed session differs from
57
+ * the currently active one.
58
+ */
59
+ export function providerSwitchNotice(current, saved) {
60
+ const savedLabel = saved.provider
61
+ ? `${saved.provider}${saved.model ? `/${saved.model}` : ""}`
62
+ : saved.model;
63
+ const currentLabel = current.provider
64
+ ? `${current.provider}${current.model ? `/${current.model}` : ""}`
65
+ : current.model;
66
+ if (!savedLabel || !currentLabel)
67
+ return undefined;
68
+ if (saved.provider && current.provider && saved.provider !== current.provider) {
69
+ return `this session used ${savedLabel}; current provider is ${currentLabel}. Run /model or /provider to switch.`;
70
+ }
71
+ if (saved.model && current.model && saved.model !== current.model) {
72
+ return `this session used ${savedLabel}; current model is ${currentLabel}. Run /model to switch.`;
73
+ }
74
+ return undefined;
75
+ }
76
+ //# sourceMappingURL=history.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history.js","sourceRoot":"","sources":["../../src/sessions/history.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export * from "./store.js";
2
+ export * from "./events.js";
3
+ export * from "./recovery.js";
4
+ export * from "./search.js";
5
+ export * from "./history.js";
@@ -0,0 +1,6 @@
1
+ export * from "./store.js";
2
+ export * from "./events.js";
3
+ export * from "./recovery.js";
4
+ export * from "./search.js";
5
+ export * from "./history.js";
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sessions/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { SessionEvent } from "./events.js";
2
+ export declare function parseJsonlEvents(filePath: string): SessionEvent[];
3
+ export declare function recoverTail(filePath: string): {
4
+ events: SessionEvent[];
5
+ dropped: number;
6
+ };