@namzu/cli 29.1.0 → 32.0.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 (311) hide show
  1. package/CHANGELOG.md +296 -1
  2. package/dist/cli.d.ts.map +1 -1
  3. package/dist/cli.js +5 -1
  4. package/dist/cli.js.map +1 -1
  5. package/dist/commands/acp.d.ts +20 -2
  6. package/dist/commands/acp.d.ts.map +1 -1
  7. package/dist/commands/acp.js +42 -5
  8. package/dist/commands/acp.js.map +1 -1
  9. package/dist/commands/drain.d.ts.map +1 -1
  10. package/dist/commands/drain.js +2 -1
  11. package/dist/commands/drain.js.map +1 -1
  12. package/dist/commands/exec-json.d.ts.map +1 -1
  13. package/dist/commands/exec-json.js +24 -1
  14. package/dist/commands/exec-json.js.map +1 -1
  15. package/dist/commands/exec.d.ts.map +1 -1
  16. package/dist/commands/exec.js +5 -1
  17. package/dist/commands/exec.js.map +1 -1
  18. package/dist/commands/prior-messages.d.ts.map +1 -1
  19. package/dist/commands/prior-messages.js +42 -2
  20. package/dist/commands/prior-messages.js.map +1 -1
  21. package/dist/commands/schedule.d.ts.map +1 -1
  22. package/dist/commands/schedule.js +7 -5
  23. package/dist/commands/schedule.js.map +1 -1
  24. package/dist/config/composer-triggers.d.ts +41 -0
  25. package/dist/config/composer-triggers.d.ts.map +1 -0
  26. package/dist/config/composer-triggers.js +80 -0
  27. package/dist/config/composer-triggers.js.map +1 -0
  28. package/dist/config/load.d.ts.map +1 -1
  29. package/dist/config/load.js +58 -0
  30. package/dist/config/load.js.map +1 -1
  31. package/dist/config/schema.d.ts +34 -0
  32. package/dist/config/schema.d.ts.map +1 -1
  33. package/dist/config/schema.js.map +1 -1
  34. package/dist/context/doctrine.d.ts +3 -3
  35. package/dist/context/doctrine.d.ts.map +1 -1
  36. package/dist/context/doctrine.js +3 -3
  37. package/dist/context/doctrine.js.map +1 -1
  38. package/dist/context/environment.d.ts +26 -3
  39. package/dist/context/environment.d.ts.map +1 -1
  40. package/dist/context/environment.js +68 -9
  41. package/dist/context/environment.js.map +1 -1
  42. package/dist/context/runtime-message.d.ts.map +1 -1
  43. package/dist/context/runtime-message.js +4 -0
  44. package/dist/context/runtime-message.js.map +1 -1
  45. package/dist/integrations/mcp/servers.d.ts +72 -5
  46. package/dist/integrations/mcp/servers.d.ts.map +1 -1
  47. package/dist/integrations/mcp/servers.js +144 -23
  48. package/dist/integrations/mcp/servers.js.map +1 -1
  49. package/dist/integrations/notifications/desktop.d.ts +2 -0
  50. package/dist/integrations/notifications/desktop.d.ts.map +1 -1
  51. package/dist/integrations/notifications/desktop.js +6 -5
  52. package/dist/integrations/notifications/desktop.js.map +1 -1
  53. package/dist/integrations/plugins/runtime.d.ts +10 -2
  54. package/dist/integrations/plugins/runtime.d.ts.map +1 -1
  55. package/dist/integrations/plugins/runtime.js +16 -29
  56. package/dist/integrations/plugins/runtime.js.map +1 -1
  57. package/dist/integrations/providers/harness-credentials.d.ts +9 -4
  58. package/dist/integrations/providers/harness-credentials.d.ts.map +1 -1
  59. package/dist/integrations/providers/harness-credentials.js +16 -8
  60. package/dist/integrations/providers/harness-credentials.js.map +1 -1
  61. package/dist/integrations/resident/session-step.d.ts.map +1 -1
  62. package/dist/integrations/resident/session-step.js +2 -1
  63. package/dist/integrations/resident/session-step.js.map +1 -1
  64. package/dist/integrations/sessions/store.d.ts.map +1 -1
  65. package/dist/integrations/sessions/store.js +20 -2
  66. package/dist/integrations/sessions/store.js.map +1 -1
  67. package/dist/integrations/subagents/NamzuCliAgent.d.ts +8 -0
  68. package/dist/integrations/subagents/NamzuCliAgent.d.ts.map +1 -0
  69. package/dist/integrations/subagents/NamzuCliAgent.js +9 -0
  70. package/dist/integrations/subagents/NamzuCliAgent.js.map +1 -0
  71. package/dist/integrations/subagents/runtime.d.ts +5 -4
  72. package/dist/integrations/subagents/runtime.d.ts.map +1 -1
  73. package/dist/integrations/subagents/runtime.js +46 -11
  74. package/dist/integrations/subagents/runtime.js.map +1 -1
  75. package/dist/integrations/web/open-url.d.ts +24 -0
  76. package/dist/integrations/web/open-url.d.ts.map +1 -0
  77. package/dist/integrations/web/open-url.js +73 -0
  78. package/dist/integrations/web/open-url.js.map +1 -0
  79. package/dist/integrations/web/search.d.ts.map +1 -1
  80. package/dist/integrations/web/search.js +8 -6
  81. package/dist/integrations/web/search.js.map +1 -1
  82. package/dist/permissions/rules.d.ts +5 -1
  83. package/dist/permissions/rules.d.ts.map +1 -1
  84. package/dist/permissions/rules.js +85 -3
  85. package/dist/permissions/rules.js.map +1 -1
  86. package/dist/schedule/build.d.ts +26 -2
  87. package/dist/schedule/build.d.ts.map +1 -1
  88. package/dist/schedule/build.js +139 -20
  89. package/dist/schedule/build.js.map +1 -1
  90. package/dist/schedule/changes.d.ts +6 -0
  91. package/dist/schedule/changes.d.ts.map +1 -1
  92. package/dist/schedule/changes.js +23 -0
  93. package/dist/schedule/changes.js.map +1 -1
  94. package/dist/schedule/commands/add.d.ts +1 -1
  95. package/dist/schedule/commands/add.d.ts.map +1 -1
  96. package/dist/schedule/commands/add.js +188 -54
  97. package/dist/schedule/commands/add.js.map +1 -1
  98. package/dist/schedule/commands/lifecycle.d.ts.map +1 -1
  99. package/dist/schedule/commands/lifecycle.js +2 -1
  100. package/dist/schedule/commands/lifecycle.js.map +1 -1
  101. package/dist/schedule/commands/list.d.ts +2 -0
  102. package/dist/schedule/commands/list.d.ts.map +1 -1
  103. package/dist/schedule/commands/list.js +69 -20
  104. package/dist/schedule/commands/list.js.map +1 -1
  105. package/dist/schedule/daemon/daemon.d.ts +1 -1
  106. package/dist/schedule/daemon/daemon.d.ts.map +1 -1
  107. package/dist/schedule/daemon/daemon.js +22 -5
  108. package/dist/schedule/daemon/daemon.js.map +1 -1
  109. package/dist/schedule/daemon/notify.d.ts +29 -2
  110. package/dist/schedule/daemon/notify.d.ts.map +1 -1
  111. package/dist/schedule/daemon/notify.js +71 -2
  112. package/dist/schedule/daemon/notify.js.map +1 -1
  113. package/dist/schedule/env.d.ts +8 -4
  114. package/dist/schedule/env.d.ts.map +1 -1
  115. package/dist/schedule/env.js +13 -6
  116. package/dist/schedule/env.js.map +1 -1
  117. package/dist/schedule/fire/calls.d.ts +49 -0
  118. package/dist/schedule/fire/calls.d.ts.map +1 -0
  119. package/dist/schedule/fire/calls.js +114 -0
  120. package/dist/schedule/fire/calls.js.map +1 -0
  121. package/dist/schedule/fire/fire.d.ts +1 -1
  122. package/dist/schedule/fire/fire.d.ts.map +1 -1
  123. package/dist/schedule/fire/fire.js +209 -15
  124. package/dist/schedule/fire/fire.js.map +1 -1
  125. package/dist/schedule/fire/result.d.ts +1 -1
  126. package/dist/schedule/fire/result.d.ts.map +1 -1
  127. package/dist/schedule/fire/result.js +2 -1
  128. package/dist/schedule/fire/result.js.map +1 -1
  129. package/dist/schedule/fire/run-script.d.ts +46 -0
  130. package/dist/schedule/fire/run-script.d.ts.map +1 -0
  131. package/dist/schedule/fire/run-script.js +81 -0
  132. package/dist/schedule/fire/run-script.js.map +1 -0
  133. package/dist/schedule/fire/unattended-note.d.ts +8 -0
  134. package/dist/schedule/fire/unattended-note.d.ts.map +1 -1
  135. package/dist/schedule/fire/unattended-note.js +5 -0
  136. package/dist/schedule/fire/unattended-note.js.map +1 -1
  137. package/dist/schedule/fire/wake-gate.d.ts +39 -0
  138. package/dist/schedule/fire/wake-gate.d.ts.map +1 -0
  139. package/dist/schedule/fire/wake-gate.js +90 -0
  140. package/dist/schedule/fire/wake-gate.js.map +1 -0
  141. package/dist/schedule/floor.d.ts +28 -8
  142. package/dist/schedule/floor.d.ts.map +1 -1
  143. package/dist/schedule/floor.js +624 -114
  144. package/dist/schedule/floor.js.map +1 -1
  145. package/dist/schedule/policy.d.ts +40 -0
  146. package/dist/schedule/policy.d.ts.map +1 -1
  147. package/dist/schedule/policy.js +36 -0
  148. package/dist/schedule/policy.js.map +1 -1
  149. package/dist/schedule/script-check.d.ts +53 -0
  150. package/dist/schedule/script-check.d.ts.map +1 -0
  151. package/dist/schedule/script-check.js +145 -0
  152. package/dist/schedule/script-check.js.map +1 -0
  153. package/dist/schedule/script-shell.d.ts +3 -0
  154. package/dist/schedule/script-shell.d.ts.map +1 -0
  155. package/dist/schedule/script-shell.js +5 -0
  156. package/dist/schedule/script-shell.js.map +1 -0
  157. package/dist/schedule/service/index.d.ts +1 -1
  158. package/dist/schedule/service/index.d.ts.map +1 -1
  159. package/dist/schedule/service/index.js +20 -11
  160. package/dist/schedule/service/index.js.map +1 -1
  161. package/dist/schedule/service/manifest.js +1 -1
  162. package/dist/schedule/service/manifest.js.map +1 -1
  163. package/dist/schedule/service/windows-task.d.ts +7 -0
  164. package/dist/schedule/service/windows-task.d.ts.map +1 -1
  165. package/dist/schedule/service/windows-task.js +65 -0
  166. package/dist/schedule/service/windows-task.js.map +1 -1
  167. package/dist/schedule/service/wsl.d.ts +13 -1
  168. package/dist/schedule/service/wsl.d.ts.map +1 -1
  169. package/dist/schedule/service/wsl.js +16 -6
  170. package/dist/schedule/service/wsl.js.map +1 -1
  171. package/dist/schedule/store/atomic.d.ts +5 -2
  172. package/dist/schedule/store/atomic.d.ts.map +1 -1
  173. package/dist/schedule/store/atomic.js +7 -4
  174. package/dist/schedule/store/atomic.js.map +1 -1
  175. package/dist/schedule/store/claims.js +1 -1
  176. package/dist/schedule/store/claims.js.map +1 -1
  177. package/dist/schedule/store/history.d.ts +1 -1
  178. package/dist/schedule/store/history.d.ts.map +1 -1
  179. package/dist/schedule/store/history.js +4 -1
  180. package/dist/schedule/store/history.js.map +1 -1
  181. package/dist/schedule/store/jobs.d.ts +19 -3
  182. package/dist/schedule/store/jobs.d.ts.map +1 -1
  183. package/dist/schedule/store/jobs.js +83 -16
  184. package/dist/schedule/store/jobs.js.map +1 -1
  185. package/dist/schedule/store/state.js +1 -1
  186. package/dist/schedule/store/state.js.map +1 -1
  187. package/dist/schedule/types.d.ts +98 -6
  188. package/dist/schedule/types.d.ts.map +1 -1
  189. package/dist/schedule/types.js +25 -1
  190. package/dist/schedule/types.js.map +1 -1
  191. package/dist/schedule/visible-source.d.ts +18 -0
  192. package/dist/schedule/visible-source.d.ts.map +1 -0
  193. package/dist/schedule/visible-source.js +59 -0
  194. package/dist/schedule/visible-source.js.map +1 -0
  195. package/dist/skills/directory.d.ts +38 -0
  196. package/dist/skills/directory.d.ts.map +1 -0
  197. package/dist/skills/directory.js +51 -0
  198. package/dist/skills/directory.js.map +1 -0
  199. package/dist/test-support/toolset.d.ts +23 -0
  200. package/dist/test-support/toolset.d.ts.map +1 -0
  201. package/dist/test-support/toolset.js +27 -0
  202. package/dist/test-support/toolset.js.map +1 -0
  203. package/dist/tui/App.d.ts.map +1 -1
  204. package/dist/tui/App.js +343 -64
  205. package/dist/tui/App.js.map +1 -1
  206. package/dist/tui/ChoicePicker.d.ts +2 -0
  207. package/dist/tui/ChoicePicker.d.ts.map +1 -1
  208. package/dist/tui/ChoicePicker.js +10 -2
  209. package/dist/tui/ChoicePicker.js.map +1 -1
  210. package/dist/tui/Composer.d.ts +62 -3
  211. package/dist/tui/Composer.d.ts.map +1 -1
  212. package/dist/tui/Composer.js +162 -25
  213. package/dist/tui/Composer.js.map +1 -1
  214. package/dist/tui/ComposerFrame.d.ts +1 -1
  215. package/dist/tui/ComposerFrame.js +3 -3
  216. package/dist/tui/ComposerFrame.js.map +1 -1
  217. package/dist/tui/EffortSlider.d.ts +8 -9
  218. package/dist/tui/EffortSlider.d.ts.map +1 -1
  219. package/dist/tui/EffortSlider.js +15 -12
  220. package/dist/tui/EffortSlider.js.map +1 -1
  221. package/dist/tui/PermissionOverlay.d.ts +13 -1
  222. package/dist/tui/PermissionOverlay.d.ts.map +1 -1
  223. package/dist/tui/PermissionOverlay.js +26 -4
  224. package/dist/tui/PermissionOverlay.js.map +1 -1
  225. package/dist/tui/StatusBar.d.ts +12 -12
  226. package/dist/tui/StatusBar.d.ts.map +1 -1
  227. package/dist/tui/StatusBar.js +15 -15
  228. package/dist/tui/StatusBar.js.map +1 -1
  229. package/dist/tui/agent.d.ts +73 -12
  230. package/dist/tui/agent.d.ts.map +1 -1
  231. package/dist/tui/agent.js +430 -180
  232. package/dist/tui/agent.js.map +1 -1
  233. package/dist/tui/hypermode.d.ts +37 -0
  234. package/dist/tui/hypermode.d.ts.map +1 -0
  235. package/dist/tui/hypermode.js +58 -0
  236. package/dist/tui/hypermode.js.map +1 -0
  237. package/dist/tui/open-browser.d.ts +29 -1
  238. package/dist/tui/open-browser.d.ts.map +1 -1
  239. package/dist/tui/open-browser.js +83 -11
  240. package/dist/tui/open-browser.js.map +1 -1
  241. package/dist/tui/permission-review.d.ts +11 -2
  242. package/dist/tui/permission-review.d.ts.map +1 -1
  243. package/dist/tui/permission-review.js +176 -19
  244. package/dist/tui/permission-review.js.map +1 -1
  245. package/dist/tui/schedule/host-commands.d.ts.map +1 -1
  246. package/dist/tui/schedule/host-commands.js +95 -33
  247. package/dist/tui/schedule/host-commands.js.map +1 -1
  248. package/dist/tui/schedule/integration.d.ts +6 -2
  249. package/dist/tui/schedule/integration.d.ts.map +1 -1
  250. package/dist/tui/schedule/integration.js +3 -1
  251. package/dist/tui/schedule/integration.js.map +1 -1
  252. package/dist/tui/schedule/resume.d.ts.map +1 -1
  253. package/dist/tui/schedule/resume.js +10 -1
  254. package/dist/tui/schedule/resume.js.map +1 -1
  255. package/dist/tui/schedule/tool-host.d.ts +18 -1
  256. package/dist/tui/schedule/tool-host.d.ts.map +1 -1
  257. package/dist/tui/schedule/tool-host.js +384 -84
  258. package/dist/tui/schedule/tool-host.js.map +1 -1
  259. package/dist/tui/slashCommands.d.ts +23 -5
  260. package/dist/tui/slashCommands.d.ts.map +1 -1
  261. package/dist/tui/slashCommands.js +80 -31
  262. package/dist/tui/slashCommands.js.map +1 -1
  263. package/dist/tui/theme.d.ts +10 -4
  264. package/dist/tui/theme.d.ts.map +1 -1
  265. package/dist/tui/theme.js +4 -3
  266. package/dist/tui/theme.js.map +1 -1
  267. package/dist/tui/triggers/analyze.d.ts +57 -0
  268. package/dist/tui/triggers/analyze.d.ts.map +1 -0
  269. package/dist/tui/triggers/analyze.js +221 -0
  270. package/dist/tui/triggers/analyze.js.map +1 -0
  271. package/dist/tui/triggers/context-text.d.ts +21 -0
  272. package/dist/tui/triggers/context-text.d.ts.map +1 -0
  273. package/dist/tui/triggers/context-text.js +44 -0
  274. package/dist/tui/triggers/context-text.js.map +1 -0
  275. package/dist/tui/triggers/copy.d.ts +38 -0
  276. package/dist/tui/triggers/copy.d.ts.map +1 -0
  277. package/dist/tui/triggers/copy.js +163 -0
  278. package/dist/tui/triggers/copy.js.map +1 -0
  279. package/dist/tui/triggers/detect.d.ts +83 -0
  280. package/dist/tui/triggers/detect.d.ts.map +1 -0
  281. package/dist/tui/triggers/detect.js +295 -0
  282. package/dist/tui/triggers/detect.js.map +1 -0
  283. package/dist/tui/triggers/fold.d.ts +34 -0
  284. package/dist/tui/triggers/fold.d.ts.map +1 -0
  285. package/dist/tui/triggers/fold.js +44 -0
  286. package/dist/tui/triggers/fold.js.map +1 -0
  287. package/dist/tui/triggers/pattern.d.ts +66 -0
  288. package/dist/tui/triggers/pattern.d.ts.map +1 -0
  289. package/dist/tui/triggers/pattern.js +243 -0
  290. package/dist/tui/triggers/pattern.js.map +1 -0
  291. package/dist/tui/triggers/provenance.d.ts +58 -0
  292. package/dist/tui/triggers/provenance.d.ts.map +1 -0
  293. package/dist/tui/triggers/provenance.js +98 -0
  294. package/dist/tui/triggers/provenance.js.map +1 -0
  295. package/dist/tui/triggers/registry.d.ts +113 -0
  296. package/dist/tui/triggers/registry.d.ts.map +1 -0
  297. package/dist/tui/triggers/registry.js +164 -0
  298. package/dist/tui/triggers/registry.js.map +1 -0
  299. package/dist/tui/triggers/setting.d.ts +18 -0
  300. package/dist/tui/triggers/setting.d.ts.map +1 -0
  301. package/dist/tui/triggers/setting.js +61 -0
  302. package/dist/tui/triggers/setting.js.map +1 -0
  303. package/dist/tui/triggers/verbs.d.ts +29 -0
  304. package/dist/tui/triggers/verbs.d.ts.map +1 -0
  305. package/dist/tui/triggers/verbs.js +140 -0
  306. package/dist/tui/triggers/verbs.js.map +1 -0
  307. package/dist/tui/types.d.ts +3 -1
  308. package/dist/tui/types.d.ts.map +1 -1
  309. package/package.json +12 -12
  310. package/skills/README.md +5 -0
  311. package/skills/schedule-task/SKILL.md +123 -5
