@poping/yome 0.0.2 → 0.0.4

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 (276) hide show
  1. package/LICENSE +202 -0
  2. package/NOTICE +11 -0
  3. package/README.md +306 -27
  4. package/README.zh-CN.md +333 -0
  5. package/bin/yome-calwatch +0 -0
  6. package/dist/agent.d.ts +24 -2
  7. package/dist/agent.js +34 -2
  8. package/dist/agent.js.map +1 -1
  9. package/dist/context.d.ts +2 -0
  10. package/dist/context.js +121 -13
  11. package/dist/context.js.map +1 -1
  12. package/dist/daemon/calendarPermission.d.ts +10 -0
  13. package/dist/daemon/calendarPermission.js +68 -0
  14. package/dist/daemon/calendarPermission.js.map +1 -0
  15. package/dist/daemon/cronCli.d.ts +19 -0
  16. package/dist/daemon/cronCli.js +403 -0
  17. package/dist/daemon/cronCli.js.map +1 -0
  18. package/dist/daemon/envHint.d.ts +5 -0
  19. package/dist/daemon/envHint.js +139 -0
  20. package/dist/daemon/envHint.js.map +1 -0
  21. package/dist/daemon/humanCron.d.ts +1 -0
  22. package/dist/daemon/humanCron.js +72 -0
  23. package/dist/daemon/humanCron.js.map +1 -0
  24. package/dist/daemon/humanOnce.d.ts +1 -0
  25. package/dist/daemon/humanOnce.js +54 -0
  26. package/dist/daemon/humanOnce.js.map +1 -0
  27. package/dist/daemon/index.d.ts +5 -0
  28. package/dist/daemon/index.js +168 -0
  29. package/dist/daemon/index.js.map +1 -0
  30. package/dist/daemon/launchd.d.ts +7 -0
  31. package/dist/daemon/launchd.js +93 -0
  32. package/dist/daemon/launchd.js.map +1 -0
  33. package/dist/daemon/log.d.ts +17 -0
  34. package/dist/daemon/log.js +57 -0
  35. package/dist/daemon/log.js.map +1 -0
  36. package/dist/daemon/paths.d.ts +11 -0
  37. package/dist/daemon/paths.js +27 -0
  38. package/dist/daemon/paths.js.map +1 -0
  39. package/dist/daemon/runTaskEntry.d.ts +1 -0
  40. package/dist/daemon/runTaskEntry.js +67 -0
  41. package/dist/daemon/runTaskEntry.js.map +1 -0
  42. package/dist/daemon/runner.d.ts +21 -0
  43. package/dist/daemon/runner.js +175 -0
  44. package/dist/daemon/runner.js.map +1 -0
  45. package/dist/daemon/scheduler.d.ts +5 -0
  46. package/dist/daemon/scheduler.js +162 -0
  47. package/dist/daemon/scheduler.js.map +1 -0
  48. package/dist/daemon/taskStore.d.ts +62 -0
  49. package/dist/daemon/taskStore.js +88 -0
  50. package/dist/daemon/taskStore.js.map +1 -0
  51. package/dist/daemon/triggers/calendar.d.ts +8 -0
  52. package/dist/daemon/triggers/calendar.js +248 -0
  53. package/dist/daemon/triggers/calendar.js.map +1 -0
  54. package/dist/daemon/triggers/childRunner.d.ts +14 -0
  55. package/dist/daemon/triggers/childRunner.js +111 -0
  56. package/dist/daemon/triggers/childRunner.js.map +1 -0
  57. package/dist/daemon/triggers/cron.d.ts +14 -0
  58. package/dist/daemon/triggers/cron.js +91 -0
  59. package/dist/daemon/triggers/cron.js.map +1 -0
  60. package/dist/daemon/triggers/file.d.ts +7 -0
  61. package/dist/daemon/triggers/file.js +123 -0
  62. package/dist/daemon/triggers/file.js.map +1 -0
  63. package/dist/daemon/triggers/once.d.ts +10 -0
  64. package/dist/daemon/triggers/once.js +80 -0
  65. package/dist/daemon/triggers/once.js.map +1 -0
  66. package/dist/index.js +240 -15
  67. package/dist/index.js.map +1 -1
  68. package/dist/llm.js +45 -2
  69. package/dist/llm.js.map +1 -1
  70. package/dist/loops/chain.js +8 -0
  71. package/dist/loops/chain.js.map +1 -1
  72. package/dist/loops/evaluator.js +8 -0
  73. package/dist/loops/evaluator.js.map +1 -1
  74. package/dist/loops/orchestrator.js +8 -0
  75. package/dist/loops/orchestrator.js.map +1 -1
  76. package/dist/loops/parallel.js.map +1 -1
  77. package/dist/loops/route.js +8 -0
  78. package/dist/loops/route.js.map +1 -1
  79. package/dist/loops/simple.js +15 -0
  80. package/dist/loops/simple.js.map +1 -1
  81. package/dist/permissions/index.d.ts +1 -1
  82. package/dist/permissions/index.js +1 -1
  83. package/dist/permissions/index.js.map +1 -1
  84. package/dist/permissions/loader.d.ts +20 -1
  85. package/dist/permissions/loader.js +51 -0
  86. package/dist/permissions/loader.js.map +1 -1
  87. package/dist/redact.d.ts +56 -0
  88. package/dist/redact.js +191 -0
  89. package/dist/redact.js.map +1 -0
  90. package/dist/skills/runner/applescript.d.ts +49 -0
  91. package/dist/skills/runner/applescript.js +100 -0
  92. package/dist/skills/runner/applescript.js.map +1 -0
  93. package/dist/skills/runner/dispatcher.d.ts +128 -0
  94. package/dist/skills/runner/dispatcher.js +617 -0
  95. package/dist/skills/runner/dispatcher.js.map +1 -0
  96. package/dist/skills/runner/dispatcher.test.d.ts +1 -0
  97. package/dist/skills/runner/dispatcher.test.js +141 -0
  98. package/dist/skills/runner/dispatcher.test.js.map +1 -0
  99. package/dist/skills/runner/kernel.d.ts +8 -0
  100. package/dist/skills/runner/kernel.js +731 -0
  101. package/dist/skills/runner/kernel.js.map +1 -0
  102. package/dist/skills/runner/nodeBackend.d.ts +32 -0
  103. package/dist/skills/runner/nodeBackend.js +147 -0
  104. package/dist/skills/runner/nodeBackend.js.map +1 -0
  105. package/dist/skills/runner/tokenizer.d.ts +36 -0
  106. package/dist/skills/runner/tokenizer.js +177 -0
  107. package/dist/skills/runner/tokenizer.js.map +1 -0
  108. package/dist/state/todos.d.ts +12 -0
  109. package/dist/state/todos.js +32 -0
  110. package/dist/state/todos.js.map +1 -0
  111. package/dist/threadCli.d.ts +11 -0
  112. package/dist/threadCli.js +177 -0
  113. package/dist/threadCli.js.map +1 -0
  114. package/dist/threadShare.d.ts +21 -0
  115. package/dist/threadShare.js +121 -0
  116. package/dist/threadShare.js.map +1 -0
  117. package/dist/threadSubmit.d.ts +32 -0
  118. package/dist/threadSubmit.js +199 -0
  119. package/dist/threadSubmit.js.map +1 -0
  120. package/dist/tools/askUser.d.ts +20 -0
  121. package/dist/tools/askUser.js +126 -0
  122. package/dist/tools/askUser.js.map +1 -0
  123. package/dist/tools/bash.js +63 -14
  124. package/dist/tools/bash.js.map +1 -1
  125. package/dist/tools/index.d.ts +24 -2
  126. package/dist/tools/index.js +54 -5
  127. package/dist/tools/index.js.map +1 -1
  128. package/dist/tools/skillCall.d.ts +2 -0
  129. package/dist/tools/skillCall.js +77 -0
  130. package/dist/tools/skillCall.js.map +1 -0
  131. package/dist/tools/todoWrite.d.ts +2 -0
  132. package/dist/tools/todoWrite.js +141 -0
  133. package/dist/tools/todoWrite.js.map +1 -0
  134. package/dist/tools/yome.d.ts +2 -0
  135. package/dist/tools/yome.js +87 -0
  136. package/dist/tools/yome.js.map +1 -0
  137. package/dist/ui/AgentPicker.js +3 -3
  138. package/dist/ui/AgentPicker.js.map +1 -1
  139. package/dist/ui/App.js +263 -61
  140. package/dist/ui/App.js.map +1 -1
  141. package/dist/ui/AskUserPrompt.d.ts +7 -0
  142. package/dist/ui/AskUserPrompt.js +78 -0
  143. package/dist/ui/AskUserPrompt.js.map +1 -0
  144. package/dist/ui/Banner.d.ts +2 -1
  145. package/dist/ui/Banner.js +23 -4
  146. package/dist/ui/Banner.js.map +1 -1
  147. package/dist/ui/InputBar.js +25 -36
  148. package/dist/ui/InputBar.js.map +1 -1
  149. package/dist/ui/Markdown.d.ts +2 -2
  150. package/dist/ui/Markdown.js +22 -7
  151. package/dist/ui/Markdown.js.map +1 -1
  152. package/dist/ui/MarketplacePicker.d.ts +7 -0
  153. package/dist/ui/MarketplacePicker.js +122 -0
  154. package/dist/ui/MarketplacePicker.js.map +1 -0
  155. package/dist/ui/MessageList.d.ts +12 -1
  156. package/dist/ui/MessageList.js +72 -7
  157. package/dist/ui/MessageList.js.map +1 -1
  158. package/dist/ui/ModelPicker.js +4 -4
  159. package/dist/ui/ModelPicker.js.map +1 -1
  160. package/dist/ui/MultilineTextInput.d.ts +31 -0
  161. package/dist/ui/MultilineTextInput.js +393 -0
  162. package/dist/ui/MultilineTextInput.js.map +1 -0
  163. package/dist/ui/MultilineTextInput.test.d.ts +1 -0
  164. package/dist/ui/MultilineTextInput.test.js +30 -0
  165. package/dist/ui/MultilineTextInput.test.js.map +1 -0
  166. package/dist/ui/PermissionPrompt.d.ts +16 -4
  167. package/dist/ui/PermissionPrompt.js +60 -15
  168. package/dist/ui/PermissionPrompt.js.map +1 -1
  169. package/dist/ui/SessionPicker.js +2 -2
  170. package/dist/ui/SessionPicker.js.map +1 -1
  171. package/dist/ui/ShimmerText.d.ts +8 -0
  172. package/dist/ui/ShimmerText.js +40 -0
  173. package/dist/ui/ShimmerText.js.map +1 -0
  174. package/dist/ui/Spinner.js +3 -9
  175. package/dist/ui/Spinner.js.map +1 -1
  176. package/dist/ui/TodoPanel.d.ts +7 -0
  177. package/dist/ui/TodoPanel.js +36 -0
  178. package/dist/ui/TodoPanel.js.map +1 -0
  179. package/dist/ui/TogglePicker.js +4 -4
  180. package/dist/ui/TogglePicker.js.map +1 -1
  181. package/dist/ui/ToolResult.js +6 -0
  182. package/dist/ui/ToolResult.js.map +1 -1
  183. package/dist/ui/UnifiedSkillsPicker.d.ts +10 -0
  184. package/dist/ui/UnifiedSkillsPicker.js +63 -0
  185. package/dist/ui/UnifiedSkillsPicker.js.map +1 -0
  186. package/dist/ui/animation.d.ts +3 -0
  187. package/dist/ui/animation.js +48 -0
  188. package/dist/ui/animation.js.map +1 -0
  189. package/dist/ui/useThrottledStream.d.ts +7 -0
  190. package/dist/ui/useThrottledStream.js +63 -0
  191. package/dist/ui/useThrottledStream.js.map +1 -0
  192. package/dist/yomeSkills/auth.d.ts +20 -0
  193. package/dist/yomeSkills/auth.js +70 -0
  194. package/dist/yomeSkills/auth.js.map +1 -0
  195. package/dist/yomeSkills/blacklist.d.ts +33 -0
  196. package/dist/yomeSkills/blacklist.js +101 -0
  197. package/dist/yomeSkills/blacklist.js.map +1 -0
  198. package/dist/yomeSkills/capabilities.d.ts +54 -0
  199. package/dist/yomeSkills/capabilities.js +175 -0
  200. package/dist/yomeSkills/capabilities.js.map +1 -0
  201. package/dist/yomeSkills/capabilityGuard.d.ts +31 -0
  202. package/dist/yomeSkills/capabilityGuard.js +113 -0
  203. package/dist/yomeSkills/capabilityGuard.js.map +1 -0
  204. package/dist/yomeSkills/cli.d.ts +25 -0
  205. package/dist/yomeSkills/cli.js +624 -0
  206. package/dist/yomeSkills/cli.js.map +1 -0
  207. package/dist/yomeSkills/deprecate.d.ts +29 -0
  208. package/dist/yomeSkills/deprecate.js +99 -0
  209. package/dist/yomeSkills/deprecate.js.map +1 -0
  210. package/dist/yomeSkills/devLink.d.ts +17 -0
  211. package/dist/yomeSkills/devLink.js +91 -0
  212. package/dist/yomeSkills/devLink.js.map +1 -0
  213. package/dist/yomeSkills/doctor.d.ts +13 -0
  214. package/dist/yomeSkills/doctor.js +152 -0
  215. package/dist/yomeSkills/doctor.js.map +1 -0
  216. package/dist/yomeSkills/enable.d.ts +8 -0
  217. package/dist/yomeSkills/enable.js +67 -0
  218. package/dist/yomeSkills/enable.js.map +1 -0
  219. package/dist/yomeSkills/hubPing.d.ts +1 -0
  220. package/dist/yomeSkills/hubPing.js +41 -0
  221. package/dist/yomeSkills/hubPing.js.map +1 -0
  222. package/dist/yomeSkills/install.d.ts +18 -0
  223. package/dist/yomeSkills/install.js +143 -0
  224. package/dist/yomeSkills/install.js.map +1 -0
  225. package/dist/yomeSkills/installFromHubTarball.d.ts +26 -0
  226. package/dist/yomeSkills/installFromHubTarball.js +161 -0
  227. package/dist/yomeSkills/installFromHubTarball.js.map +1 -0
  228. package/dist/yomeSkills/installGithub.d.ts +33 -0
  229. package/dist/yomeSkills/installGithub.js +213 -0
  230. package/dist/yomeSkills/installGithub.js.map +1 -0
  231. package/dist/yomeSkills/installMeta.d.ts +8 -0
  232. package/dist/yomeSkills/installMeta.js +76 -0
  233. package/dist/yomeSkills/installMeta.js.map +1 -0
  234. package/dist/yomeSkills/integrity.d.ts +26 -0
  235. package/dist/yomeSkills/integrity.js +107 -0
  236. package/dist/yomeSkills/integrity.js.map +1 -0
  237. package/dist/yomeSkills/invoke.d.ts +29 -0
  238. package/dist/yomeSkills/invoke.js +135 -0
  239. package/dist/yomeSkills/invoke.js.map +1 -0
  240. package/dist/yomeSkills/list.d.ts +11 -0
  241. package/dist/yomeSkills/list.js +55 -0
  242. package/dist/yomeSkills/list.js.map +1 -0
  243. package/dist/yomeSkills/login.d.ts +41 -0
  244. package/dist/yomeSkills/login.js +221 -0
  245. package/dist/yomeSkills/login.js.map +1 -0
  246. package/dist/yomeSkills/manifest.d.ts +60 -0
  247. package/dist/yomeSkills/manifest.js +47 -0
  248. package/dist/yomeSkills/manifest.js.map +1 -0
  249. package/dist/yomeSkills/paths.d.ts +13 -0
  250. package/dist/yomeSkills/paths.js +33 -0
  251. package/dist/yomeSkills/paths.js.map +1 -0
  252. package/dist/yomeSkills/publish.d.ts +18 -0
  253. package/dist/yomeSkills/publish.js +114 -0
  254. package/dist/yomeSkills/publish.js.map +1 -0
  255. package/dist/yomeSkills/rollback.d.ts +10 -0
  256. package/dist/yomeSkills/rollback.js +83 -0
  257. package/dist/yomeSkills/rollback.js.map +1 -0
  258. package/dist/yomeSkills/search.d.ts +21 -0
  259. package/dist/yomeSkills/search.js +31 -0
  260. package/dist/yomeSkills/search.js.map +1 -0
  261. package/dist/yomeSkills/skillsIndex.d.ts +36 -0
  262. package/dist/yomeSkills/skillsIndex.js +111 -0
  263. package/dist/yomeSkills/skillsIndex.js.map +1 -0
  264. package/dist/yomeSkills/unified.d.ts +53 -0
  265. package/dist/yomeSkills/unified.js +187 -0
  266. package/dist/yomeSkills/unified.js.map +1 -0
  267. package/dist/yomeSkills/uninstall.d.ts +7 -0
  268. package/dist/yomeSkills/uninstall.js +22 -0
  269. package/dist/yomeSkills/uninstall.js.map +1 -0
  270. package/dist/yomeSkills/update.d.ts +18 -0
  271. package/dist/yomeSkills/update.js +75 -0
  272. package/dist/yomeSkills/update.js.map +1 -0
  273. package/dist/yomeSkills/validate.d.ts +11 -0
  274. package/dist/yomeSkills/validate.js +99 -0
  275. package/dist/yomeSkills/validate.js.map +1 -0
  276. package/package.json +23 -6
