zilmate 1.3.5 → 1.6.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.
Files changed (270) hide show
  1. package/.env.example +2 -0
  2. package/dist/agents/automation-planner.agent.d.ts +108 -0
  3. package/dist/agents/automation-planner.agent.d.ts.map +1 -1
  4. package/dist/agents/automation-planner.agent.js +13 -4
  5. package/dist/agents/automation-planner.agent.js.map +1 -1
  6. package/dist/agents/coding.agent.d.ts +352 -0
  7. package/dist/agents/coding.agent.d.ts.map +1 -0
  8. package/dist/agents/coding.agent.js +34 -0
  9. package/dist/agents/coding.agent.js.map +1 -0
  10. package/dist/agents/goal-manager.agent.d.ts +125 -0
  11. package/dist/agents/goal-manager.agent.d.ts.map +1 -0
  12. package/dist/agents/goal-manager.agent.js +32 -0
  13. package/dist/agents/goal-manager.agent.js.map +1 -0
  14. package/dist/agents/manager.d.ts +378 -0
  15. package/dist/agents/manager.d.ts.map +1 -1
  16. package/dist/agents/manager.js +113 -18
  17. package/dist/agents/manager.js.map +1 -1
  18. package/dist/agents/security.agent.d.ts +340 -0
  19. package/dist/agents/security.agent.d.ts.map +1 -0
  20. package/dist/agents/security.agent.js +76 -0
  21. package/dist/agents/security.agent.js.map +1 -0
  22. package/dist/cli/ask.d.ts +5 -0
  23. package/dist/cli/ask.d.ts.map +1 -0
  24. package/dist/cli/ask.js +33 -0
  25. package/dist/cli/ask.js.map +1 -0
  26. package/dist/cli/confirm.d.ts.map +1 -1
  27. package/dist/cli/confirm.js +8 -14
  28. package/dist/cli/confirm.js.map +1 -1
  29. package/dist/cli/doctor.d.ts.map +1 -1
  30. package/dist/cli/doctor.js +61 -1
  31. package/dist/cli/doctor.js.map +1 -1
  32. package/dist/cli/format.d.ts +1 -0
  33. package/dist/cli/format.d.ts.map +1 -1
  34. package/dist/cli/format.js +41 -2
  35. package/dist/cli/format.js.map +1 -1
  36. package/dist/cli/interactive.d.ts.map +1 -1
  37. package/dist/cli/interactive.js +6 -2
  38. package/dist/cli/interactive.js.map +1 -1
  39. package/dist/cli/jobs.d.ts +4 -0
  40. package/dist/cli/jobs.d.ts.map +1 -1
  41. package/dist/cli/jobs.js +26 -0
  42. package/dist/cli/jobs.js.map +1 -1
  43. package/dist/cli/prompt.d.ts +9 -0
  44. package/dist/cli/prompt.d.ts.map +1 -0
  45. package/dist/cli/prompt.js +116 -0
  46. package/dist/cli/prompt.js.map +1 -0
  47. package/dist/cli/setup.d.ts.map +1 -1
  48. package/dist/cli/setup.js +95 -20
  49. package/dist/cli/setup.js.map +1 -1
  50. package/dist/cli/spinner.d.ts +6 -0
  51. package/dist/cli/spinner.d.ts.map +1 -0
  52. package/dist/cli/spinner.js +39 -0
  53. package/dist/cli/spinner.js.map +1 -0
  54. package/dist/cli/triggers.d.ts.map +1 -1
  55. package/dist/cli/triggers.js +12 -4
  56. package/dist/cli/triggers.js.map +1 -1
  57. package/dist/cli/tunnel.d.ts +12 -0
  58. package/dist/cli/tunnel.d.ts.map +1 -0
  59. package/dist/cli/tunnel.js +64 -0
  60. package/dist/cli/tunnel.js.map +1 -0
  61. package/dist/cli/voice.d.ts.map +1 -1
  62. package/dist/cli/voice.js +13 -2
  63. package/dist/cli/voice.js.map +1 -1
  64. package/dist/config/env.d.ts +5 -0
  65. package/dist/config/env.d.ts.map +1 -1
  66. package/dist/config/env.js +7 -2
  67. package/dist/config/env.js.map +1 -1
  68. package/dist/config/models.d.ts +1 -0
  69. package/dist/config/models.d.ts.map +1 -1
  70. package/dist/config/models.js +1 -0
  71. package/dist/config/models.js.map +1 -1
  72. package/dist/documents/pdf.d.ts +11 -0
  73. package/dist/documents/pdf.d.ts.map +1 -0
  74. package/dist/documents/pdf.js +64 -0
  75. package/dist/documents/pdf.js.map +1 -0
  76. package/dist/documents/slides.d.ts +13 -0
  77. package/dist/documents/slides.d.ts.map +1 -0
  78. package/dist/documents/slides.js +82 -0
  79. package/dist/documents/slides.js.map +1 -0
  80. package/dist/index.js +72 -3
  81. package/dist/index.js.map +1 -1
  82. package/dist/jobs/anomaly.d.ts +10 -0
  83. package/dist/jobs/anomaly.d.ts.map +1 -0
  84. package/dist/jobs/anomaly.js +52 -0
  85. package/dist/jobs/anomaly.js.map +1 -0
  86. package/dist/jobs/runner.d.ts.map +1 -1
  87. package/dist/jobs/runner.js +6 -0
  88. package/dist/jobs/runner.js.map +1 -1
  89. package/dist/jobs/trigger-orchestrator.d.ts +26 -0
  90. package/dist/jobs/trigger-orchestrator.d.ts.map +1 -0
  91. package/dist/jobs/trigger-orchestrator.js +252 -0
  92. package/dist/jobs/trigger-orchestrator.js.map +1 -0
  93. package/dist/jobs/trigger-policies.d.ts +36 -0
  94. package/dist/jobs/trigger-policies.d.ts.map +1 -0
  95. package/dist/jobs/trigger-policies.js +68 -0
  96. package/dist/jobs/trigger-policies.js.map +1 -0
  97. package/dist/jobs/trigger-router.d.ts +14 -0
  98. package/dist/jobs/trigger-router.d.ts.map +1 -0
  99. package/dist/jobs/trigger-router.js +114 -0
  100. package/dist/jobs/trigger-router.js.map +1 -0
  101. package/dist/jobs/webhook-server.d.ts +7 -0
  102. package/dist/jobs/webhook-server.d.ts.map +1 -0
  103. package/dist/jobs/webhook-server.js +56 -0
  104. package/dist/jobs/webhook-server.js.map +1 -0
  105. package/dist/jobs/workflows.d.ts +4 -1
  106. package/dist/jobs/workflows.d.ts.map +1 -1
  107. package/dist/jobs/workflows.js +18 -42
  108. package/dist/jobs/workflows.js.map +1 -1
  109. package/dist/memory/heal.d.ts +19 -0
  110. package/dist/memory/heal.d.ts.map +1 -0
  111. package/dist/memory/heal.js +253 -0
  112. package/dist/memory/heal.js.map +1 -0
  113. package/dist/memory/knowledge-graph.d.ts +32 -0
  114. package/dist/memory/knowledge-graph.d.ts.map +1 -0
  115. package/dist/memory/knowledge-graph.js +103 -0
  116. package/dist/memory/knowledge-graph.js.map +1 -0
  117. package/dist/memory/local-store.d.ts +1 -0
  118. package/dist/memory/local-store.d.ts.map +1 -1
  119. package/dist/memory/local-store.js +41 -8
  120. package/dist/memory/local-store.js.map +1 -1
  121. package/dist/memory/notebook.d.ts +29 -0
  122. package/dist/memory/notebook.d.ts.map +1 -0
  123. package/dist/memory/notebook.js +64 -0
  124. package/dist/memory/notebook.js.map +1 -0
  125. package/dist/memory/personal-context.d.ts +45 -0
  126. package/dist/memory/personal-context.d.ts.map +1 -0
  127. package/dist/memory/personal-context.js +103 -0
  128. package/dist/memory/personal-context.js.map +1 -0
  129. package/dist/memory/scratchpad.d.ts.map +1 -1
  130. package/dist/memory/scratchpad.js +30 -4
  131. package/dist/memory/scratchpad.js.map +1 -1
  132. package/dist/runtime/ask.d.ts +15 -0
  133. package/dist/runtime/ask.d.ts.map +1 -0
  134. package/dist/runtime/ask.js +23 -0
  135. package/dist/runtime/ask.js.map +1 -0
  136. package/dist/runtime/confirm.d.ts +3 -0
  137. package/dist/runtime/confirm.d.ts.map +1 -1
  138. package/dist/runtime/confirm.js +38 -12
  139. package/dist/runtime/confirm.js.map +1 -1
  140. package/dist/runtime/progress.d.ts +2 -1
  141. package/dist/runtime/progress.d.ts.map +1 -1
  142. package/dist/runtime/progress.js +3 -0
  143. package/dist/runtime/progress.js.map +1 -1
  144. package/dist/runtime/voice-confirm.d.ts +8 -0
  145. package/dist/runtime/voice-confirm.d.ts.map +1 -0
  146. package/dist/runtime/voice-confirm.js +67 -0
  147. package/dist/runtime/voice-confirm.js.map +1 -0
  148. package/dist/safety/trust-log.d.ts +23 -0
  149. package/dist/safety/trust-log.d.ts.map +1 -0
  150. package/dist/safety/trust-log.js +57 -0
  151. package/dist/safety/trust-log.js.map +1 -0
  152. package/dist/server.d.ts +2 -0
  153. package/dist/server.d.ts.map +1 -1
  154. package/dist/server.js +2 -0
  155. package/dist/server.js.map +1 -1
  156. package/dist/skills/loader.d.ts +14 -0
  157. package/dist/skills/loader.d.ts.map +1 -0
  158. package/dist/skills/loader.js +108 -0
  159. package/dist/skills/loader.js.map +1 -0
  160. package/dist/skills/registry.d.ts +22 -0
  161. package/dist/skills/registry.d.ts.map +1 -0
  162. package/dist/skills/registry.js +120 -0
  163. package/dist/skills/registry.js.map +1 -0
  164. package/dist/tools/ask.tool.d.ts +23 -0
  165. package/dist/tools/ask.tool.d.ts.map +1 -0
  166. package/dist/tools/ask.tool.js +47 -0
  167. package/dist/tools/ask.tool.js.map +1 -0
  168. package/dist/tools/cli-runner.d.ts +13 -0
  169. package/dist/tools/cli-runner.d.ts.map +1 -0
  170. package/dist/tools/cli-runner.js +75 -0
  171. package/dist/tools/cli-runner.js.map +1 -0
  172. package/dist/tools/computer-use.tool.d.ts +159 -0
  173. package/dist/tools/computer-use.tool.d.ts.map +1 -0
  174. package/dist/tools/computer-use.tool.js +357 -0
  175. package/dist/tools/computer-use.tool.js.map +1 -0
  176. package/dist/tools/desktop.tool.d.ts.map +1 -1
  177. package/dist/tools/desktop.tool.js +3 -2
  178. package/dist/tools/desktop.tool.js.map +1 -1
  179. package/dist/tools/documents.tool.d.ts +31 -0
  180. package/dist/tools/documents.tool.d.ts.map +1 -0
  181. package/dist/tools/documents.tool.js +62 -0
  182. package/dist/tools/documents.tool.js.map +1 -0
  183. package/dist/tools/git.tool.d.ts +77 -0
  184. package/dist/tools/git.tool.d.ts.map +1 -0
  185. package/dist/tools/git.tool.js +189 -0
  186. package/dist/tools/git.tool.js.map +1 -0
  187. package/dist/tools/heal.tool.d.ts +13 -0
  188. package/dist/tools/heal.tool.d.ts.map +1 -0
  189. package/dist/tools/heal.tool.js +34 -0
  190. package/dist/tools/heal.tool.js.map +1 -0
  191. package/dist/tools/image-generate.tool.d.ts.map +1 -1
  192. package/dist/tools/image-generate.tool.js +2 -1
  193. package/dist/tools/image-generate.tool.js.map +1 -1
  194. package/dist/tools/knowledge.tool.d.ts +24 -0
  195. package/dist/tools/knowledge.tool.d.ts.map +1 -0
  196. package/dist/tools/knowledge.tool.js +52 -0
  197. package/dist/tools/knowledge.tool.js.map +1 -0
  198. package/dist/tools/notebook.tool.d.ts +32 -0
  199. package/dist/tools/notebook.tool.d.ts.map +1 -0
  200. package/dist/tools/notebook.tool.js +50 -0
  201. package/dist/tools/notebook.tool.js.map +1 -0
  202. package/dist/tools/notify.tool.d.ts +26 -0
  203. package/dist/tools/notify.tool.d.ts.map +1 -0
  204. package/dist/tools/notify.tool.js +65 -0
  205. package/dist/tools/notify.tool.js.map +1 -0
  206. package/dist/tools/orchestration.tool.d.ts +83 -0
  207. package/dist/tools/orchestration.tool.d.ts.map +1 -0
  208. package/dist/tools/orchestration.tool.js +154 -0
  209. package/dist/tools/orchestration.tool.js.map +1 -0
  210. package/dist/tools/osint-install.tool.d.ts +35 -0
  211. package/dist/tools/osint-install.tool.d.ts.map +1 -0
  212. package/dist/tools/osint-install.tool.js +334 -0
  213. package/dist/tools/osint-install.tool.js.map +1 -0
  214. package/dist/tools/osint.tool.d.ts +445 -0
  215. package/dist/tools/osint.tool.d.ts.map +1 -0
  216. package/dist/tools/osint.tool.js +633 -0
  217. package/dist/tools/osint.tool.js.map +1 -0
  218. package/dist/tools/pentest-install.tool.d.ts +32 -0
  219. package/dist/tools/pentest-install.tool.d.ts.map +1 -0
  220. package/dist/tools/pentest-install.tool.js +201 -0
  221. package/dist/tools/pentest-install.tool.js.map +1 -0
  222. package/dist/tools/pentest.tool.d.ts +595 -0
  223. package/dist/tools/pentest.tool.d.ts.map +1 -0
  224. package/dist/tools/pentest.tool.js +844 -0
  225. package/dist/tools/pentest.tool.js.map +1 -0
  226. package/dist/tools/personal-context.tool.d.ts +32 -0
  227. package/dist/tools/personal-context.tool.d.ts.map +1 -0
  228. package/dist/tools/personal-context.tool.js +76 -0
  229. package/dist/tools/personal-context.tool.js.map +1 -0
  230. package/dist/tools/setup-assistant.tool.d.ts +49 -0
  231. package/dist/tools/setup-assistant.tool.d.ts.map +1 -0
  232. package/dist/tools/setup-assistant.tool.js +139 -0
  233. package/dist/tools/setup-assistant.tool.js.map +1 -0
  234. package/dist/tools/skills.tool.d.ts +38 -0
  235. package/dist/tools/skills.tool.d.ts.map +1 -0
  236. package/dist/tools/skills.tool.js +77 -0
  237. package/dist/tools/skills.tool.js.map +1 -0
  238. package/dist/tools/trust.tool.d.ts +16 -0
  239. package/dist/tools/trust.tool.d.ts.map +1 -0
  240. package/dist/tools/trust.tool.js +34 -0
  241. package/dist/tools/trust.tool.js.map +1 -0
  242. package/dist/tools/update.tool.d.ts +25 -0
  243. package/dist/tools/update.tool.d.ts.map +1 -0
  244. package/dist/tools/update.tool.js +64 -0
  245. package/dist/tools/update.tool.js.map +1 -0
  246. package/dist/tools/workspace.tool.d.ts +24 -0
  247. package/dist/tools/workspace.tool.d.ts.map +1 -0
  248. package/dist/tools/workspace.tool.js +64 -0
  249. package/dist/tools/workspace.tool.js.map +1 -0
  250. package/dist/voice/cascade.d.ts.map +1 -1
  251. package/dist/voice/cascade.js +75 -24
  252. package/dist/voice/cascade.js.map +1 -1
  253. package/dist/voice/deepgram.d.ts.map +1 -1
  254. package/dist/voice/deepgram.js +8 -1
  255. package/dist/voice/deepgram.js.map +1 -1
  256. package/dist/voice/types.d.ts +4 -0
  257. package/dist/voice/types.d.ts.map +1 -1
  258. package/dist/workspace/init.d.ts +3 -0
  259. package/dist/workspace/init.d.ts.map +1 -0
  260. package/dist/workspace/init.js +75 -0
  261. package/dist/workspace/init.js.map +1 -0
  262. package/dist/workspace/output-paths.d.ts +3 -0
  263. package/dist/workspace/output-paths.d.ts.map +1 -0
  264. package/dist/workspace/output-paths.js +18 -0
  265. package/dist/workspace/output-paths.js.map +1 -0
  266. package/dist/workspace/paths.d.ts +26 -0
  267. package/dist/workspace/paths.d.ts.map +1 -0
  268. package/dist/workspace/paths.js +48 -0
  269. package/dist/workspace/paths.js.map +1 -0
  270. package/package.json +5 -1