@@ -0,0 +1,243 @@
1
+ /**
2
+ * The phrase language of composer triggers, compiled to a token automaton.
3
+ *
4
+ * word one token, matched after folding (`fold.ts`)
5
+ * (a|b c) one of the alternatives; an alternative may be several words
6
+ * [a|b] optional: one of the alternatives, or nothing
7
+ * <n> a run of digits
8
+ * word+' `word` itself, or `word` with an apostrophe suffix: `skill'e`
9
+ * {verb|verb} any positive request form of the verbs, from `verbs.ts`
10
+ *
11
+ * No `RegExp` is ever built from a pattern: a pattern compiles to a small
12
+ * nondeterministic automaton over tokens, and matching simulates it. The
13
+ * simulation counts its steps so a test can bound the cost on a long draft
14
+ * without reading a clock.
15
+ */
16
+ import { fold } from './fold.js';
17
+ import { QUESTION_PARTICLES, verbForms } from './verbs.js';
18
+ /** Flags a verb form carries into the match it ends. */
19
+ export const FORM_POLITE = 1;
20
+ export const FORM_OPTATIVE = 2;
21
+ export class PatternError extends Error {
22
+ constructor(source, reason) {
23
+ super(`Trigger phrase "${source}": ${reason}`);
24
+ this.name = 'PatternError';
25
+ }
26
+ }
27
+ export function compilePattern(source) {
28
+ const node = parse(source);
29
+ const states = [];
30
+ const state = () => {
31
+ states.push({ edges: [], empty: [] });
32
+ return states.length - 1;
33
+ };
34
+ const build = (current, from) => {
35
+ switch (current.kind) {
36
+ case 'atom': {
37
+ const to = state();
38
+ states[from]?.edges.push({ atom: current.atom, to, flags: 0 });
39
+ return to;
40
+ }
41
+ case 'sequence': {
42
+ let at = from;
43
+ for (const item of current.items)
44
+ at = build(item, at);
45
+ return at;
46
+ }
47
+ case 'choice': {
48
+ const out = state();
49
+ for (const option of current.options) {
50
+ const end = build(option, from);
51
+ states[end]?.empty.push(out);
52
+ }
53
+ if (current.optional)
54
+ states[from]?.empty.push(out);
55
+ return out;
56
+ }
57
+ case 'verb': {
58
+ const out = state();
59
+ for (const verb of current.verbs) {
60
+ for (const form of verbForms(verb)) {
61
+ let at = from;
62
+ form.tokens.forEach((word, index) => {
63
+ const to = index === form.tokens.length - 1 ? out : state();
64
+ const flags = index === form.tokens.length - 1
65
+ ? (form.polite ? FORM_POLITE : 0) | (form.optative ? FORM_OPTATIVE : 0)
66
+ : 0;
67
+ states[at]?.edges.push({ atom: { kind: 'word', text: word }, to, flags });
68
+ at = to;
69
+ });
70
+ }
71
+ }
72
+ return out;
73
+ }
74
+ }
75
+ };
76
+ const start = state();
77
+ const accept = build(node, start);
78
+ const compiled = { source, states, start, accept, firstWords: null };
79
+ return { ...compiled, firstWords: firstWords(compiled) };
80
+ }
81
+ function firstWords(pattern) {
82
+ const words = new Set();
83
+ for (const index of closure(pattern.states, [pattern.start])) {
84
+ for (const edge of pattern.states[index]?.edges ?? []) {
85
+ if (edge.atom.kind !== 'word')
86
+ return null;
87
+ words.add(edge.atom.text);
88
+ }
89
+ }
90
+ return words;
91
+ }
92
+ function closure(states, seeds) {
93
+ const seen = new Set(seeds);
94
+ const stack = [...seeds];
95
+ while (stack.length > 0) {
96
+ const index = stack.pop();
97
+ for (const next of states[index]?.empty ?? []) {
98
+ if (seen.has(next))
99
+ continue;
100
+ seen.add(next);
101
+ stack.push(next);
102
+ }
103
+ }
104
+ return seen;
105
+ }
106
+ function atomMatches(atom, token) {
107
+ switch (atom.kind) {
108
+ case 'word':
109
+ return token === atom.text;
110
+ case 'number':
111
+ return /^\d+$/u.test(token);
112
+ case 'suffix':
113
+ return token === atom.base || token.startsWith(`${atom.base}'`);
114
+ }
115
+ }
116
+ /**
117
+ * Every match of `pattern` that starts at token `start`, longest first. A
118
+ * question particle (`mi`, `mu`) right after a match extends it by one token.
119
+ */
120
+ export function matchAt(pattern, tokens, start, stats) {
121
+ const first = tokens[start];
122
+ if (first === undefined)
123
+ return [];
124
+ if (pattern.firstWords && !pattern.firstWords.has(first)) {
125
+ if (stats)
126
+ stats.steps += 1;
127
+ return [];
128
+ }
129
+ const found = [];
130
+ // A thread is a state and the flags of the forms it has read.
131
+ let threads = new Map();
132
+ for (const state of closure(pattern.states, [pattern.start]))
133
+ threads.set(`${state}:0`, { state, flags: 0 });
134
+ for (let at = start; at < tokens.length && threads.size > 0; at += 1) {
135
+ const token = tokens[at];
136
+ const next = new Map();
137
+ for (const thread of threads.values()) {
138
+ for (const edge of pattern.states[thread.state]?.edges ?? []) {
139
+ if (stats)
140
+ stats.steps += 1;
141
+ if (!atomMatches(edge.atom, token))
142
+ continue;
143
+ const flags = thread.flags | edge.flags;
144
+ for (const state of closure(pattern.states, [edge.to]))
145
+ next.set(`${state}:${flags}`, { state, flags });
146
+ }
147
+ }
148
+ threads = next;
149
+ for (const thread of threads.values()) {
150
+ if (thread.state !== pattern.accept)
151
+ continue;
152
+ const end = at + 1;
153
+ const particle = tokens[end];
154
+ found.push({
155
+ start,
156
+ end: particle !== undefined && QUESTION_PARTICLES.has(particle) ? end + 1 : end,
157
+ flags: thread.flags,
158
+ });
159
+ }
160
+ }
161
+ return found.sort((a, b) => b.end - a.end);
162
+ }
163
+ // ---------------------------------------------------------------------------
164
+ // parsing
165
+ function parse(source) {
166
+ const text = source.trim();
167
+ let index = 0;
168
+ const fail = (reason) => {
169
+ throw new PatternError(source, reason);
170
+ };
171
+ const skipSpace = () => {
172
+ while (text[index] === ' ')
173
+ index += 1;
174
+ };
175
+ const sequence = (closers) => {
176
+ const items = [];
177
+ for (;;) {
178
+ skipSpace();
179
+ const char = text[index];
180
+ if (char === undefined || closers.includes(char))
181
+ break;
182
+ if (char === '(' || char === '[') {
183
+ index += 1;
184
+ const options = alternatives(char === '(' ? ')' : ']');
185
+ items.push({ kind: 'choice', options, optional: char === '[' });
186
+ continue;
187
+ }
188
+ if (char === '{') {
189
+ const close = text.indexOf('}', index);
190
+ if (close < 0)
191
+ fail('an unclosed {');
192
+ const verbs = text
193
+ .slice(index + 1, close)
194
+ .split('|')
195
+ .map((verb) => fold(verb.trim()));
196
+ if (verbs.some((verb) => verb.length === 0))
197
+ fail('an empty verb in {}');
198
+ items.push({ kind: 'verb', verbs });
199
+ index = close + 1;
200
+ continue;
201
+ }
202
+ if (text.startsWith('<n>', index)) {
203
+ items.push({ kind: 'atom', atom: { kind: 'number' } });
204
+ index += 3;
205
+ continue;
206
+ }
207
+ let end = index;
208
+ while (end < text.length && !' ()[]{}|<'.includes(text[end]))
209
+ end += 1;
210
+ const raw = text.slice(index, end);
211
+ if (raw.length === 0)
212
+ fail(`an unexpected "${char}"`);
213
+ index = end;
214
+ if (raw.endsWith("+'")) {
215
+ items.push({ kind: 'atom', atom: { kind: 'suffix', base: fold(raw.slice(0, -2)) } });
216
+ continue;
217
+ }
218
+ const word = fold(raw);
219
+ if (!/^[\p{L}\p{N}_]+(?:'[\p{L}\p{N}_]+)*$/u.test(word))
220
+ fail(`"${raw}" is not one word`);
221
+ items.push({ kind: 'atom', atom: { kind: 'word', text: word } });
222
+ }
223
+ if (items.length === 0)
224
+ fail('an empty alternative');
225
+ return items.length === 1 ? items[0] : { kind: 'sequence', items };
226
+ };
227
+ const alternatives = (closer) => {
228
+ const options = [sequence(`|${closer}`)];
229
+ while (text[index] === '|') {
230
+ index += 1;
231
+ options.push(sequence(`|${closer}`));
232
+ }
233
+ if (text[index] !== closer)
234
+ fail(`a missing ${closer}`);
235
+ index += 1;
236
+ return options;
237
+ };
238
+ const node = sequence('');
239
+ if (index < text.length)
240
+ fail(`an unexpected "${text[index]}"`);
241
+ return node;
242
+ }
243
+ //# sourceMappingURL=pattern.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pattern.js","sourceRoot":"","sources":["../../../src/tui/triggers/pattern.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Where the characters of a composer draft came from, kept as the spans that
3
+ * were NOT typed one key at a time here, and moved along with every edit.
4
+ *
5
+ * Only a human keystroke in this composer arms a trigger. A paste, a burst
6
+ * of input that arrives as one chunk (a paste without bracketed-paste
7
+ * markers looks exactly like that), a recalled or restored prompt, text from
8
+ * the external editor, a yank and an accepted completion are all text the
9
+ * operator did not type here, so a trigger in them is only suggested; Alt+W
10
+ * arms it.
11
+ *
12
+ * Pure: the Composer owns the state and calls these on each edit.
13
+ */
14
+ export type EditOrigin = 'typed' | 'burst' | 'pasted' | 'recalled' | 'restored' | 'editor' | 'yank' | 'completion';
15
+ /** `[start, end)` in UTF-16 code units of the draft. */
16
+ export type Span = readonly [number, number];
17
+ export interface Edit {
18
+ /** Where the replaced stretch starts in the previous draft. */
19
+ readonly start: number;
20
+ /** Where it ends in the previous draft. */
21
+ readonly deleteEnd: number;
22
+ /** How many code units replaced it. */
23
+ readonly insertLength: number;
24
+ }
25
+ /**
26
+ * The single replacement that turns `previous` into `next`. The shared
27
+ * prefix is capped at `cursor` — the cursor before the edit, where every
28
+ * composer edit starts or ends — so an edit inside a run of identical
29
+ * characters is placed where it actually happened.
30
+ */
31
+ export declare function diffEdit(previous: string, next: string, cursor: number): Edit;
32
+ /**
33
+ * Move the non-typed spans through one edit, adding the inserted text unless
34
+ * it was typed. A span the edit cuts through keeps the parts on either side;
35
+ * the replaced part goes, and what replaced it is typed or not by `origin`.
36
+ */
37
+ export declare function applyEdit(spans: readonly Span[], edit: Edit, origin: EditOrigin): Span[];
38
+ /** The spans of a draft replaced whole (history, restore, editor, reset). */
39
+ export declare function replaceAll(length: number, origin: EditOrigin): Span[];
40
+ /** Sorted and merged. */
41
+ export declare function normalize(spans: readonly Span[]): Span[];
42
+ /** An Alt+W decision about the trigger whose words span `[start, end)`. */
43
+ export interface TriggerOverride {
44
+ readonly id: string;
45
+ readonly start: number;
46
+ readonly end: number;
47
+ readonly state: 'dropped' | 'armed';
48
+ }
49
+ /**
50
+ * Move Alt+W decisions through an edit. An edit inside a decided trigger's
51
+ * words forgets the decision: new keystrokes there are the operator saying
52
+ * it again, and the trigger is read afresh. Typing before or after the words
53
+ * keeps it.
54
+ */
55
+ export declare function shiftOverrides(overrides: readonly TriggerOverride[], edit: Edit): TriggerOverride[];
56
+ /** The overrides as `detectTriggers` reads them: by hit key `id@start`. */
57
+ export declare function overrideMap(overrides: readonly TriggerOverride[]): Map<string, 'dropped' | 'armed'>;
58
+ //# sourceMappingURL=provenance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provenance.d.ts","sourceRoot":"","sources":["../../../src/tui/triggers/provenance.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,MAAM,MAAM,UAAU,GACnB,OAAO,GACP,OAAO,GACP,QAAQ,GACR,UAAU,GACV,UAAU,GACV,QAAQ,GACR,MAAM,GACN,YAAY,CAAA;AAEf,wDAAwD;AACxD,MAAM,MAAM,IAAI,GAAG,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;AAE5C,MAAM,WAAW,IAAI;IACpB,+DAA+D;IAC/D,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,2CAA2C;IAC3C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,uCAAuC;IACvC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;CAC7B;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAgB7E;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,SAAS,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI,EAAE,CAcxF;AAED,6EAA6E;AAC7E,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI,EAAE,CAErE;AAED,yBAAyB;AACzB,wBAAgB,SAAS,CAAC,KAAK,EAAE,SAAS,IAAI,EAAE,GAAG,IAAI,EAAE,CASxD;AAED,2EAA2E;AAC3E,MAAM,WAAW,eAAe;IAC/B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAA;CACnC;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAC7B,SAAS,EAAE,SAAS,eAAe,EAAE,EACrC,IAAI,EAAE,IAAI,GACR,eAAe,EAAE,CASnB;AAED,2EAA2E;AAC3E,wBAAgB,WAAW,CAC1B,SAAS,EAAE,SAAS,eAAe,EAAE,GACnC,GAAG,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,CAElC"}
@@ -0,0 +1,98 @@
1
+ /**
2
+ * Where the characters of a composer draft came from, kept as the spans that
3
+ * were NOT typed one key at a time here, and moved along with every edit.
4
+ *
5
+ * Only a human keystroke in this composer arms a trigger. A paste, a burst
6
+ * of input that arrives as one chunk (a paste without bracketed-paste
7
+ * markers looks exactly like that), a recalled or restored prompt, text from
8
+ * the external editor, a yank and an accepted completion are all text the
9
+ * operator did not type here, so a trigger in them is only suggested; Alt+W
10
+ * arms it.
11
+ *
12
+ * Pure: the Composer owns the state and calls these on each edit.
13
+ */
14
+ /**
15
+ * The single replacement that turns `previous` into `next`. The shared
16
+ * prefix is capped at `cursor` — the cursor before the edit, where every
17
+ * composer edit starts or ends — so an edit inside a run of identical
18
+ * characters is placed where it actually happened.
19
+ */
20
+ export function diffEdit(previous, next, cursor) {
21
+ let prefix = 0;
22
+ const limit = Math.min(previous.length, next.length, Math.max(0, cursor));
23
+ while (prefix < limit && previous.charCodeAt(prefix) === next.charCodeAt(prefix))
24
+ prefix += 1;
25
+ let suffix = 0;
26
+ const room = Math.min(previous.length, next.length) - prefix;
27
+ while (suffix < room &&
28
+ previous.charCodeAt(previous.length - 1 - suffix) === next.charCodeAt(next.length - 1 - suffix))
29
+ suffix += 1;
30
+ return {
31
+ start: prefix,
32
+ deleteEnd: previous.length - suffix,
33
+ insertLength: next.length - suffix - prefix,
34
+ };
35
+ }
36
+ /**
37
+ * Move the non-typed spans through one edit, adding the inserted text unless
38
+ * it was typed. A span the edit cuts through keeps the parts on either side;
39
+ * the replaced part goes, and what replaced it is typed or not by `origin`.
40
+ */
41
+ export function applyEdit(spans, edit, origin) {
42
+ const delta = edit.insertLength - (edit.deleteEnd - edit.start);
43
+ const moved = [];
44
+ for (const [from, to] of spans) {
45
+ if (to <= edit.start)
46
+ moved.push([from, to]);
47
+ else if (from >= edit.deleteEnd)
48
+ moved.push([from + delta, to + delta]);
49
+ else {
50
+ if (from < edit.start)
51
+ moved.push([from, edit.start]);
52
+ if (to > edit.deleteEnd)
53
+ moved.push([edit.deleteEnd + delta, to + delta]);
54
+ }
55
+ }
56
+ if (origin !== 'typed' && edit.insertLength > 0)
57
+ moved.push([edit.start, edit.start + edit.insertLength]);
58
+ return normalize(moved);
59
+ }
60
+ /** The spans of a draft replaced whole (history, restore, editor, reset). */
61
+ export function replaceAll(length, origin) {
62
+ return origin === 'typed' || length === 0 ? [] : [[0, length]];
63
+ }
64
+ /** Sorted and merged. */
65
+ export function normalize(spans) {
66
+ const sorted = [...spans].sort((a, b) => a[0] - b[0]);
67
+ const merged = [];
68
+ for (const [from, to] of sorted) {
69
+ const last = merged[merged.length - 1];
70
+ if (last && from <= last[1])
71
+ last[1] = Math.max(last[1], to);
72
+ else
73
+ merged.push([from, to]);
74
+ }
75
+ return merged;
76
+ }
77
+ /**
78
+ * Move Alt+W decisions through an edit. An edit inside a decided trigger's
79
+ * words forgets the decision: new keystrokes there are the operator saying
80
+ * it again, and the trigger is read afresh. Typing before or after the words
81
+ * keeps it.
82
+ */
83
+ export function shiftOverrides(overrides, edit) {
84
+ const delta = edit.insertLength - (edit.deleteEnd - edit.start);
85
+ const kept = [];
86
+ for (const override of overrides) {
87
+ if (edit.deleteEnd <= override.start)
88
+ kept.push({ ...override, start: override.start + delta, end: override.end + delta });
89
+ else if (edit.start >= override.end)
90
+ kept.push(override);
91
+ }
92
+ return kept;
93
+ }
94
+ /** The overrides as `detectTriggers` reads them: by hit key `id@start`. */
95
+ export function overrideMap(overrides) {
96
+ return new Map(overrides.map((override) => [`${override.id}@${override.start}`, override.state]));
97
+ }
98
+ //# sourceMappingURL=provenance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provenance.js","sourceRoot":"","sources":["../../../src/tui/triggers/provenance.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,113 @@
1
+ /**
2
+ * Composer triggers: words typed into the TUI composer that name one namzu
3
+ * action for the message being written, shown before Enter and dropped with
4
+ * Alt+W. See docs/cli/composer-triggers.md.
5
+ *
6
+ * A trigger is a shorthand for something namzu already does. It grants
7
+ * nothing, skips no confirmation and lasts one turn: `TriggerEffect` has no
8
+ * kind for a permission mode, a directory, a credential, the sandbox, a tool
9
+ * list or a limit, and a test pins that. The operator's words reach the model
10
+ * and the log unchanged; namzu's own words for a trigger travel beside them as
11
+ * request-only context (`context-text.ts`).
12
+ *
13
+ * This module is the TUI's alone: `exec`, `drain`, ACP, the scheduler and
14
+ * sub-agents never import it (a test says so).
15
+ */
16
+ import type { ComposerTriggerId } from '../../config/schema.js';
17
+ import { type CompiledPattern } from './pattern.js';
18
+ export type TriggerId = ComposerTriggerId;
19
+ export declare const TRIGGER_IDS: readonly TriggerId[];
20
+ /**
21
+ * What a trigger does when the text arms it.
22
+ *
23
+ * - `arm`: a strict match arms; a loose one, or text not typed here, suggests.
24
+ * - `suggest`: never arms from text; the tag row offers it, Alt+W arms it.
25
+ * - `off`: not matched at all.
26
+ */
27
+ export type Arming = 'arm' | 'suggest' | 'off';
28
+ export type TriggerLocale = 'en' | 'tr';
29
+ /** The fixed texts namzu adds for a turn; operator text never enters them. */
30
+ export type ContextTextId = 'hypermode' | 'save-skill' | 'schedule';
31
+ /** A command a trigger may run after its turn. Only this one exists. */
32
+ export type TriggerableCommand = '/skills save';
33
+ export type TriggerEffect =
34
+ /**
35
+ * Request-only context for the turn, and optionally an effort for it:
36
+ * `hypermode`, the level `/hypermode` pins (`xhigh`, or the nearest below).
37
+ */
38
+ {
39
+ readonly kind: 'turn-context';
40
+ readonly text: ContextTextId;
41
+ readonly effort?: 'hypermode';
42
+ }
43
+ /** The model's highest published effort for this turn only (max effort). */
44
+ | {
45
+ readonly kind: 'turn-effort';
46
+ readonly effort: 'highest';
47
+ }
48
+ /** A command run once after the turn the message lands in, when that turn did work. */
49
+ | {
50
+ readonly kind: 'after-turn';
51
+ readonly command: TriggerableCommand;
52
+ readonly text: ContextTextId;
53
+ };
54
+ export interface PhraseSpec {
55
+ readonly pattern: string;
56
+ /**
57
+ * Which edges of the match must be clause edges for it to be strict.
58
+ * English puts the verb first, so both; Turkish puts it last, so the right
59
+ * edge carries the request and the left may be any object.
60
+ */
61
+ readonly edges: 'both' | 'right';
62
+ }
63
+ /**
64
+ * A loose match: every slot has a token in one clause, in any order. A slot
65
+ * entry is a word, `word*` for a prefix (loanwords with Turkish suffixes:
66
+ * `skille`, `skillerimi`), or `{verb}` for any of its forms' first token.
67
+ */
68
+ export type LooseSpec = readonly (readonly string[])[];
69
+ export interface TriggerDefinition {
70
+ readonly id: TriggerId;
71
+ /** Shown in the tag row. */
72
+ readonly label: string;
73
+ /** Invented single words; they arm only at a clause edge. */
74
+ readonly keywords: readonly string[];
75
+ readonly phrases: Readonly<Partial<Record<TriggerLocale, readonly PhraseSpec[]>>>;
76
+ readonly loose: Readonly<Partial<Record<TriggerLocale, readonly LooseSpec[]>>>;
77
+ readonly effect: TriggerEffect;
78
+ /** `turn`: the new turn this message starts. `after-turn`: once, after the turn it lands in. */
79
+ readonly scope: 'turn' | 'after-turn';
80
+ /** A whole message that is only this trigger runs this command instead of a prompt. */
81
+ readonly standalone?: TriggerableCommand;
82
+ readonly arming: Arming;
83
+ }
84
+ /** The built-in triggers, in the order their tags are shown. */
85
+ export declare const BUILTIN_TRIGGERS: readonly TriggerDefinition[];
86
+ /** A trigger with its phrases compiled, as the matcher reads it. */
87
+ export interface CompiledTrigger {
88
+ readonly definition: TriggerDefinition;
89
+ readonly arming: Arming;
90
+ readonly keywords: ReadonlySet<string>;
91
+ readonly phrases: readonly {
92
+ readonly pattern: CompiledPattern;
93
+ readonly edges: PhraseSpec['edges'];
94
+ readonly locale: TriggerLocale;
95
+ }[];
96
+ readonly loose: readonly {
97
+ readonly slots: readonly ((token: string) => boolean)[];
98
+ readonly locale: TriggerLocale;
99
+ }[];
100
+ }
101
+ export interface RegistryOptions {
102
+ /** Per-trigger arming, after config; absent keeps the built-in default. */
103
+ readonly arming?: Readonly<Partial<Record<TriggerId, Arming>>>;
104
+ readonly locales?: readonly TriggerLocale[];
105
+ }
106
+ export interface TriggerRegistry {
107
+ readonly triggers: readonly CompiledTrigger[];
108
+ /** Changes whenever the compiled set does; part of the detection memo key. */
109
+ readonly version: string;
110
+ }
111
+ export declare function compileRegistry(definitions?: readonly TriggerDefinition[], options?: RegistryOptions): TriggerRegistry;
112
+ export declare function triggerDefinition(id: TriggerId): TriggerDefinition;
113
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/tui/triggers/registry.ts"],"names":[],"mappings":"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"}