@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.
- package/CHANGELOG.md +296 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +5 -1
- package/dist/cli.js.map +1 -1
- package/dist/commands/acp.d.ts +20 -2
- package/dist/commands/acp.d.ts.map +1 -1
- package/dist/commands/acp.js +42 -5
- package/dist/commands/acp.js.map +1 -1
- package/dist/commands/drain.d.ts.map +1 -1
- package/dist/commands/drain.js +2 -1
- package/dist/commands/drain.js.map +1 -1
- package/dist/commands/exec-json.d.ts.map +1 -1
- package/dist/commands/exec-json.js +24 -1
- package/dist/commands/exec-json.js.map +1 -1
- package/dist/commands/exec.d.ts.map +1 -1
- package/dist/commands/exec.js +5 -1
- package/dist/commands/exec.js.map +1 -1
- package/dist/commands/prior-messages.d.ts.map +1 -1
- package/dist/commands/prior-messages.js +42 -2
- package/dist/commands/prior-messages.js.map +1 -1
- package/dist/commands/schedule.d.ts.map +1 -1
- package/dist/commands/schedule.js +7 -5
- package/dist/commands/schedule.js.map +1 -1
- package/dist/config/composer-triggers.d.ts +41 -0
- package/dist/config/composer-triggers.d.ts.map +1 -0
- package/dist/config/composer-triggers.js +80 -0
- package/dist/config/composer-triggers.js.map +1 -0
- package/dist/config/load.d.ts.map +1 -1
- package/dist/config/load.js +58 -0
- package/dist/config/load.js.map +1 -1
- package/dist/config/schema.d.ts +34 -0
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js.map +1 -1
- package/dist/context/doctrine.d.ts +3 -3
- package/dist/context/doctrine.d.ts.map +1 -1
- package/dist/context/doctrine.js +3 -3
- package/dist/context/doctrine.js.map +1 -1
- package/dist/context/environment.d.ts +26 -3
- package/dist/context/environment.d.ts.map +1 -1
- package/dist/context/environment.js +68 -9
- package/dist/context/environment.js.map +1 -1
- package/dist/context/runtime-message.d.ts.map +1 -1
- package/dist/context/runtime-message.js +4 -0
- package/dist/context/runtime-message.js.map +1 -1
- package/dist/integrations/mcp/servers.d.ts +72 -5
- package/dist/integrations/mcp/servers.d.ts.map +1 -1
- package/dist/integrations/mcp/servers.js +144 -23
- package/dist/integrations/mcp/servers.js.map +1 -1
- package/dist/integrations/notifications/desktop.d.ts +2 -0
- package/dist/integrations/notifications/desktop.d.ts.map +1 -1
- package/dist/integrations/notifications/desktop.js +6 -5
- package/dist/integrations/notifications/desktop.js.map +1 -1
- package/dist/integrations/plugins/runtime.d.ts +10 -2
- package/dist/integrations/plugins/runtime.d.ts.map +1 -1
- package/dist/integrations/plugins/runtime.js +16 -29
- package/dist/integrations/plugins/runtime.js.map +1 -1
- package/dist/integrations/providers/harness-credentials.d.ts +9 -4
- package/dist/integrations/providers/harness-credentials.d.ts.map +1 -1
- package/dist/integrations/providers/harness-credentials.js +16 -8
- package/dist/integrations/providers/harness-credentials.js.map +1 -1
- package/dist/integrations/resident/session-step.d.ts.map +1 -1
- package/dist/integrations/resident/session-step.js +2 -1
- package/dist/integrations/resident/session-step.js.map +1 -1
- package/dist/integrations/sessions/store.d.ts.map +1 -1
- package/dist/integrations/sessions/store.js +20 -2
- package/dist/integrations/sessions/store.js.map +1 -1
- package/dist/integrations/subagents/NamzuCliAgent.d.ts +8 -0
- package/dist/integrations/subagents/NamzuCliAgent.d.ts.map +1 -0
- package/dist/integrations/subagents/NamzuCliAgent.js +9 -0
- package/dist/integrations/subagents/NamzuCliAgent.js.map +1 -0
- package/dist/integrations/subagents/runtime.d.ts +5 -4
- package/dist/integrations/subagents/runtime.d.ts.map +1 -1
- package/dist/integrations/subagents/runtime.js +46 -11
- package/dist/integrations/subagents/runtime.js.map +1 -1
- package/dist/integrations/web/open-url.d.ts +24 -0
- package/dist/integrations/web/open-url.d.ts.map +1 -0
- package/dist/integrations/web/open-url.js +73 -0
- package/dist/integrations/web/open-url.js.map +1 -0
- package/dist/integrations/web/search.d.ts.map +1 -1
- package/dist/integrations/web/search.js +8 -6
- package/dist/integrations/web/search.js.map +1 -1
- package/dist/permissions/rules.d.ts +5 -1
- package/dist/permissions/rules.d.ts.map +1 -1
- package/dist/permissions/rules.js +85 -3
- package/dist/permissions/rules.js.map +1 -1
- package/dist/schedule/build.d.ts +26 -2
- package/dist/schedule/build.d.ts.map +1 -1
- package/dist/schedule/build.js +139 -20
- package/dist/schedule/build.js.map +1 -1
- package/dist/schedule/changes.d.ts +6 -0
- package/dist/schedule/changes.d.ts.map +1 -1
- package/dist/schedule/changes.js +23 -0
- package/dist/schedule/changes.js.map +1 -1
- package/dist/schedule/commands/add.d.ts +1 -1
- package/dist/schedule/commands/add.d.ts.map +1 -1
- package/dist/schedule/commands/add.js +188 -54
- package/dist/schedule/commands/add.js.map +1 -1
- package/dist/schedule/commands/lifecycle.d.ts.map +1 -1
- package/dist/schedule/commands/lifecycle.js +2 -1
- package/dist/schedule/commands/lifecycle.js.map +1 -1
- package/dist/schedule/commands/list.d.ts +2 -0
- package/dist/schedule/commands/list.d.ts.map +1 -1
- package/dist/schedule/commands/list.js +69 -20
- package/dist/schedule/commands/list.js.map +1 -1
- package/dist/schedule/daemon/daemon.d.ts +1 -1
- package/dist/schedule/daemon/daemon.d.ts.map +1 -1
- package/dist/schedule/daemon/daemon.js +22 -5
- package/dist/schedule/daemon/daemon.js.map +1 -1
- package/dist/schedule/daemon/notify.d.ts +29 -2
- package/dist/schedule/daemon/notify.d.ts.map +1 -1
- package/dist/schedule/daemon/notify.js +71 -2
- package/dist/schedule/daemon/notify.js.map +1 -1
- package/dist/schedule/env.d.ts +8 -4
- package/dist/schedule/env.d.ts.map +1 -1
- package/dist/schedule/env.js +13 -6
- package/dist/schedule/env.js.map +1 -1
- package/dist/schedule/fire/calls.d.ts +49 -0
- package/dist/schedule/fire/calls.d.ts.map +1 -0
- package/dist/schedule/fire/calls.js +114 -0
- package/dist/schedule/fire/calls.js.map +1 -0
- package/dist/schedule/fire/fire.d.ts +1 -1
- package/dist/schedule/fire/fire.d.ts.map +1 -1
- package/dist/schedule/fire/fire.js +209 -15
- package/dist/schedule/fire/fire.js.map +1 -1
- package/dist/schedule/fire/result.d.ts +1 -1
- package/dist/schedule/fire/result.d.ts.map +1 -1
- package/dist/schedule/fire/result.js +2 -1
- package/dist/schedule/fire/result.js.map +1 -1
- package/dist/schedule/fire/run-script.d.ts +46 -0
- package/dist/schedule/fire/run-script.d.ts.map +1 -0
- package/dist/schedule/fire/run-script.js +81 -0
- package/dist/schedule/fire/run-script.js.map +1 -0
- package/dist/schedule/fire/unattended-note.d.ts +8 -0
- package/dist/schedule/fire/unattended-note.d.ts.map +1 -1
- package/dist/schedule/fire/unattended-note.js +5 -0
- package/dist/schedule/fire/unattended-note.js.map +1 -1
- package/dist/schedule/fire/wake-gate.d.ts +39 -0
- package/dist/schedule/fire/wake-gate.d.ts.map +1 -0
- package/dist/schedule/fire/wake-gate.js +90 -0
- package/dist/schedule/fire/wake-gate.js.map +1 -0
- package/dist/schedule/floor.d.ts +28 -8
- package/dist/schedule/floor.d.ts.map +1 -1
- package/dist/schedule/floor.js +624 -114
- package/dist/schedule/floor.js.map +1 -1
- package/dist/schedule/policy.d.ts +40 -0
- package/dist/schedule/policy.d.ts.map +1 -1
- package/dist/schedule/policy.js +36 -0
- package/dist/schedule/policy.js.map +1 -1
- package/dist/schedule/script-check.d.ts +53 -0
- package/dist/schedule/script-check.d.ts.map +1 -0
- package/dist/schedule/script-check.js +145 -0
- package/dist/schedule/script-check.js.map +1 -0
- package/dist/schedule/script-shell.d.ts +3 -0
- package/dist/schedule/script-shell.d.ts.map +1 -0
- package/dist/schedule/script-shell.js +5 -0
- package/dist/schedule/script-shell.js.map +1 -0
- package/dist/schedule/service/index.d.ts +1 -1
- package/dist/schedule/service/index.d.ts.map +1 -1
- package/dist/schedule/service/index.js +20 -11
- package/dist/schedule/service/index.js.map +1 -1
- package/dist/schedule/service/manifest.js +1 -1
- package/dist/schedule/service/manifest.js.map +1 -1
- package/dist/schedule/service/windows-task.d.ts +7 -0
- package/dist/schedule/service/windows-task.d.ts.map +1 -1
- package/dist/schedule/service/windows-task.js +65 -0
- package/dist/schedule/service/windows-task.js.map +1 -1
- package/dist/schedule/service/wsl.d.ts +13 -1
- package/dist/schedule/service/wsl.d.ts.map +1 -1
- package/dist/schedule/service/wsl.js +16 -6
- package/dist/schedule/service/wsl.js.map +1 -1
- package/dist/schedule/store/atomic.d.ts +5 -2
- package/dist/schedule/store/atomic.d.ts.map +1 -1
- package/dist/schedule/store/atomic.js +7 -4
- package/dist/schedule/store/atomic.js.map +1 -1
- package/dist/schedule/store/claims.js +1 -1
- package/dist/schedule/store/claims.js.map +1 -1
- package/dist/schedule/store/history.d.ts +1 -1
- package/dist/schedule/store/history.d.ts.map +1 -1
- package/dist/schedule/store/history.js +4 -1
- package/dist/schedule/store/history.js.map +1 -1
- package/dist/schedule/store/jobs.d.ts +19 -3
- package/dist/schedule/store/jobs.d.ts.map +1 -1
- package/dist/schedule/store/jobs.js +83 -16
- package/dist/schedule/store/jobs.js.map +1 -1
- package/dist/schedule/store/state.js +1 -1
- package/dist/schedule/store/state.js.map +1 -1
- package/dist/schedule/types.d.ts +98 -6
- package/dist/schedule/types.d.ts.map +1 -1
- package/dist/schedule/types.js +25 -1
- package/dist/schedule/types.js.map +1 -1
- package/dist/schedule/visible-source.d.ts +18 -0
- package/dist/schedule/visible-source.d.ts.map +1 -0
- package/dist/schedule/visible-source.js +59 -0
- package/dist/schedule/visible-source.js.map +1 -0
- package/dist/skills/directory.d.ts +38 -0
- package/dist/skills/directory.d.ts.map +1 -0
- package/dist/skills/directory.js +51 -0
- package/dist/skills/directory.js.map +1 -0
- package/dist/test-support/toolset.d.ts +23 -0
- package/dist/test-support/toolset.d.ts.map +1 -0
- package/dist/test-support/toolset.js +27 -0
- package/dist/test-support/toolset.js.map +1 -0
- package/dist/tui/App.d.ts.map +1 -1
- package/dist/tui/App.js +343 -64
- package/dist/tui/App.js.map +1 -1
- package/dist/tui/ChoicePicker.d.ts +2 -0
- package/dist/tui/ChoicePicker.d.ts.map +1 -1
- package/dist/tui/ChoicePicker.js +10 -2
- package/dist/tui/ChoicePicker.js.map +1 -1
- package/dist/tui/Composer.d.ts +62 -3
- package/dist/tui/Composer.d.ts.map +1 -1
- package/dist/tui/Composer.js +162 -25
- package/dist/tui/Composer.js.map +1 -1
- package/dist/tui/ComposerFrame.d.ts +1 -1
- package/dist/tui/ComposerFrame.js +3 -3
- package/dist/tui/ComposerFrame.js.map +1 -1
- package/dist/tui/EffortSlider.d.ts +8 -9
- package/dist/tui/EffortSlider.d.ts.map +1 -1
- package/dist/tui/EffortSlider.js +15 -12
- package/dist/tui/EffortSlider.js.map +1 -1
- package/dist/tui/PermissionOverlay.d.ts +13 -1
- package/dist/tui/PermissionOverlay.d.ts.map +1 -1
- package/dist/tui/PermissionOverlay.js +26 -4
- package/dist/tui/PermissionOverlay.js.map +1 -1
- package/dist/tui/StatusBar.d.ts +12 -12
- package/dist/tui/StatusBar.d.ts.map +1 -1
- package/dist/tui/StatusBar.js +15 -15
- package/dist/tui/StatusBar.js.map +1 -1
- package/dist/tui/agent.d.ts +73 -12
- package/dist/tui/agent.d.ts.map +1 -1
- package/dist/tui/agent.js +430 -180
- package/dist/tui/agent.js.map +1 -1
- package/dist/tui/hypermode.d.ts +37 -0
- package/dist/tui/hypermode.d.ts.map +1 -0
- package/dist/tui/hypermode.js +58 -0
- package/dist/tui/hypermode.js.map +1 -0
- package/dist/tui/open-browser.d.ts +29 -1
- package/dist/tui/open-browser.d.ts.map +1 -1
- package/dist/tui/open-browser.js +83 -11
- package/dist/tui/open-browser.js.map +1 -1
- package/dist/tui/permission-review.d.ts +11 -2
- package/dist/tui/permission-review.d.ts.map +1 -1
- package/dist/tui/permission-review.js +176 -19
- package/dist/tui/permission-review.js.map +1 -1
- package/dist/tui/schedule/host-commands.d.ts.map +1 -1
- package/dist/tui/schedule/host-commands.js +95 -33
- package/dist/tui/schedule/host-commands.js.map +1 -1
- package/dist/tui/schedule/integration.d.ts +6 -2
- package/dist/tui/schedule/integration.d.ts.map +1 -1
- package/dist/tui/schedule/integration.js +3 -1
- package/dist/tui/schedule/integration.js.map +1 -1
- package/dist/tui/schedule/resume.d.ts.map +1 -1
- package/dist/tui/schedule/resume.js +10 -1
- package/dist/tui/schedule/resume.js.map +1 -1
- package/dist/tui/schedule/tool-host.d.ts +18 -1
- package/dist/tui/schedule/tool-host.d.ts.map +1 -1
- package/dist/tui/schedule/tool-host.js +384 -84
- package/dist/tui/schedule/tool-host.js.map +1 -1
- package/dist/tui/slashCommands.d.ts +23 -5
- package/dist/tui/slashCommands.d.ts.map +1 -1
- package/dist/tui/slashCommands.js +80 -31
- package/dist/tui/slashCommands.js.map +1 -1
- package/dist/tui/theme.d.ts +10 -4
- package/dist/tui/theme.d.ts.map +1 -1
- package/dist/tui/theme.js +4 -3
- package/dist/tui/theme.js.map +1 -1
- package/dist/tui/triggers/analyze.d.ts +57 -0
- package/dist/tui/triggers/analyze.d.ts.map +1 -0
- package/dist/tui/triggers/analyze.js +221 -0
- package/dist/tui/triggers/analyze.js.map +1 -0
- package/dist/tui/triggers/context-text.d.ts +21 -0
- package/dist/tui/triggers/context-text.d.ts.map +1 -0
- package/dist/tui/triggers/context-text.js +44 -0
- package/dist/tui/triggers/context-text.js.map +1 -0
- package/dist/tui/triggers/copy.d.ts +38 -0
- package/dist/tui/triggers/copy.d.ts.map +1 -0
- package/dist/tui/triggers/copy.js +163 -0
- package/dist/tui/triggers/copy.js.map +1 -0
- package/dist/tui/triggers/detect.d.ts +83 -0
- package/dist/tui/triggers/detect.d.ts.map +1 -0
- package/dist/tui/triggers/detect.js +295 -0
- package/dist/tui/triggers/detect.js.map +1 -0
- package/dist/tui/triggers/fold.d.ts +34 -0
- package/dist/tui/triggers/fold.d.ts.map +1 -0
- package/dist/tui/triggers/fold.js +44 -0
- package/dist/tui/triggers/fold.js.map +1 -0
- package/dist/tui/triggers/pattern.d.ts +66 -0
- package/dist/tui/triggers/pattern.d.ts.map +1 -0
- package/dist/tui/triggers/pattern.js +243 -0
- package/dist/tui/triggers/pattern.js.map +1 -0
- package/dist/tui/triggers/provenance.d.ts +58 -0
- package/dist/tui/triggers/provenance.d.ts.map +1 -0
- package/dist/tui/triggers/provenance.js +98 -0
- package/dist/tui/triggers/provenance.js.map +1 -0
- package/dist/tui/triggers/registry.d.ts +113 -0
- package/dist/tui/triggers/registry.d.ts.map +1 -0
- package/dist/tui/triggers/registry.js +164 -0
- package/dist/tui/triggers/registry.js.map +1 -0
- package/dist/tui/triggers/setting.d.ts +18 -0
- package/dist/tui/triggers/setting.d.ts.map +1 -0
- package/dist/tui/triggers/setting.js +61 -0
- package/dist/tui/triggers/setting.js.map +1 -0
- package/dist/tui/triggers/verbs.d.ts +29 -0
- package/dist/tui/triggers/verbs.d.ts.map +1 -0
- package/dist/tui/triggers/verbs.js +140 -0
- package/dist/tui/triggers/verbs.js.map +1 -0
- package/dist/tui/types.d.ts +3 -1
- package/dist/tui/types.d.ts.map +1 -1
- package/package.json +12 -12
- package/skills/README.md +5 -0
- 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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"}
|