@@ -0,0 +1,29 @@
1
+ export type NotebookEntry = {
2
+ id: string;
3
+ title: string;
4
+ body: string;
5
+ tags: string[];
6
+ createdAt: string;
7
+ updatedAt: string;
8
+ };
9
+ export type NotesStore = {
10
+ entries: NotebookEntry[];
11
+ };
12
+ export declare function appendNotebookMarkdown(section: string, content: string): Promise<{
13
+ path: string;
14
+ section: string;
15
+ appendedAt: string;
16
+ }>;
17
+ export declare function readNotebookMarkdown(): Promise<string>;
18
+ export declare function addNotebookEntry(input: {
19
+ title: string;
20
+ body: string;
21
+ tags?: string[];
22
+ }): Promise<NotebookEntry>;
23
+ export declare function listNotebookEntries(limit?: number): Promise<NotebookEntry[]>;
24
+ export declare function searchNotebook(query: string, limit?: number): Promise<NotebookEntry[]>;
25
+ export declare function getNotebookPaths(): Promise<{
26
+ markdown: string;
27
+ json: string;
28
+ }>;
29
+ //# sourceMappingURL=notebook.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notebook.d.ts","sourceRoot":"","sources":["../../src/memory/notebook.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,aAAa,GAAG;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,OAAO,EAAE,aAAa,EAAE,CAAC;CAC1B,CAAC;AAgBF,wBAAsB,sBAAsB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;;;;GAM5E;AAED,wBAAsB,oBAAoB,oBAIzC;AAED,wBAAsB,gBAAgB,CAAC,KAAK,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,0BAe7F;AAED,wBAAsB,mBAAmB,CAAC,KAAK,SAAK,4BAGnD;AAED,wBAAsB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,SAAK,4BAS7D;AAED,wBAAsB,gBAAgB;;;GAGrC"}
@@ -0,0 +1,64 @@
1
+ import { readFile, writeFile, appendFile } from 'node:fs/promises';
2
+ import { existsSync } from 'node:fs';
3
+ import { workspaceLayout } from '../workspace/paths.js';
4
+ async function readNotesJson() {
5
+ const path = workspaceLayout().notesJson;
6
+ if (!existsSync(path))
7
+ return { entries: [] };
8
+ try {
9
+ return JSON.parse(await readFile(path, 'utf8'));
10
+ }
11
+ catch {
12
+ return { entries: [] };
13
+ }
14
+ }
15
+ async function writeNotesJson(store) {
16
+ await writeFile(workspaceLayout().notesJson, JSON.stringify(store, null, 2), 'utf8');
17
+ }
18
+ export async function appendNotebookMarkdown(section, content) {
19
+ const layout = workspaceLayout();
20
+ const stamp = new Date().toISOString();
21
+ const block = `\n## ${section}\n_${stamp}_\n\n${content.trim()}\n`;
22
+ await appendFile(layout.notebook, block, 'utf8');
23
+ return { path: layout.notebook, section, appendedAt: stamp };
24
+ }
25
+ export async function readNotebookMarkdown() {
26
+ const path = workspaceLayout().notebook;
27
+ if (!existsSync(path))
28
+ return '';
29
+ return readFile(path, 'utf8');
30
+ }
31
+ export async function addNotebookEntry(input) {
32
+ const store = await readNotesJson();
33
+ const now = new Date().toISOString();
34
+ const entry = {
35
+ id: `note_${Date.now()}`,
36
+ title: input.title.trim(),
37
+ body: input.body.trim(),
38
+ tags: input.tags ?? [],
39
+ createdAt: now,
40
+ updatedAt: now,
41
+ };
42
+ store.entries.unshift(entry);
43
+ await writeNotesJson(store);
44
+ await appendNotebookMarkdown(entry.title, entry.body);
45
+ return entry;
46
+ }
47
+ export async function listNotebookEntries(limit = 20) {
48
+ const store = await readNotesJson();
49
+ return store.entries.slice(0, limit);
50
+ }
51
+ export async function searchNotebook(query, limit = 10) {
52
+ const q = query.trim().toLowerCase();
53
+ const store = await readNotesJson();
54
+ return store.entries
55
+ .filter((entry) => entry.title.toLowerCase().includes(q)
56
+ || entry.body.toLowerCase().includes(q)
57
+ || entry.tags.some((tag) => tag.toLowerCase().includes(q)))
58
+ .slice(0, limit);
59
+ }
60
+ export async function getNotebookPaths() {
61
+ const layout = workspaceLayout();
62
+ return { markdown: layout.notebook, json: layout.notesJson };
63
+ }
64
+ //# sourceMappingURL=notebook.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notebook.js","sourceRoot":"","sources":["../../src/memory/notebook.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ export type PersonalContact = {
2
+ id: string;
3
+ name: string;
4
+ email?: string;
5
+ handle?: string;
6
+ role?: string;
7
+ vip: boolean;
8
+ notes?: string;
9
+ };
10
+ export type PersonalProject = {
11
+ id: string;
12
+ name: string;
13
+ status: 'active' | 'paused' | 'done';
14
+ description?: string;
15
+ tags: string[];
16
+ };
17
+ export type PersonalContext = {
18
+ ownerName?: string;
19
+ businessName?: string;
20
+ urgencyRules: string[];
21
+ workflows: string[];
22
+ contacts: PersonalContact[];
23
+ projects: PersonalProject[];
24
+ updatedAt: string;
25
+ };
26
+ export declare function loadPersonalContext(): Promise<PersonalContext>;
27
+ export declare function savePersonalContext(context: PersonalContext): Promise<{
28
+ updatedAt: string;
29
+ ownerName?: string;
30
+ businessName?: string;
31
+ urgencyRules: string[];
32
+ workflows: string[];
33
+ contacts: PersonalContact[];
34
+ projects: PersonalProject[];
35
+ }>;
36
+ export declare function formatPersonalContextForPrompt(context: PersonalContext): string;
37
+ export declare function upsertContact(input: Omit<PersonalContact, 'id'> & {
38
+ id?: string;
39
+ }): Promise<PersonalContact>;
40
+ export declare function upsertProject(input: Omit<PersonalProject, 'id'> & {
41
+ id?: string;
42
+ }): Promise<PersonalProject>;
43
+ export declare function addUrgencyRule(rule: string): Promise<string[]>;
44
+ export declare function addWorkflow(note: string): Promise<string[]>;
45
+ //# sourceMappingURL=personal-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"personal-context.d.ts","sourceRoot":"","sources":["../../src/memory/personal-context.ts"],"names":[],"mappings":"AAOA,MAAM,MAAM,eAAe,GAAG;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,OAAO,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAAC;IACrC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAUF,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,eAAe,CAAC,CAOpE;AAED,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,eAAe;;gBA1BpD,MAAM;mBACH,MAAM;kBACP,MAAM,EAAE;eACX,MAAM,EAAE;cACT,eAAe,EAAE;cACjB,eAAe,EAAE;GA8B5B;AAED,wBAAgB,8BAA8B,CAAC,OAAO,EAAE,eAAe,UAyBtE;AAED,wBAAsB,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,GAAG;IAAE,EAAE,CAAC,EAAE,MAAM,CAAA;CAAE,4BASvF;AAED,wBAAsB,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,GAAG;IAAE,EAAE,CAAC,EAAE,MAAM,CAAA;CAAE,4BASvF;AAED,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,qBAMhD;AAED,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,qBAM7C"}
@@ -0,0 +1,103 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { readJson, writeJson } from './local-store.js';
3
+ import { getRedis } from './redis.js';
4
+ const contextKey = 'zilo-manager:personal-context:v1';
5
+ const contextFile = 'personal-context.json';
6
+ const emptyContext = () => ({
7
+ urgencyRules: [],
8
+ workflows: [],
9
+ contacts: [],
10
+ projects: [],
11
+ updatedAt: new Date().toISOString(),
12
+ });
13
+ export async function loadPersonalContext() {
14
+ const redis = getRedis();
15
+ if (redis) {
16
+ const stored = await redis.get(contextKey);
17
+ if (stored)
18
+ return stored;
19
+ }
20
+ return readJson(contextFile, emptyContext());
21
+ }
22
+ export async function savePersonalContext(context) {
23
+ const next = { ...context, updatedAt: new Date().toISOString() };
24
+ const redis = getRedis();
25
+ if (redis) {
26
+ await redis.set(contextKey, next);
27
+ return next;
28
+ }
29
+ await writeJson(contextFile, next);
30
+ return next;
31
+ }
32
+ export function formatPersonalContextForPrompt(context) {
33
+ const lines = [];
34
+ if (context.ownerName)
35
+ lines.push(`Owner: ${context.ownerName}`);
36
+ if (context.businessName)
37
+ lines.push(`Business: ${context.businessName}`);
38
+ if (context.urgencyRules.length) {
39
+ lines.push('Urgency rules:');
40
+ for (const rule of context.urgencyRules)
41
+ lines.push(`- ${rule}`);
42
+ }
43
+ if (context.workflows.length) {
44
+ lines.push('Workflows:');
45
+ for (const workflow of context.workflows)
46
+ lines.push(`- ${workflow}`);
47
+ }
48
+ const vips = context.contacts.filter((c) => c.vip);
49
+ if (vips.length) {
50
+ lines.push('VIP contacts:');
51
+ for (const contact of vips) {
52
+ lines.push(`- ${contact.name}${contact.email ? ` <${contact.email}>` : ''}${contact.role ? ` (${contact.role})` : ''}`);
53
+ }
54
+ }
55
+ const active = context.projects.filter((p) => p.status === 'active');
56
+ if (active.length) {
57
+ lines.push('Active projects:');
58
+ for (const project of active)
59
+ lines.push(`- ${project.name}${project.description ? `: ${project.description}` : ''}`);
60
+ }
61
+ return lines.join('\n');
62
+ }
63
+ export async function upsertContact(input) {
64
+ const context = await loadPersonalContext();
65
+ const id = input.id || randomUUID().slice(0, 8);
66
+ const contact = { ...input, id };
67
+ const index = context.contacts.findIndex((c) => c.id === id);
68
+ if (index >= 0)
69
+ context.contacts[index] = contact;
70
+ else
71
+ context.contacts.push(contact);
72
+ await savePersonalContext(context);
73
+ return contact;
74
+ }
75
+ export async function upsertProject(input) {
76
+ const context = await loadPersonalContext();
77
+ const id = input.id || randomUUID().slice(0, 8);
78
+ const project = { ...input, id };
79
+ const index = context.projects.findIndex((p) => p.id === id);
80
+ if (index >= 0)
81
+ context.projects[index] = project;
82
+ else
83
+ context.projects.push(project);
84
+ await savePersonalContext(context);
85
+ return project;
86
+ }
87
+ export async function addUrgencyRule(rule) {
88
+ const context = await loadPersonalContext();
89
+ const trimmed = rule.trim();
90
+ if (trimmed && !context.urgencyRules.includes(trimmed))
91
+ context.urgencyRules.push(trimmed);
92
+ await savePersonalContext(context);
93
+ return context.urgencyRules;
94
+ }
95
+ export async function addWorkflow(note) {
96
+ const context = await loadPersonalContext();
97
+ const trimmed = note.trim();
98
+ if (trimmed && !context.workflows.includes(trimmed))
99
+ context.workflows.push(trimmed);
100
+ await savePersonalContext(context);
101
+ return context.workflows;
102
+ }
103
+ //# sourceMappingURL=personal-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"personal-context.js","sourceRoot":"","sources":["../../src/memory/personal-context.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"scratchpad.d.ts","sourceRoot":"","sources":["../../src/memory/scratchpad.ts"],"names":[],"mappings":"AAKA,wBAAsB,cAAc,CAAC,KAAK,EAAE,MAAM,mBAKjD;AAED,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,mBAUjE"}
1
+ {"version":3,"file":"scratchpad.d.ts","sourceRoot":"","sources":["../../src/memory/scratchpad.ts"],"names":[],"mappings":"AAiBA,wBAAsB,cAAc,CAAC,KAAK,EAAE,MAAM,mBAYjD;AAED,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,mBAmBjE"}
@@ -1,12 +1,29 @@
1
- import { appendText, readJson } from './local-store.js';
1
+ import { writeFile, readFile } from 'node:fs/promises';
2
+ import { mkdir } from 'node:fs/promises';
3
+ import path from 'node:path';
4
+ import { readJson } from './local-store.js';
2
5
  import { getRedis } from './redis.js';