@@ -1 +1 @@
1
- {"version":3,"file":"evaluator.js","sourceRoot":"","sources":["../../src/loops/evaluator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"evaluator.js","sourceRoot":"","sources":["../../src/loops/evaluator.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import { callLLM, extractText, callLLMStream } from '../llm.js';
2
2
  import { userInputAsText } from './types.js';
3
+ import { REJECT_SENTINEL } from '../tools/index.js';
3
4
  const MAX_WORKER_ITERATIONS = 15;
4
5
  /**
5
6
  * Orchestrator-Workers: a central LLM dynamically breaks down the task,
@@ -93,11 +94,18 @@ export class OrchestratorAgentLoop {
93
94
  if (toolUseBlocks.length === 0 || response.stop_reason === 'end_turn')
94
95
  break;
95
96
  const toolResults = [];
97
+ let userRejected = false;
96
98
  for (const block of toolUseBlocks) {
99
+ if (userRejected) {
100
+ toolResults.push({ type: 'tool_result', tool_use_id: block.id, content: `${REJECT_SENTINEL} Skipped — user rejected an earlier tool use in this turn.` });
101
+ continue;
102
+ }
97
103
  cb.onToolUse(block.name, block.input);
98
104
  const result = await ctx.executeTool(block.name, block.input);
99
105
  cb.onToolResult(block.name, result);
100
106
  toolResults.push({ type: 'tool_result', tool_use_id: block.id, content: result });
107
+ if (typeof result === 'string' && result.startsWith(REJECT_SENTINEL))
108
+ userRejected = true;
101
109
  }
102
110
  workerMessages.push({ role: 'user', content: toolResults });
103
111
  }
@@ -1 +1 @@
1
- {"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../../src/loops/orchestrator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../../src/loops/orchestrator.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"parallel.js","sourceRoot":"","sources":["../../src/loops/parallel.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"parallel.js","sourceRoot":"","sources":["../../src/loops/parallel.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import { callLLM, extractText, callLLMStream } from '../llm.js';
2
+ import { REJECT_SENTINEL } from '../tools/index.js';
2
3
  const MAX_ITERATIONS = 30;
3
4
  const ROUTES = [
4
5
  {
@@ -69,11 +70,18 @@ export class RouteAgentLoop {
69
70
  if (toolUseBlocks.length === 0 || response.stop_reason === 'end_turn')
70
71
  break;
71
72
  const toolResults = [];
73
+ let userRejected = false;
72
74
  for (const block of toolUseBlocks) {
75
+ if (userRejected) {
76
+ toolResults.push({ type: 'tool_result', tool_use_id: block.id, content: `${REJECT_SENTINEL} Skipped — user rejected an earlier tool use in this turn.` });
77
+ continue;
78
+ }
73
79
  cb.onToolUse(block.name, block.input);
74
80
  const result = await ctx.executeTool(block.name, block.input);
75
81
  cb.onToolResult(block.name, result);
76
82
  toolResults.push({ type: 'tool_result', tool_use_id: block.id, content: result });
83
+ if (typeof result === 'string' && result.startsWith(REJECT_SENTINEL))
84
+ userRejected = true;
77
85
  }
78
86
  ctx.messages.push({ role: 'user', content: toolResults });
79
87
  }
@@ -1 +1 @@
1
- {"version":3,"file":"route.js","sourceRoot":"","sources":["../../src/loops/route.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"route.js","sourceRoot":"","sources":["../../src/loops/route.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import { callLLMStream } from '../llm.js';
2
+ import { REJECT_SENTINEL } from '../tools/index.js';
2
3
  const MAX_ITERATIONS = 30;
3
4
  export class SimpleAgentLoop {
4
5
  name = 'simple';
@@ -23,7 +24,18 @@ export class SimpleAgentLoop {
23
24
  return;
24
25
  }
25
26
  const toolResults = [];
27
+ let userRejected = false;
26
28
  for (const block of toolUseBlocks) {
29
+ if (userRejected) {
30
+ // Short-circuit remaining tool_uses in this batch with a synthetic
31
+ // rejection so the API stays paired (every tool_use needs a result).
32
+ toolResults.push({
33
+ type: 'tool_result',
34
+ tool_use_id: block.id,
35
+ content: `${REJECT_SENTINEL} Skipped — user rejected an earlier tool use in this turn.`,
36
+ });
37
+ continue;
38
+ }
27
39
  cb.onToolUse(block.name, block.input);
28
40
  const result = await ctx.executeTool(block.name, block.input);
29
41
  cb.onToolResult(block.name, result);
@@ -32,6 +44,9 @@ export class SimpleAgentLoop {
32
44
  tool_use_id: block.id,
33
45
  content: result,
34
46
  });
47
+ if (typeof result === 'string' && result.startsWith(REJECT_SENTINEL)) {
48
+ userRejected = true;
49
+ }
35
50
  }
36
51
  ctx.messages.push({ role: 'user', content: toolResults });
37
52
  }
@@ -1 +1 @@
1
- {"version":3,"file":"simple.js","sourceRoot":"","sources":["../../src/loops/simple.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAI1C,MAAM,cAAc,GAAG,EAAE,CAAC;AAE1B,MAAM,OAAO,eAAe;IACjB,IAAI,GAAG,QAAQ,CAAC;IAChB,WAAW,GAAG,qCAAqC,CAAC;IAE7D,KAAK,CAAC,GAAG,CACP,WAAsB,EACtB,GAAqB,EACrB,EAAsB;QAEtB,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC;QAE1D,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,IAAI,WAAW,GAAG,CAAC,CAAC;QAEpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,cAAc,EAAE,CAAC,EAAE,EAAE,CAAC;YACxC,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,aAAa,CAClC,GAAG,CAAC,MAAM,EACV,GAAG,CAAC,YAAY,EAChB,GAAG,CAAC,QAAQ,EACZ,GAAG,CAAC,KAAK,EACT,CAAC,KAAK,EAAE,EAAE;oBACR,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;wBAC9C,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBAC7B,CAAC;gBACH,CAAC,CACF,CAAC;gBAEF,UAAU,IAAI,QAAQ,CAAC,KAAK,CAAC,YAAY,CAAC;gBAC1C,WAAW,IAAI,QAAQ,CAAC,KAAK,CAAC,aAAa,CAAC;gBAC5C,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;gBAEpE,MAAM,aAAa,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,CAC3C,CAAC,CAAC,EAA4C,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CACvE,CAAC;gBAEF,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,IAAI,QAAQ,CAAC,WAAW,KAAK,UAAU,EAAE,CAAC;oBACtE,EAAE,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,CAAC,CAAC;oBAClE,OAAO;gBACT,CAAC;gBAED,MAAM,WAAW,GAAmB,EAAE,CAAC;gBACvC,KAAK,MAAM,KAAK,IAAI,aAAa,EAAE,CAAC;oBAClC,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;oBACtC,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;oBAC9D,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;oBACpC,WAAW,CAAC,IAAI,CAAC;wBACf,IAAI,EAAE,aAAa;wBACnB,WAAW,EAAE,KAAK,CAAC,EAAE;wBACrB,OAAO,EAAE,MAAM;qBAChB,CAAC,CAAC;gBACL,CAAC;gBAED,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC;YAC5D,CAAC;YAAC,OAAO,GAAQ,EAAE,CAAC;gBAClB,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;gBAChB,OAAO;YACT,CAAC;QACH,CAAC;QAED,EAAE,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,CAAC,CAAC;IACpE,CAAC;CACF"}
1
+ {"version":3,"file":"simple.js","sourceRoot":"","sources":["../../src/loops/simple.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAG1C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,MAAM,cAAc,GAAG,EAAE,CAAC;AAE1B,MAAM,OAAO,eAAe;IACjB,IAAI,GAAG,QAAQ,CAAC;IAChB,WAAW,GAAG,qCAAqC,CAAC;IAE7D,KAAK,CAAC,GAAG,CACP,WAAsB,EACtB,GAAqB,EACrB,EAAsB;QAEtB,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC;QAE1D,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,IAAI,WAAW,GAAG,CAAC,CAAC;QAEpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,cAAc,EAAE,CAAC,EAAE,EAAE,CAAC;YACxC,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,aAAa,CAClC,GAAG,CAAC,MAAM,EACV,GAAG,CAAC,YAAY,EAChB,GAAG,CAAC,QAAQ,EACZ,GAAG,CAAC,KAAK,EACT,CAAC,KAAK,EAAE,EAAE;oBACR,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;wBAC9C,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBAC7B,CAAC;gBACH,CAAC,CACF,CAAC;gBAEF,UAAU,IAAI,QAAQ,CAAC,KAAK,CAAC,YAAY,CAAC;gBAC1C,WAAW,IAAI,QAAQ,CAAC,KAAK,CAAC,aAAa,CAAC;gBAC5C,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;gBAEpE,MAAM,aAAa,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,CAC3C,CAAC,CAAC,EAA4C,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CACvE,CAAC;gBAEF,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,IAAI,QAAQ,CAAC,WAAW,KAAK,UAAU,EAAE,CAAC;oBACtE,EAAE,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,CAAC,CAAC;oBAClE,OAAO;gBACT,CAAC;gBAED,MAAM,WAAW,GAAmB,EAAE,CAAC;gBACvC,IAAI,YAAY,GAAG,KAAK,CAAC;gBACzB,KAAK,MAAM,KAAK,IAAI,aAAa,EAAE,CAAC;oBAClC,IAAI,YAAY,EAAE,CAAC;wBACjB,mEAAmE;wBACnE,qEAAqE;wBACrE,WAAW,CAAC,IAAI,CAAC;4BACf,IAAI,EAAE,aAAa;4BACnB,WAAW,EAAE,KAAK,CAAC,EAAE;4BACrB,OAAO,EAAE,GAAG,eAAe,4DAA4D;yBACxF,CAAC,CAAC;wBACH,SAAS;oBACX,CAAC;oBACD,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;oBACtC,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;oBAC9D,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;oBACpC,WAAW,CAAC,IAAI,CAAC;wBACf,IAAI,EAAE,aAAa;wBACnB,WAAW,EAAE,KAAK,CAAC,EAAE;wBACrB,OAAO,EAAE,MAAM;qBAChB,CAAC,CAAC;oBACH,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;wBACrE,YAAY,GAAG,IAAI,CAAC;oBACtB,CAAC;gBACH,CAAC;gBAED,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC;YAC5D,CAAC;YAAC,OAAO,GAAQ,EAAE,CAAC;gBAClB,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;gBAChB,OAAO;YACT,CAAC;QACH,CAAC;QAED,EAAE,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,CAAC,CAAC;IACpE,CAAC;CACF"}
@@ -1,4 +1,4 @@
1
1
  export type { PermissionMode, PermissionBehavior, PermissionRule, PermissionRuleValue, PermissionRuleSource, PermissionDecision, PermissionResult, ToolPermissionContext, PermissionRulesBySource, } from './types.js';
2
2
  export { parseRuleValue, serializeRuleValue, toolMatchesRule, contentMatchesRule } from './ruleParser.js';
3
- export { loadAllPermissionRules, loadDefaultMode, initializePermissionContext, addPermissionRuleToUserSettings } from './loader.js';
3
+ export { loadAllPermissionRules, loadDefaultMode, initializePermissionContext, addPermissionRuleToUserSettings, addRuleToContext, extractBashRulePrefix, } from './loader.js';
4
4
  export { checkPermission, isContentAllowed, isContentDenied } from './checker.js';
@@ -1,4 +1,4 @@
1
1
  export { parseRuleValue, serializeRuleValue, toolMatchesRule, contentMatchesRule } from './ruleParser.js';
2
- export { loadAllPermissionRules, loadDefaultMode, initializePermissionContext, addPermissionRuleToUserSettings } from './loader.js';
2
+ export { loadAllPermissionRules, loadDefaultMode, initializePermissionContext, addPermissionRuleToUserSettings, addRuleToContext, extractBashRulePrefix, } from './loader.js';
3
3
  export { checkPermission, isContentAllowed, isContentDenied } from './checker.js';
4
4
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/permissions/index.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAC1G,OAAO,EAAE,sBAAsB,EAAE,eAAe,EAAE,2BAA2B,EAAE,+BAA+B,EAAE,MAAM,aAAa,CAAC;AACpI,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/permissions/index.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAC1G,OAAO,EACL,sBAAsB,EACtB,eAAe,EACf,2BAA2B,EAC3B,+BAA+B,EAC/B,gBAAgB,EAChB,qBAAqB,GACtB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC"}
@@ -1,4 +1,4 @@
1
- import type { PermissionBehavior, PermissionRule, PermissionMode, ToolPermissionContext } from './types.js';
1
+ import type { PermissionBehavior, PermissionRule, PermissionRuleSource, PermissionMode, ToolPermissionContext } from './types.js';
2
2
  /**
3
3
  * Load all permission rules from user settings (~/.yome/settings.json)
4
4
  * and project settings (.yome/settings.json).
@@ -20,3 +20,22 @@ export declare function initializePermissionContext(opts?: {
20
20
  * Persist a new allow/deny rule to user settings.
21
21
  */
22
22
  export declare function addPermissionRuleToUserSettings(ruleString: string, behavior: PermissionBehavior): void;
23
+ /**
24
+ * Return a new ToolPermissionContext with `ruleString` appended to the given
25
+ * source bucket under `behavior`. Pure / non-mutating — pairs naturally with
26
+ * the immutable `ToolPermissionContext` type.
27
+ *
28
+ * Use `source: 'session'` for "allow for this session only" (in-memory) and
29
+ * `source: 'userSettings'` to mirror what was just persisted to disk so the
30
+ * decision takes effect immediately without restarting the CLI.
31
+ */
32
+ export declare function addRuleToContext(ctx: ToolPermissionContext, ruleString: string, behavior: PermissionBehavior, source: PermissionRuleSource): ToolPermissionContext;
33
+ /**
34
+ * Best-effort extraction of a stable Bash command prefix to use as a permission
35
+ * rule. Returns the first 1-2 plain tokens (`git status`, `npm run build`)
36
+ * suffixed with `:*` so prefix matching catches subsequent invocations with
37
+ * different arguments. Falls back to `null` when the command contains shell
38
+ * metacharacters (pipes, &&, ;, redirects, subshells) — those should be approved
39
+ * verbatim rather than turned into a wildcard rule.
40
+ */
41
+ export declare function extractBashRulePrefix(command: string): string | null;
@@ -101,4 +101,55 @@ export function addPermissionRuleToUserSettings(ruleString, behavior) {
101
101
  }
102
102
  writeFileSync(USER_SETTINGS_FILE, JSON.stringify(data, null, 2), 'utf-8');
103
103
  }
104
+ /**
105
+ * Return a new ToolPermissionContext with `ruleString` appended to the given
106
+ * source bucket under `behavior`. Pure / non-mutating — pairs naturally with
107
+ * the immutable `ToolPermissionContext` type.
108
+ *
109
+ * Use `source: 'session'` for "allow for this session only" (in-memory) and
110
+ * `source: 'userSettings'` to mirror what was just persisted to disk so the
111
+ * decision takes effect immediately without restarting the CLI.
112
+ */
113
+ export function addRuleToContext(ctx, ruleString, behavior, source) {
114
+ const bucket = behavior === 'allow' ? { ...ctx.allowRules } : { ...ctx.denyRules };
115
+ const existing = bucket[source] ?? [];
116
+ if (existing.includes(ruleString)) {
117
+ // No-op if duplicate — return original ref so React-style equality stays cheap.
118
+ return ctx;
119
+ }
120
+ bucket[source] = [...existing, ruleString];
121
+ return behavior === 'allow'
122
+ ? { ...ctx, allowRules: bucket }
123
+ : { ...ctx, denyRules: bucket };
124
+ }
125
+ /**
126
+ * Best-effort extraction of a stable Bash command prefix to use as a permission
127
+ * rule. Returns the first 1-2 plain tokens (`git status`, `npm run build`)
128
+ * suffixed with `:*` so prefix matching catches subsequent invocations with
129
+ * different arguments. Falls back to `null` when the command contains shell
130
+ * metacharacters (pipes, &&, ;, redirects, subshells) — those should be approved
131
+ * verbatim rather than turned into a wildcard rule.
132
+ */
133
+ export function extractBashRulePrefix(command) {
134
+ const trimmed = command.trim();
135
+ if (!trimmed)
136
+ return null;
137
+ // Refuse compound shell — too risky to auto-derive a wildcard rule.
138
+ if (/[|&;`$<>(){}]/.test(trimmed))
139
+ return null;
140
+ const tokens = trimmed.split(/\s+/).filter(Boolean);
141
+ if (tokens.length === 0)
142
+ return null;
143
+ const first = tokens[0];
144
+ // Subcommand-style binaries: keep first two tokens (git status, npm run, kubectl get).
145
+ const SUBCOMMAND_BINS = new Set([
146
+ 'git', 'npm', 'pnpm', 'yarn', 'bun', 'docker', 'kubectl', 'cargo', 'go', 'gh', 'brew',
147
+ ]);
148
+ if (SUBCOMMAND_BINS.has(first) && tokens.length >= 2 && /^[a-zA-Z][\w-]*$/.test(tokens[1])) {
149
+ return `${first} ${tokens[1]}:*`;
150
+ }
151
+ if (!/^[\w./-]+$/.test(first))
152
+ return null;
153
+ return `${first}:*`;
154
+ }
104
155
  //# sourceMappingURL=loader.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/permissions/loader.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/permissions/loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ export type RedactionRule = {
2
+ kind: 'pii';
3
+ pattern: 'email' | 'phone' | 'name' | 'id';
4
+ } | {
5
+ kind: 'path';
6
+ } | {
7
+ kind: 'mind';
8
+ } | {
9
+ kind: 'api-key';
10
+ } | {
11
+ kind: 'custom';
12
+ id: string;
13
+ find: RegExp | string;
14
+ replaceWith: string;
15
+ };
16
+ export interface RuleHit {
17
+ /** Stable identifier for grouping/UI: `pii:email`, `api-key`, `custom:my-rule`, ... */
18
+ rule: string;
19
+ count: number;
20
+ /** Up to MAX_SAMPLES short examples of the original (pre-redaction) text. */
21
+ samples: string[];
22
+ }
23
+ export interface RedactionResult {
24
+ redacted: string;
25
+ hits: RuleHit[];
26
+ }
27
+ export interface RedactionPreview {
28
+ before: string;
29
+ after: string;
30
+ ruleHits: RuleHit[];
31
+ }
32
+ /** Default rule set per spec 9.2. */
33
+ export declare const DEFAULT_RULES: RedactionRule[];
34
+ /**
35
+ * Apply text-redacting rules to a string. `mind` rule is a no-op here (it
36
+ * only matters for structured value walks); everything else operates on text.
37
+ */
38
+ export declare function redactText(text: string, rules?: RedactionRule[]): RedactionResult;
39
+ interface ValueRedactionResult {
40
+ redacted: unknown;
41
+ hits: RuleHit[];
42
+ }
43
+ /**
44
+ * Deep-walk a JSON-like value, redacting strings via `redactText` and
45
+ * dropping `mind` fields when the `mind` rule is enabled. Arrays/objects
46
+ * are cloned; primitives are returned by value.
47
+ */
48
+ export declare function redactValue(value: unknown, rules?: RedactionRule[]): ValueRedactionResult;
49
+ /**
50
+ * Build a redaction preview for one chunk of text. Returns the original,
51
+ * the redacted output, and the per-rule hit summary suitable for a diff UI.
52
+ */
53
+ export declare function buildPreview(text: string, rules?: RedactionRule[]): RedactionPreview;
54
+ /** Sum hits across an array of RuleHit groups (e.g. per-message hits). */
55
+ export declare function totalHits(perMessage: RuleHit[][]): RuleHit[];
56
+ export {};
package/dist/redact.js ADDED
@@ -0,0 +1,191 @@
1
+ // cli/src/redact.ts — Yome ThreadRedactor (spec 9, CLI side).
2
+ //
3
+ // Local-side redaction of an agent thread before it is shared as a "case"
4
+ // to a skill's GitHub repo. Runs entirely on-device — the hub's optional
5
+ // re-check is a backstop, never a replacement.
6
+ //
7
+ // Pipeline:
8
+ // text → applyRules(text, rules) → { redacted, ruleHits }
9
+ // structured value → redactValue (deep walk) → redacted clone
10
+ //
11
+ // Default rules (per spec 9.2): email | phone | api-key | mind | path.
12
+ // `mind` only applies to structured payloads (it drops fields whose key is
13
+ // `mind` or that look like a mind block). `path` rewrites `/Users/<name>/`
14
+ // to `/Users/{user}/`. The rest are pure regex substitutions on text.
15
+ //
16
+ // Determinism: same input + same rule set → same output. No randomness.
17
+ const MAX_SAMPLES = 3;
18
+ const SAMPLE_MAX_LEN = 80;
19
+ /** Default rule set per spec 9.2. */
20
+ export const DEFAULT_RULES = [
21
+ { kind: 'pii', pattern: 'email' },
22
+ { kind: 'pii', pattern: 'phone' },
23
+ { kind: 'api-key' },
24
+ { kind: 'path' },
25
+ { kind: 'mind' },
26
+ ];
27
+ // ── Built-in patterns ───────────────────────────────────────────────────────
28
+ /** RFC 5322-lite — covers the realistic 99%, not pathological corner cases. */
29
+ const EMAIL_RE = /([A-Za-z0-9._%+-]+)@([A-Za-z0-9.-]+\.[A-Za-z]{2,})/g;
30
+ /**
31
+ * Phone: international (+CC...) and CN mobile (1[3-9]\d{9}).
32
+ * NB: avoid eating arbitrary 10-digit numbers; require + or 1[3-9] anchor.
33
+ */
34
+ const PHONE_RE = /(\+\d{1,3}[ -]?\d{1,4}([ -]?\d{2,4}){2,4}|\b1[3-9]\d{9}\b)/g;
35
+ /**
36
+ * API keys we know the prefix for. Anchored to whole "word" to avoid eating
37
+ * random hex blobs. Add new patterns here as we discover them in the wild.
38
+ */
39
+ const API_KEY_RES = [
40
+ // Anthropic must come BEFORE openai because `sk-ant-...` would otherwise
41
+ // be eaten by the openai pattern (`sk-` + alphanum).
42
+ { id: 'anthropic', re: /\bsk-ant-(?:api03-)?[A-Za-z0-9_-]{20,}\b/g },
43
+ { id: 'openai', re: /\bsk-(?!ant-)(?:proj-)?[A-Za-z0-9_-]{20,}\b/g },
44
+ { id: 'github', re: /\bgh[pousr]_[A-Za-z0-9_]{20,}\b/g },
45
+ { id: 'aws', re: /\bAKIA[0-9A-Z]{16}\b/g },
46
+ { id: 'google', re: /\bAIza[0-9A-Za-z_-]{35}\b/g },
47
+ { id: 'slack', re: /\bxox[abposr]-[A-Za-z0-9-]{10,}\b/g },
48
+ { id: 'jwt', re: /\beyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\b/g },
49
+ { id: 'generic-bearer', re: /\bBearer\s+[A-Za-z0-9._-]{20,}\b/g },
50
+ ];
51
+ /** Match `/Users/<username>/...` (macOS) and `/home/<username>/...` (Linux). */
52
+ const PATH_RE = /(\/Users|\/home)\/([^/\s"'<>]+)/g;
53
+ // ── Helpers ─────────────────────────────────────────────────────────────────
54
+ function pushHit(hits, ruleId, sample) {
55
+ let hit = hits.get(ruleId);
56
+ if (!hit) {
57
+ hit = { rule: ruleId, count: 0, samples: [] };
58
+ hits.set(ruleId, hit);
59
+ }
60
+ hit.count++;
61
+ if (hit.samples.length < MAX_SAMPLES) {
62
+ const trimmed = sample.length > SAMPLE_MAX_LEN ? sample.slice(0, SAMPLE_MAX_LEN) + '…' : sample;
63
+ if (!hit.samples.includes(trimmed))
64
+ hit.samples.push(trimmed);
65
+ }
66
+ }
67
+ function applyRegex(text, re, ruleId, hits, replacer) {
68
+ // RegExp must be /g — clone if a caller passed one without the flag.
69
+ const safeRe = re.flags.includes('g') ? re : new RegExp(re.source, re.flags + 'g');
70
+ return text.replace(safeRe, (match, ...args) => {
71
+ pushHit(hits, ruleId, match);
72
+ // groups are everything but the last two args (offset, full string)
73
+ const groups = args.slice(0, -2);
74
+ return replacer(match, ...groups);
75
+ });
76
+ }
77
+ // ── Text-level rule application ─────────────────────────────────────────────
78
+ /**
79
+ * Apply text-redacting rules to a string. `mind` rule is a no-op here (it
80
+ * only matters for structured value walks); everything else operates on text.
81
+ */
82
+ export function redactText(text, rules = DEFAULT_RULES) {
83
+ const hits = new Map();
84
+ let out = text;
85
+ for (const rule of rules) {
86
+ if (rule.kind === 'pii') {
87
+ switch (rule.pattern) {
88
+ case 'email':
89
+ out = applyRegex(out, EMAIL_RE, 'pii:email', hits, (_m, local, domain) => `${(local || '').slice(0, 1)}***@${domain}`);
90
+ break;
91
+ case 'phone':
92
+ out = applyRegex(out, PHONE_RE, 'pii:phone', hits, () => '[REDACTED_PHONE]');
93
+ break;
94
+ case 'name':
95
+ // Name detection without a model is high-FP; for v0.1 this is an
96
+ // opt-in that does nothing unless paired with a custom rule.
97
+ break;
98
+ case 'id':
99
+ // Reserved for future use (national ID, SSN). v0.1 no-op.
100
+ break;
101
+ }
102
+ }
103
+ else if (rule.kind === 'api-key') {
104
+ for (const { id, re } of API_KEY_RES) {
105
+ out = applyRegex(out, re, `api-key:${id}`, hits, () => `[REDACTED_${id.toUpperCase()}_KEY]`);
106
+ }
107
+ }
108
+ else if (rule.kind === 'path') {
109
+ out = applyRegex(out, PATH_RE, 'path', hits, (_m, root) => `${root}/{user}`);
110
+ }
111
+ else if (rule.kind === 'custom') {
112
+ const re = typeof rule.find === 'string'
113
+ ? new RegExp(rule.find.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'), 'g')
114
+ : rule.find;
115
+ out = applyRegex(out, re, `custom:${rule.id}`, hits, () => rule.replaceWith);
116
+ }
117
+ // `mind` is value-walk-only (see redactValue)
118
+ }
119
+ return { redacted: out, hits: Array.from(hits.values()) };
120
+ }
121
+ // ── Structured value walk (for thread.json / trace.json) ────────────────────
122
+ const MIND_KEY_RE = /^(mind|user_?mind|private_?mind)$/i;
123
+ function isPlainObject(v) {
124
+ return typeof v === 'object' && v !== null && !Array.isArray(v);
125
+ }
126
+ function mergeHits(into, from) {
127
+ for (const h of from) {
128
+ const existing = into.get(h.rule);
129
+ if (!existing) {
130
+ into.set(h.rule, { rule: h.rule, count: h.count, samples: [...h.samples] });
131
+ }
132
+ else {
133
+ existing.count += h.count;
134
+ for (const s of h.samples) {
135
+ if (existing.samples.length >= MAX_SAMPLES)
136
+ break;
137
+ if (!existing.samples.includes(s))
138
+ existing.samples.push(s);
139
+ }
140
+ }
141
+ }
142
+ }
143
+ /**
144
+ * Deep-walk a JSON-like value, redacting strings via `redactText` and
145
+ * dropping `mind` fields when the `mind` rule is enabled. Arrays/objects
146
+ * are cloned; primitives are returned by value.
147
+ */
148
+ export function redactValue(value, rules = DEFAULT_RULES) {
149
+ const dropMind = rules.some(r => r.kind === 'mind');
150
+ const allHits = new Map();
151
+ function walk(v) {
152
+ if (typeof v === 'string') {
153
+ const r = redactText(v, rules);
154
+ mergeHits(allHits, r.hits);
155
+ return r.redacted;
156
+ }
157
+ if (Array.isArray(v))
158
+ return v.map(walk);
159
+ if (isPlainObject(v)) {
160
+ const out = {};
161
+ for (const [k, child] of Object.entries(v)) {
162
+ if (dropMind && MIND_KEY_RE.test(k)) {
163
+ pushHit(allHits, 'mind', `<dropped field "${k}">`);
164
+ continue;
165
+ }
166
+ out[k] = walk(child);
167
+ }
168
+ return out;
169
+ }
170
+ return v;
171
+ }
172
+ const redacted = walk(value);
173
+ return { redacted, hits: Array.from(allHits.values()) };
174
+ }
175
+ // ── Diff preview helper ─────────────────────────────────────────────────────
176
+ /**
177
+ * Build a redaction preview for one chunk of text. Returns the original,
178
+ * the redacted output, and the per-rule hit summary suitable for a diff UI.
179
+ */
180
+ export function buildPreview(text, rules = DEFAULT_RULES) {
181
+ const { redacted, hits } = redactText(text, rules);
182
+ return { before: text, after: redacted, ruleHits: hits };
183
+ }
184
+ /** Sum hits across an array of RuleHit groups (e.g. per-message hits). */
185
+ export function totalHits(perMessage) {
186
+ const merged = new Map();
187
+ for (const group of perMessage)
188
+ mergeHits(merged, group);
189
+ return Array.from(merged.values()).sort((a, b) => b.count - a.count);
190
+ }
191
+ //# sourceMappingURL=redact.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redact.js","sourceRoot":"","sources":["../src/redact.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ export interface AppleScriptResult {
2
+ ok: boolean;
3
+ stdout: string;
4
+ stderr: string;
5
+ /** osascript exit code (0 on success). -1 on launch failure. */
6
+ exitCode: number;
7
+ }
8
+ /**
9
+ * Run an AppleScript source string via `osascript -e`.
10
+ *
11
+ * The Swift sibling does some preflight automation-permission checks via
12
+ * AEDeterminePermissionToAutomateTarget. CLI doesn't have a UI to drive
13
+ * the system prompt, so we just let osascript surface error -1743 — the
14
+ * caller can decide whether to message the user.
15
+ */
16
+ export declare function runOsascript(source: string, opts?: {
17
+ timeoutMs?: number;
18
+ }): AppleScriptResult;
19
+ /**
20
+ * Same as `runOsascript`, but reads the script from a file path instead
21
+ * of inline `-e`. Useful for very long scripts or when keeping a single
22
+ * authoritative `.applescript` file in the skill bundle.
23
+ */
24
+ export declare function runOsascriptFile(path: string, opts?: {
25
+ timeoutMs?: number;
26
+ }): AppleScriptResult;
27
+ /**
28
+ * Open a file via macOS Launch Services (`/usr/bin/open -a`) so the
29
+ * receiving app gets sandbox-implicit access without us having to fight
30
+ * automation prompts, then poll an AppleScript until the file shows up
31
+ * inside that app.
32
+ *
33
+ * Returns the poll script's last output on success, or null on timeout.
34
+ */
35
+ export declare function openViaLaunchServices(args: {
36
+ filePath: string;
37
+ appName: string;
38
+ pollScript: string;
39
+ maxWaitSec?: number;
40
+ pollIntervalMs?: number;
41
+ }): {
42
+ ok: boolean;
43
+ stdout: string;
44
+ stderr: string;
45
+ };
46
+ /** Quote a string so it's safe to embed inside an AppleScript string literal. */
47
+ export declare function asString(s: string): string;
48
+ /** Quote a POSIX path for AppleScript ("POSIX file" wrapping is the caller's job). */
49
+ export declare function asPosixPath(p: string): string;