6
+ import { workspaceLayout } from '../workspace/paths.js';
3
7
  const scratchTtlSeconds = 60 * 60 * 24;
8
+ function scratchFile(runId) {
9
+ return path.join(workspaceLayout().scratch, `${runId}.json`);
10
+ }
11
+ async function ensureScratchDir() {
12
+ await mkdir(workspaceLayout().scratch, { recursive: true });
13
+ }
4
14
  export async function readScratchpad(runId) {
5
15
  const redis = getRedis();
6
16
  if (redis)
7
17
  return (await redis.get(`zilo-manager:scratch:${runId}`)) || '(empty)';
8
- const note = await readJson(`scratch-${runId}.json`, { text: '' });
9
- return note.text || '(empty)';
18
+ const file = scratchFile(runId);
19
+ try {
20
+ const note = JSON.parse(await readFile(file, 'utf8'));
21
+ return note.text || '(empty)';
22
+ }
23
+ catch {
24
+ const legacy = await readJson(`scratch-${runId}.json`, { text: '' });
25
+ return legacy.text || '(empty)';
26
+ }
10
27
  }
11
28
  export async function appendScratchpad(runId, text) {
12
29
  const redis = getRedis();
@@ -16,7 +33,16 @@ export async function appendScratchpad(runId, text) {
16
33
  await redis.expire(key, scratchTtlSeconds);
17
34
  return 'Appended.';
18
35
  }
19
- await appendText(`scratch-${runId}.json`, text);
36
+ await ensureScratchDir();
37
+ const file = scratchFile(runId);
38
+ let current = '';
39
+ try {
40
+ current = JSON.parse(await readFile(file, 'utf8')).text || '';
41
+ }
42
+ catch {
43
+ current = (await readJson(`scratch-${runId}.json`, { text: '' })).text || '';
44
+ }
45
+ await writeFile(file, JSON.stringify({ text: `${current}\n${text}`.trim() }, null, 2), 'utf8');
20
46
  return 'Appended.';
21
47
  }
22
48
  //# sourceMappingURL=scratchpad.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"scratchpad.js","sourceRoot":"","sources":["../../src/memory/scratchpad.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,MAAM,iBAAiB,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;AAEvC,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,KAAa;IAChD,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;IACzB,IAAI,KAAK;QAAE,OAAO,CAAC,MAAM,KAAK,CAAC,GAAG,CAAS,wBAAwB,KAAK,EAAE,CAAC,CAAC,IAAI,SAAS,CAAC;IAC1F,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAmB,WAAW,KAAK,OAAO,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;IACrF,OAAO,IAAI,CAAC,IAAI,IAAI,SAAS,CAAC;AAChC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,KAAa,EAAE,IAAY;IAChE,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;IACzB,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,GAAG,GAAG,wBAAwB,KAAK,EAAE,CAAC;QAC5C,MAAM,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;QACrC,MAAM,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC;QAC3C,OAAO,WAAW,CAAC;IACrB,CAAC;IACD,MAAM,UAAU,CAAC,WAAW,KAAK,OAAO,EAAE,IAAI,CAAC,CAAC;IAChD,OAAO,WAAW,CAAC;AACrB,CAAC"}
1
+ {"version":3,"file":"scratchpad.js","sourceRoot":"","sources":["../../src/memory/scratchpad.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAExD,MAAM,iBAAiB,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;AAEvC,SAAS,WAAW,CAAC,KAAa;IAChC,OAAO,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,OAAO,CAAC,CAAC;AAC/D,CAAC;AAED,KAAK,UAAU,gBAAgB;IAC7B,MAAM,KAAK,CAAC,eAAe,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AAC9D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,KAAa;IAChD,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;IACzB,IAAI,KAAK;QAAE,OAAO,CAAC,MAAM,KAAK,CAAC,GAAG,CAAS,wBAAwB,KAAK,EAAE,CAAC,CAAC,IAAI,SAAS,CAAC;IAE1F,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;IAChC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAqB,CAAC;QAC1E,OAAO,IAAI,CAAC,IAAI,IAAI,SAAS,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAmB,WAAW,KAAK,OAAO,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QACvF,OAAO,MAAM,CAAC,IAAI,IAAI,SAAS,CAAC;IAClC,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,KAAa,EAAE,IAAY;IAChE,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;IACzB,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,GAAG,GAAG,wBAAwB,KAAK,EAAE,CAAC;QAC5C,MAAM,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;QACrC,MAAM,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC;QAC3C,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,MAAM,gBAAgB,EAAE,CAAC;IACzB,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;IAChC,IAAI,OAAO,GAAG,EAAE,CAAC;IACjB,IAAI,CAAC;QACH,OAAO,GAAI,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAsB,CAAC,IAAI,IAAI,EAAE,CAAC;IACtF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,GAAG,CAAC,MAAM,QAAQ,CAAmB,WAAW,KAAK,OAAO,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;IACjG,CAAC;IACD,MAAM,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,GAAG,OAAO,KAAK,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IAC/F,OAAO,WAAW,CAAC;AACrB,CAAC"}
@@ -0,0 +1,15 @@
1
+ export type AskQuestionRequest = {
2
+ question: string;
3
+ options: Array<{
4
+ id: string;
5
+ label: string;
6
+ description?: string;
7
+ }>;
8
+ allowMultiple?: boolean;
9
+ required?: boolean;
10
+ };
11
+ export type AskHandler = (request: AskQuestionRequest) => Promise<string[] | null>;
12
+ export declare function setAskHandler(next?: AskHandler): void;
13
+ export declare function askUser(request: AskQuestionRequest): Promise<string[] | null>;
14
+ export declare function withAskHandler<T>(ask: AskHandler | undefined, run: () => Promise<T>): Promise<T>;
15
+ //# sourceMappingURL=ask.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ask.d.ts","sourceRoot":"","sources":["../../src/runtime/ask.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACpE,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,EAAE,kBAAkB,KAAK,OAAO,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC;AAInF,wBAAgB,aAAa,CAAC,IAAI,CAAC,EAAE,UAAU,QAE9C;AAED,wBAAsB,OAAO,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CAInF;AAED,wBAAsB,cAAc,CAAC,CAAC,EAAE,GAAG,EAAE,UAAU,GAAG,SAAS,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,cAQzF"}
@@ -0,0 +1,23 @@
1
+ import { isConfirmationActive } from './confirm.js';
2
+ let handler;
3
+ export function setAskHandler(next) {
4
+ handler = next;
5
+ }
6
+ export async function askUser(request) {
7
+ if (isConfirmationActive())
8
+ return null;
9
+ if (!handler)
10
+ return null;
11
+ return handler(request);
12
+ }
13
+ export async function withAskHandler(ask, run) {
14
+ const previous = handler;
15
+ handler = ask;
16
+ try {
17
+ return await run();
18
+ }
19
+ finally {
20
+ handler = ask ?? previous;
21
+ }
22
+ }
23
+ //# sourceMappingURL=ask.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ask.js","sourceRoot":"","sources":["../../src/runtime/ask.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAWpD,IAAI,OAA+B,CAAC;AAEpC,MAAM,UAAU,aAAa,CAAC,IAAiB;IAC7C,OAAO,GAAG,IAAI,CAAC;AACjB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,OAA2B;IACvD,IAAI,oBAAoB,EAAE;QAAE,OAAO,IAAI,CAAC;IACxC,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAC1B,OAAO,OAAO,CAAC,OAAO,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAI,GAA2B,EAAE,GAAqB;IACxF,MAAM,QAAQ,GAAG,OAAO,CAAC;IACzB,OAAO,GAAG,GAAG,CAAC;IACd,IAAI,CAAC;QACH,OAAO,MAAM,GAAG,EAAE,CAAC;IACrB,CAAC;YAAS,CAAC;QACT,OAAO,GAAG,GAAG,IAAI,QAAQ,CAAC;IAC5B,CAAC;AACH,CAAC"}
@@ -8,6 +8,9 @@ export type ConfirmationRequest = {
8
8
  details?: string[];
9
9
  };
10
10
  export type ConfirmationHandler = (request: ConfirmationRequest) => Promise<boolean | 'session'>;
11
+ export declare function isConfirmationActive(): boolean;
12
+ export declare function hasSessionApproval(request: ConfirmationRequest): boolean;
13
+ export declare function clearSessionApprovals(): void;
11
14
  export declare function withConfirmationHandler<T>(handler: ConfirmationHandler | undefined, run: () => Promise<T>): Promise<T>;
12
15
  export declare function requestConfirmation(request: ConfirmationRequest): Promise<boolean>;
13
16
  //# sourceMappingURL=confirm.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"confirm.d.ts","sourceRoot":"","sources":["../../src/runtime/confirm.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,mBAAmB,GAAG;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC;IAC/B,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG,CAAC,OAAO,EAAE,mBAAmB,KAAK,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC,CAAC;AASjG,wBAAsB,uBAAuB,CAAC,CAAC,EAAE,OAAO,EAAE,mBAAmB,GAAG,SAAS,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,cAS/G;AAED,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,mBAAmB,oBAmBrE"}
1
+ {"version":3,"file":"confirm.d.ts","sourceRoot":"","sources":["../../src/runtime/confirm.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,mBAAmB,GAAG;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC;IAC/B,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG,CAAC,OAAO,EAAE,mBAAmB,KAAK,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC,CAAC;AAkBjG,wBAAgB,oBAAoB,YAEnC;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,mBAAmB,WAE9D;AAED,wBAAgB,qBAAqB,SAEpC;AAED,wBAAsB,uBAAuB,CAAC,CAAC,EAAE,OAAO,EAAE,mBAAmB,GAAG,SAAS,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,cAQ/G;AAED,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,mBAAmB,oBA8BrE"}
@@ -1,12 +1,28 @@
1
1
  let currentHandler;
2
2
  const sessionApprovals = new Set();
3
+ let confirmationActive = false;
4
+ let confirmationTail = Promise.resolve();
3
5
  function approvalKey(request) {
4
- return `${request.toolkitSlug}/${request.toolSlug}/${request.action || ''}`;
6
+ const action = request.action || request.summary;
7
+ return `${request.toolkitSlug}/${request.toolSlug}/${action}`;
8
+ }
9
+ function enqueueConfirmation(run) {
10
+ const next = confirmationTail.then(run);
11
+ confirmationTail = next.catch(() => undefined);
12
+ return next;
13
+ }
14
+ export function isConfirmationActive() {
15
+ return confirmationActive;
16
+ }
17
+ export function hasSessionApproval(request) {
18
+ return sessionApprovals.has(approvalKey(request));
19
+ }
20
+ export function clearSessionApprovals() {
21
+ sessionApprovals.clear();
5
22
  }
6
23
  export async function withConfirmationHandler(handler, run) {
7
24
  const previous = currentHandler;
8
25
  currentHandler = handler;
9
- sessionApprovals.clear(); // Clear session approvals when starting a new context
10
26
  try {
11
27
  return await run();
12
28
  }
@@ -16,18 +32,28 @@ export async function withConfirmationHandler(handler, run) {
16
32
  }
17
33
  export async function requestConfirmation(request) {
18
34
  const key = approvalKey(request);
19
- // If already approved for this session, skip the prompt
20
35
  if (sessionApprovals.has(key)) {
21
36
  return true;
22
37
  }
23
- if (!currentHandler)
24
- return false;
25
- const result = await currentHandler(request);
26
- // If user approved for session, cache it
27
- if (result === 'session') {
28
- sessionApprovals.add(key);
29
- return true;
30
- }
31
- return result === true;
38
+ return enqueueConfirmation(async () => {
39
+ if (sessionApprovals.has(key)) {
40
+ return true;
41
+ }
42
+ if (!currentHandler) {
43
+ return false;
44
+ }
45
+ confirmationActive = true;
46
+ try {
47
+ const result = await currentHandler(request);
48
+ if (result === 'session') {
49
+ sessionApprovals.add(key);
50
+ return true;
51
+ }
52
+ return result === true;
53
+ }
54
+ finally {
55
+ confirmationActive = false;
56
+ }
57
+ });
32
58
  }
33
59
  //# sourceMappingURL=confirm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"confirm.js","sourceRoot":"","sources":["../../src/runtime/confirm.ts"],"names":[],"mappings":"AAYA,IAAI,cAA+C,CAAC;AACpD,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAAU,CAAC;AAE3C,SAAS,WAAW,CAAC,OAA4B;IAC/C,OAAO,GAAG,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC;AAC9E,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAI,OAAwC,EAAE,GAAqB;IAC9G,MAAM,QAAQ,GAAG,cAAc,CAAC;IAChC,cAAc,GAAG,OAAO,CAAC;IACzB,gBAAgB,CAAC,KAAK,EAAE,CAAC,CAAC,sDAAsD;IAChF,IAAI,CAAC;QACH,OAAO,MAAM,GAAG,EAAE,CAAC;IACrB,CAAC;YAAS,CAAC;QACT,cAAc,GAAG,QAAQ,CAAC;IAC5B,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,OAA4B;IACpE,MAAM,GAAG,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;IAEjC,wDAAwD;IACxD,IAAI,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;QAC9B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC,cAAc;QAAE,OAAO,KAAK,CAAC;IAElC,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,OAAO,CAAC,CAAC;IAE7C,yCAAyC;IACzC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC1B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,MAAM,KAAK,IAAI,CAAC;AACzB,CAAC"}
1
+ {"version":3,"file":"confirm.js","sourceRoot":"","sources":["../../src/runtime/confirm.ts"],"names":[],"mappings":"AAYA,IAAI,cAA+C,CAAC;AACpD,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAAU,CAAC;AAC3C,IAAI,kBAAkB,GAAG,KAAK,CAAC;AAC/B,IAAI,gBAAgB,GAAqB,OAAO,CAAC,OAAO,EAAE,CAAC;AAE3D,SAAS,WAAW,CAAC,OAA4B;IAC/C,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;IACjD,OAAO,GAAG,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,QAAQ,IAAI,MAAM,EAAE,CAAC;AAChE,CAAC;AAED,SAAS,mBAAmB,CAAI,GAAqB;IACnD,MAAM,IAAI,GAAG,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACxC,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IAC/C,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,oBAAoB;IAClC,OAAO,kBAAkB,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,OAA4B;IAC7D,OAAO,gBAAgB,CAAC,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,qBAAqB;IACnC,gBAAgB,CAAC,KAAK,EAAE,CAAC;AAC3B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAI,OAAwC,EAAE,GAAqB;IAC9G,MAAM,QAAQ,GAAG,cAAc,CAAC;IAChC,cAAc,GAAG,OAAO,CAAC;IACzB,IAAI,CAAC;QACH,OAAO,MAAM,GAAG,EAAE,CAAC;IACrB,CAAC;YAAS,CAAC;QACT,cAAc,GAAG,QAAQ,CAAC;IAC5B,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,OAA4B;IACpE,MAAM,GAAG,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;IAEjC,IAAI,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;QAC9B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,mBAAmB,CAAC,KAAK,IAAI,EAAE;QACpC,IAAI,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAC9B,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,CAAC,cAAc,EAAE,CAAC;YACpB,OAAO,KAAK,CAAC;QACf,CAAC;QAED,kBAAkB,GAAG,IAAI,CAAC;QAC1B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,OAAO,CAAC,CAAC;YAE7C,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;gBACzB,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBAC1B,OAAO,IAAI,CAAC;YACd,CAAC;YAED,OAAO,MAAM,KAAK,IAAI,CAAC;QACzB,CAAC;gBAAS,CAAC;YACT,kBAAkB,GAAG,KAAK,CAAC;QAC7B,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -1,7 +1,8 @@
1
1
  export type ProgressEvent = {
2
- type: 'thinking' | 'step' | 'tool:start' | 'tool:end' | 'tool:error' | 'search:start' | 'search:end' | 'fetch:start' | 'fetch:end' | 'done';
2
+ type: 'thinking' | 'step' | 'tool:start' | 'tool:end' | 'tool:error' | 'search:start' | 'search:end' | 'fetch:start' | 'fetch:end' | 'done' | 'subagent:start' | 'subagent:step' | 'subagent:end';
3
3
  label: string;
4
4
  detail?: string;
5
+ agent?: string;
5
6
  };
6
7
  export declare function emitProgress(event: ProgressEvent): void;
7
8
  export declare function withProgressListener<T>(progress: ((event: ProgressEvent) => void) | undefined, run: () => Promise<T>): Promise<T>;
@@ -1 +1 @@
1
- {"version":3,"file":"progress.d.ts","sourceRoot":"","sources":["../../src/runtime/progress.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,UAAU,GAAG,MAAM,GAAG,YAAY,GAAG,UAAU,GAAG,YAAY,GAAG,cAAc,GAAG,YAAY,GAAG,aAAa,GAAG,WAAW,GAAG,MAAM,CAAC;IAC5I,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAIF,wBAAgB,YAAY,CAAC,KAAK,EAAE,aAAa,QAEhD;AAED,wBAAsB,oBAAoB,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC,GAAG,SAAS,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,cAQ1H"}
1
+ {"version":3,"file":"progress.d.ts","sourceRoot":"","sources":["../../src/runtime/progress.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,UAAU,GAAG,MAAM,GAAG,YAAY,GAAG,UAAU,GAAG,YAAY,GAAG,cAAc,GAAG,YAAY,GAAG,aAAa,GAAG,WAAW,GAAG,MAAM,GAAG,gBAAgB,GAAG,eAAe,GAAG,cAAc,CAAC;IAClM,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAIF,wBAAgB,YAAY,CAAC,KAAK,EAAE,aAAa,QAGhD;AAED,wBAAsB,oBAAoB,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC,GAAG,SAAS,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,cAQ1H"}
@@ -1,5 +1,8 @@
1
+ import { isConfirmationActive } from './confirm.js';
1
2
  let listener;
2
3
  export function emitProgress(event) {
4
+ if (isConfirmationActive())
5
+ return;
3
6
  listener?.(event);
4
7
  }
5
8
  export async function withProgressListener(progress, run) {
@@ -1 +1 @@
1
- {"version":3,"file":"progress.js","sourceRoot":"","sources":["../../src/runtime/progress.ts"],"names":[],"mappings":"AAMA,IAAI,QAAsD,CAAC;AAE3D,MAAM,UAAU,YAAY,CAAC,KAAoB;IAC/C,QAAQ,EAAE,CAAC,KAAK,CAAC,CAAC;AACpB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAI,QAAsD,EAAE,GAAqB;IACzH,MAAM,QAAQ,GAAG,QAAQ,CAAC;IAC1B,QAAQ,GAAG,QAAQ,CAAC;IACpB,IAAI,CAAC;QACH,OAAO,MAAM,GAAG,EAAE,CAAC;IACrB,CAAC;YAAS,CAAC;QACT,QAAQ,GAAG,QAAQ,CAAC;IACtB,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"progress.js","sourceRoot":"","sources":["../../src/runtime/progress.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AASpD,IAAI,QAAsD,CAAC;AAE3D,MAAM,UAAU,YAAY,CAAC,KAAoB;IAC/C,IAAI,oBAAoB,EAAE;QAAE,OAAO;IACnC,QAAQ,EAAE,CAAC,KAAK,CAAC,CAAC;AACpB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAI,QAAsD,EAAE,GAAqB;IACzH,MAAM,QAAQ,GAAG,QAAQ,CAAC;IAC1B,QAAQ,GAAG,QAAQ,CAAC;IACpB,IAAI,CAAC;QACH,OAAO,MAAM,GAAG,EAAE,CAAC;IACrB,CAAC;YAAS,CAAC;QACT,QAAQ,GAAG,QAAQ,CAAC;IACtB,CAAC;AACH,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { ConfirmationHandler } from './confirm.js';
2
+ export declare function isWaitingForVoiceApproval(): boolean;
3
+ /** Route a final user transcript to an in-flight voice approval prompt. Returns true if consumed. */
4
+ export declare function deliverVoiceUtterance(text: string): boolean;
5
+ export declare function waitForVoiceUtterance(timeoutMs?: number): Promise<string>;
6
+ export declare function parseVoiceApproval(text: string): boolean | 'session' | null;
7
+ export declare function createVoiceConfirmation(speak: (text: string) => Promise<void>): ConfirmationHandler;
8
+ //# sourceMappingURL=voice-confirm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"voice-confirm.d.ts","sourceRoot":"","sources":["../../src/runtime/voice-confirm.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAuB,MAAM,cAAc,CAAC;AAK7E,wBAAgB,yBAAyB,YAExC;AAED,qGAAqG;AACrG,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,WAOjD;AAED,wBAAgB,qBAAqB,CAAC,SAAS,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAczE;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,GAAG,IAAI,CAM3E;AAQD,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,mBAAmB,CAmBnG"}
@@ -0,0 +1,67 @@
1
+ let utteranceWaiter;
2
+ let waitingForApproval = false;
3
+ export function isWaitingForVoiceApproval() {
4
+ return waitingForApproval;
5
+ }
6
+ /** Route a final user transcript to an in-flight voice approval prompt. Returns true if consumed. */
7
+ export function deliverVoiceUtterance(text) {
8
+ if (!utteranceWaiter)
9
+ return false;
10
+ const resolve = utteranceWaiter;
11
+ utteranceWaiter = undefined;
12
+ waitingForApproval = false;
13
+ resolve(text);
14
+ return true;
15
+ }
16
+ export function waitForVoiceUtterance(timeoutMs = 20_000) {
17
+ return new Promise((resolve, reject) => {
18
+ waitingForApproval = true;
19
+ const timer = setTimeout(() => {
20
+ utteranceWaiter = undefined;
21
+ waitingForApproval = false;
22
+ reject(new Error('Voice approval timed out. Say yes, no, or session.'));
23
+ }, timeoutMs);
24
+ utteranceWaiter = (text) => {
25
+ clearTimeout(timer);
26
+ waitingForApproval = false;
27
+ resolve(text);
28
+ };
29
+ });
30
+ }
31
+ export function parseVoiceApproval(text) {
32
+ const normalized = text.toLowerCase().replace(/[^\w\s]/g, ' ').trim();
33
+ if (/^(yes|yeah|yep|yup|sure|ok|okay|approve|approved|proceed|go ahead|do it|affirmative)\b/.test(normalized))
34
+ return true;
35
+ if (/^(no|nope|nah|cancel|stop|deny|denied|don't|do not|negative)\b/.test(normalized))
36
+ return false;
37
+ if (/^(session|always|for session|this session)\b/.test(normalized))
38
+ return 'session';
39
+ return null;
40
+ }
41
+ function spokenSummary(request) {
42
+ const action = request.action || request.summary;
43
+ const tool = request.targetTools?.[0] || request.toolSlug;
44
+ return `${action} using ${tool}`;
45
+ }
46
+ export function createVoiceConfirmation(speak) {
47
+ return async (request) => {
48
+ await speak(`ZilMate needs permission to ${spokenSummary(request)}. Say yes, no, or session.`);
49
+ for (let attempt = 0; attempt < 4; attempt += 1) {
50
+ const utterance = await waitForVoiceUtterance();
51
+ const decision = parseVoiceApproval(utterance);
52
+ if (decision === null) {
53
+ await speak('Say yes, no, or session.');
54
+ continue;
55
+ }
56
+ if (decision === true)
57
+ await speak('Approved.');
58
+ if (decision === false)
59
+ await speak('Cancelled.');
60
+ if (decision === 'session')
61
+ await speak('Approved for this session.');
62
+ return decision;
63
+ }
64
+ return false;
65
+ };
66
+ }
67
+ //# sourceMappingURL=voice-confirm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"voice-confirm.js","sourceRoot":"","sources":["../../src/runtime/voice-confirm.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ export type TrustAction = {
2
+ id: string;
3
+ action: string;
4
+ category: 'destructive' | 'outbound' | 'os-control' | 'other';
5
+ reversible: boolean;
6
+ undoHint?: string;
7
+ metadata?: Record<string, unknown>;
8
+ createdAt: string;
9
+ expiresAt: string;
10
+ undoneAt?: string;
11
+ };
12
+ export declare function logTrustAction(input: {
13
+ action: string;
14
+ category?: TrustAction['category'];
15
+ reversible?: boolean;
16
+ undoHint?: string;
17
+ metadata?: Record<string, unknown>;
18
+ undoWindowMs?: number;
19
+ }): Promise<TrustAction>;
20
+ export declare function listActiveTrustActions(): Promise<TrustAction[]>;
21
+ export declare function markTrustActionUndone(id: string): Promise<null>;
22
+ export declare function trustUndoWindowMs(): number;
23
+ //# sourceMappingURL=trust-log.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trust-log.d.ts","sourceRoot":"","sources":["../../src/safety/trust-log.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,WAAW,GAAG;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,aAAa,GAAG,UAAU,GAAG,YAAY,GAAG,OAAO,CAAC;IAC9D,UAAU,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAQF,wBAAsB,cAAc,CAAC,KAAK,EAAE;IAC1C,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,WAAW,CAAC,UAAU,CAAC,CAAC;IACnC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,wBAeA;AAED,wBAAsB,sBAAsB,2BAQ3C;AAED,wBAAsB,qBAAqB,CAAC,EAAE,EAAE,MAAM,iBAkBrD;AAED,wBAAgB,iBAAiB,WAEhC"}