@cmodjs/core 3.1.0 → 4.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/docs/commands.md +38 -21
- package/docs/dependencies.md +27 -20
- package/docs/index.md +21 -17
- package/docs/install-steps.md +37 -29
- package/docs/jobs.md +25 -52
- package/docs/mod.md +93 -65
- package/docs/options.md +2 -2
- package/docs/permissions.md +4 -4
- package/docs/session.md +14 -12
- package/docs/testing.md +55 -32
- package/docs/ui.md +255 -263
- package/hotkeys.d.ts +22 -0
- package/hotkeys.d.ts.map +1 -0
- package/hotkeys.js +26 -0
- package/installer.d.ts +1 -1
- package/installer.d.ts.map +1 -1
- package/installer.js +11 -6
- package/jobs/check.d.ts +2 -1
- package/jobs/check.d.ts.map +1 -1
- package/jobs/check.js +2 -2
- package/jobs/context.d.ts +2 -1
- package/jobs/context.d.ts.map +1 -1
- package/jobs/context.js +1 -1
- package/jobs/permissions.d.ts +2 -1
- package/jobs/permissions.d.ts.map +1 -1
- package/jobs/permissions.js +2 -2
- package/jobs/program.js +1 -1
- package/jobs/prompt.d.ts +2 -1
- package/jobs/prompt.d.ts.map +1 -1
- package/jobs/prompt.js +20 -13
- package/jobs/schedule.d.ts +2 -1
- package/jobs/schedule.d.ts.map +1 -1
- package/jobs/schedule.js +15 -1
- package/jobs/slash-command.d.ts +6 -2
- package/jobs/slash-command.d.ts.map +1 -1
- package/jobs/slash-command.js +6 -5
- package/jobs/tool.d.ts +6 -4
- package/jobs/tool.d.ts.map +1 -1
- package/jobs/tool.js +3 -3
- package/mod.d.ts +63 -42
- package/mod.d.ts.map +1 -1
- package/mod.js +11 -1
- package/package.json +1 -1
- package/records.d.ts +13 -8
- package/records.d.ts.map +1 -1
- package/records.js +41 -31
- package/register.d.ts.map +1 -1
- package/register.js +1 -2
- package/runtime/announce.d.ts +1 -1
- package/runtime/announce.d.ts.map +1 -1
- package/runtime/announce.js +6 -7
- package/runtime/before.d.ts +2 -2
- package/runtime/before.d.ts.map +1 -1
- package/runtime/before.js +1 -1
- package/runtime/claude.d.ts +0 -1
- package/runtime/claude.d.ts.map +1 -1
- package/runtime/conversations.d.ts +4 -1
- package/runtime/conversations.d.ts.map +1 -1
- package/runtime/conversations.js +42 -14
- package/runtime/dependencies.d.ts.map +1 -1
- package/runtime/dependencies.js +2 -1
- package/runtime/engine.d.ts +5 -0
- package/runtime/engine.d.ts.map +1 -1
- package/runtime/grants.js +2 -2
- package/runtime/hooks.d.ts +1 -1
- package/runtime/hooks.d.ts.map +1 -1
- package/runtime/hotkeys.d.ts +15 -0
- package/runtime/hotkeys.d.ts.map +1 -0
- package/runtime/hotkeys.js +58 -0
- package/runtime/installer.d.ts +5 -2
- package/runtime/installer.d.ts.map +1 -1
- package/runtime/installer.js +23 -12
- package/runtime/lifecycle.d.ts.map +1 -1
- package/runtime/lifecycle.js +190 -141
- package/runtime/options.js +2 -2
- package/runtime/pages.d.ts +28 -0
- package/runtime/pages.d.ts.map +1 -0
- package/runtime/pages.js +98 -0
- package/runtime/parts.d.ts +14 -0
- package/runtime/parts.d.ts.map +1 -0
- package/runtime/parts.js +63 -0
- package/runtime/permission-check.d.ts +2 -2
- package/runtime/permission-check.d.ts.map +1 -1
- package/runtime/programs.js +1 -1
- package/runtime/router.d.ts +2 -2
- package/runtime/router.d.ts.map +1 -1
- package/runtime/router.js +1 -1
- package/runtime/sessions.d.ts +10 -9
- package/runtime/sessions.d.ts.map +1 -1
- package/runtime/sessions.js +14 -5
- package/runtime/state.d.ts +2 -1
- package/runtime/state.d.ts.map +1 -1
- package/runtime/state.js +1 -0
- package/runtime/toaster.d.ts +1 -1
- package/runtime/toaster.d.ts.map +1 -1
- package/runtime/toaster.js +10 -4
- package/runtime/ui.d.ts +87 -5
- package/runtime/ui.d.ts.map +1 -1
- package/runtime/ui.js +372 -109
- package/runtime/watches.d.ts +9 -0
- package/runtime/watches.d.ts.map +1 -0
- package/runtime/watches.js +73 -0
- package/runtime/widgets.d.ts +48 -0
- package/runtime/widgets.d.ts.map +1 -0
- package/runtime/widgets.js +219 -0
- package/session/context/turn/message/message.d.ts.map +1 -1
- package/session/context/turn/message/message.js +7 -2
- package/session/session.d.ts +11 -5
- package/session/session.d.ts.map +1 -1
- package/src/hotkeys.ts +51 -0
- package/src/installer.ts +8 -4
- package/src/jobs/check.ts +4 -3
- package/src/jobs/context.ts +3 -2
- package/src/jobs/permissions.ts +4 -3
- package/src/jobs/program.ts +1 -1
- package/src/jobs/prompt.ts +23 -14
- package/src/jobs/schedule.ts +16 -2
- package/src/jobs/slash-command.ts +10 -7
- package/src/jobs/tool.ts +7 -5
- package/src/mod.ts +59 -47
- package/src/records.ts +46 -31
- package/src/register.ts +2 -3
- package/src/runtime/announce.ts +6 -7
- package/src/runtime/before.ts +4 -4
- package/src/runtime/claude.ts +0 -1
- package/src/runtime/conversations.ts +66 -20
- package/src/runtime/dependencies.ts +2 -1
- package/src/runtime/engine.ts +5 -0
- package/src/runtime/grants.ts +2 -2
- package/src/runtime/hooks.ts +1 -0
- package/src/runtime/hotkeys.ts +80 -0
- package/src/runtime/installer.ts +24 -12
- package/src/runtime/lifecycle.ts +189 -136
- package/src/runtime/options.ts +2 -2
- package/src/runtime/pages.ts +127 -0
- package/src/runtime/parts.ts +72 -0
- package/src/runtime/permission-check.ts +2 -2
- package/src/runtime/programs.ts +1 -1
- package/src/runtime/router.ts +3 -3
- package/src/runtime/sessions.ts +24 -15
- package/src/runtime/state.ts +3 -1
- package/src/runtime/toaster.ts +10 -4
- package/src/runtime/ui.ts +405 -115
- package/src/runtime/watches.ts +75 -0
- package/src/runtime/widgets.ts +287 -0
- package/src/session/context/turn/message/message.ts +7 -2
- package/src/session/session.ts +10 -6
- package/src/testing/fake-claude.ts +9 -6
- package/src/testing/fake-elements.ts +7 -4
- package/src/testing/fake-sessions.ts +6 -4
- package/src/testing.ts +203 -46
- package/src/ui/areas.ts +27 -0
- package/src/ui/elements.ts +35 -0
- package/src/ui/markdown.ts +18 -18
- package/src/ui/panes.ts +73 -0
- package/src/ui/styles.ts +53 -0
- package/src/utils/subscription.ts +1 -0
- package/testing/fake-claude.d.ts +0 -1
- package/testing/fake-claude.d.ts.map +1 -1
- package/testing/fake-claude.js +9 -5
- package/testing/fake-elements.js +7 -4
- package/testing/fake-sessions.d.ts +2 -1
- package/testing/fake-sessions.d.ts.map +1 -1
- package/testing/fake-sessions.js +1 -0
- package/testing.d.ts +21 -6
- package/testing.d.ts.map +1 -1
- package/testing.js +206 -45
- package/ui/areas.d.ts +29 -0
- package/ui/areas.d.ts.map +1 -0
- package/ui/areas.js +6 -0
- package/ui/elements.d.ts +3 -0
- package/ui/elements.d.ts.map +1 -1
- package/ui/elements.js +36 -0
- package/ui/markdown.d.ts +14 -14
- package/ui/markdown.d.ts.map +1 -1
- package/ui/markdown.js +11 -11
- package/ui/panes.d.ts +71 -0
- package/ui/panes.d.ts.map +1 -0
- package/ui/panes.js +16 -0
- package/ui/styles.d.ts +44 -0
- package/ui/styles.d.ts.map +1 -0
- package/ui/styles.js +24 -0
- package/utils/subscription.d.ts +4 -0
- package/utils/subscription.d.ts.map +1 -0
- package/jobs/status-line.d.ts +0 -6
- package/jobs/status-line.d.ts.map +0 -1
- package/jobs/status-line.js +0 -39
- package/src/jobs/status-line.ts +0 -44
- package/src/ui/define-pane.ts +0 -27
- package/src/ui/places.ts +0 -49
- package/src/utils/disposable.ts +0 -3
- package/ui/define-pane.d.ts +0 -15
- package/ui/define-pane.d.ts.map +0 -1
- package/ui/define-pane.js +0 -12
- package/ui/places.d.ts +0 -43
- package/ui/places.d.ts.map +0 -1
- package/ui/places.js +0 -31
- package/utils/disposable.d.ts +0 -4
- package/utils/disposable.d.ts.map +0 -1
- /package/utils/{disposable.js → subscription.js} +0 -0
package/hotkeys.d.ts
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { Subscription } from './utils/subscription.js';
|
|
2
|
+
type Letter = 'a' | 'b' | 'c' | 'd' | 'e' | 'f' | 'g' | 'h' | 'i' | 'j' | 'k' | 'l' | 'm' | 'n' | 'o' | 'p' | 'q' | 'r' | 's' | 't' | 'u' | 'v' | 'w' | 'x' | 'y' | 'z';
|
|
3
|
+
type Digit = '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9';
|
|
4
|
+
type Named = 'tab' | 'enter' | 'escape' | 'space' | 'backspace' | 'delete' | 'up' | 'down' | 'left' | 'right' | 'home' | 'end' | 'pageup' | 'pagedown' | 'f1' | 'f2' | 'f3' | 'f4' | 'f5' | 'f6' | 'f7' | 'f8' | 'f9' | 'f10' | 'f11' | 'f12';
|
|
5
|
+
type Mark = '`' | '-' | '=' | '[' | ']' | '\\' | ';' | "'" | ',' | '.' | '/';
|
|
6
|
+
export type Key = Letter | Digit | Named | Mark;
|
|
7
|
+
type Modifiers = 'ctrl' | 'alt' | 'shift' | 'meta' | 'ctrl+alt' | 'ctrl+shift' | 'ctrl+meta' | 'alt+shift' | 'alt+meta' | 'shift+meta';
|
|
8
|
+
export type Combo = `${Modifiers}+${Key}`;
|
|
9
|
+
export type HotkeyInit = {
|
|
10
|
+
readonly title: string;
|
|
11
|
+
readonly default: Combo;
|
|
12
|
+
};
|
|
13
|
+
export type Hotkeys = Readonly<Record<string, HotkeyInit>>;
|
|
14
|
+
export type Hotkey = {
|
|
15
|
+
readonly title: string;
|
|
16
|
+
readonly combo: Combo | undefined;
|
|
17
|
+
onPress(listener: () => unknown): Subscription;
|
|
18
|
+
};
|
|
19
|
+
export declare function isCombo(value: unknown): value is Combo;
|
|
20
|
+
export declare function checkHotkeys(name: string, hotkeys: Hotkeys): Hotkeys;
|
|
21
|
+
export {};
|
|
22
|
+
//# sourceMappingURL=hotkeys.d.ts.map
|
package/hotkeys.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hotkeys.d.ts","sourceRoot":"","sources":["src/hotkeys.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAE3D,KAAK,MAAM,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAA;AAEvK,KAAK,KAAK,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAA;AAEtE,KAAK,KAAK,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,GAAG,WAAW,GAAG,QAAQ,GAAG,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,UAAU,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,CAAA;AAE7O,KAAK,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAA;AAE5E,MAAM,MAAM,GAAG,GAAG,MAAM,GAAG,KAAK,GAAG,KAAK,GAAG,IAAI,CAAA;AAE/C,KAAK,SAAS,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,MAAM,GAAG,UAAU,GAAG,YAAY,GAAG,WAAW,GAAG,WAAW,GAAG,UAAU,GAAG,YAAY,CAAA;AAEtI,MAAM,MAAM,KAAK,GAAG,GAAG,SAAS,IAAI,GAAG,EAAE,CAAA;AAEzC,MAAM,MAAM,UAAU,GAAG;IAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAA;CAAE,CAAA;AAE5E,MAAM,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAA;AAE1D,MAAM,MAAM,MAAM,GAAG;IACnB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,SAAS,CAAA;IACjC,OAAO,CAAC,QAAQ,EAAE,MAAM,OAAO,GAAG,YAAY,CAAA;CAC/C,CAAA;AAQD,wBAAgB,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,KAAK,CAItD;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAYpE"}
|
package/hotkeys.js
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
const hotkeyName = /^[A-Za-z][A-Za-z0-9_]{0,63}$/;
|
|
2
|
+
const comboShape = /^(?:(?:ctrl|alt|shift|meta)\+){1,2}(?:[a-z0-9]|f(?:[1-9]|1[0-2])|tab|enter|escape|space|backspace|delete|up|down|left|right|home|end|pageup|pagedown|[`\-=[\]\\;',./])$/;
|
|
3
|
+
const order = ['ctrl', 'alt', 'shift', 'meta'];
|
|
4
|
+
export function isCombo(value) {
|
|
5
|
+
if (typeof value !== 'string' || !comboShape.test(value))
|
|
6
|
+
return false;
|
|
7
|
+
const modifiers = value.split('+').slice(0, -1);
|
|
8
|
+
return modifiers.every((each, index) => index === 0 || order.indexOf(each) > order.indexOf(modifiers[index - 1]));
|
|
9
|
+
}
|
|
10
|
+
export function checkHotkeys(name, hotkeys) {
|
|
11
|
+
const combos = new Map();
|
|
12
|
+
for (const [key, declared] of Object.entries(hotkeys)) {
|
|
13
|
+
const at = `${name}: hotkeys.${key}`;
|
|
14
|
+
if (!hotkeyName.test(key))
|
|
15
|
+
throw new Error(`${at} is not a hotkey name. Use letters, digits, and _, starting with a letter.`);
|
|
16
|
+
if (declared.title.trim() === '')
|
|
17
|
+
throw new Error(`${at} needs a title, the label Settings shows beside its combo.`);
|
|
18
|
+
if (!isCombo(declared.default))
|
|
19
|
+
throw new Error(`${at} defaults to "${String(declared.default)}", which is not a combo. Give one or two of ctrl, alt, shift, meta in that order, then a key, such as "ctrl+q" or "ctrl+shift+k".`);
|
|
20
|
+
const taken = combos.get(declared.default);
|
|
21
|
+
if (taken !== undefined)
|
|
22
|
+
throw new Error(`${at} defaults to ${declared.default}, which hotkeys.${taken} has too. Give each hotkey its own combo.`);
|
|
23
|
+
combos.set(declared.default, key);
|
|
24
|
+
}
|
|
25
|
+
return hotkeys;
|
|
26
|
+
}
|
package/installer.d.ts
CHANGED
|
@@ -6,5 +6,5 @@ export type Step<State extends object = Record<never, never>> = {
|
|
|
6
6
|
render(mod: Mod<State>, props: Frozen<RenderPropsOf['Pane']>): RenderElement;
|
|
7
7
|
isDone(mod: Mod<State>): boolean | Promise<boolean>;
|
|
8
8
|
};
|
|
9
|
-
export declare function
|
|
9
|
+
export declare function checkSteps(name: string, steps: readonly Step<never>[]): void;
|
|
10
10
|
//# sourceMappingURL=installer.d.ts.map
|
package/installer.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"installer.d.ts","sourceRoot":"","sources":["src/installer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AACvE,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,UAAU,CAAA;AAEnC,MAAM,MAAM,IAAI,CAAC,KAAK,SAAS,MAAM,GAAG,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI;IAC9D,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,GAAG,aAAa,CAAA;IAC5E,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,KAAK,CAAC,GAAG,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;CACpD,CAAA;AAID,wBAAgB,UAAU,CAAC,
|
|
1
|
+
{"version":3,"file":"installer.d.ts","sourceRoot":"","sources":["src/installer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AACvE,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,UAAU,CAAA;AAEnC,MAAM,MAAM,IAAI,CAAC,KAAK,SAAS,MAAM,GAAG,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI;IAC9D,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,GAAG,aAAa,CAAA;IAC5E,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,KAAK,CAAC,GAAG,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;CACpD,CAAA;AAID,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,IAAI,CAQ5E"}
|
package/installer.js
CHANGED
|
@@ -1,8 +1,13 @@
|
|
|
1
1
|
const stepId = /^[A-Za-z0-9_-]{1,64}$/;
|
|
2
|
-
export function
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
2
|
+
export function checkSteps(name, steps) {
|
|
3
|
+
const seen = new Set();
|
|
4
|
+
for (const step of steps) {
|
|
5
|
+
if (!stepId.test(step.id))
|
|
6
|
+
throw new Error(`${name}: the install step "${step.id}" has no valid id. Use 1 to 64 letters, digits, "_", or "-".`);
|
|
7
|
+
if (step.title.trim() === '')
|
|
8
|
+
throw new Error(`${name}: the install step "${step.id}" needs a title, the line the installer shows above it.`);
|
|
9
|
+
if (seen.has(step.id))
|
|
10
|
+
throw new Error(`${name}: two install steps have the id "${step.id}". Give each step its own id.`);
|
|
11
|
+
seen.add(step.id);
|
|
12
|
+
}
|
|
8
13
|
}
|
package/jobs/check.d.ts
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import type { Job } from '../mod.js';
|
|
2
|
+
import type { Subscription } from '../utils/subscription.js';
|
|
2
3
|
import { type Target } from './permissions/match-target.js';
|
|
3
4
|
export declare function check<State extends object = Record<never, never>>(options: {
|
|
4
5
|
readonly after: Target | Target[];
|
|
5
6
|
readonly run: readonly string[];
|
|
6
7
|
readonly timeoutMs?: number;
|
|
7
|
-
}): Job<
|
|
8
|
+
}): Job<Subscription, State>;
|
|
8
9
|
//# sourceMappingURL=check.d.ts.map
|
package/jobs/check.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../src/jobs/check.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../src/jobs/check.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,WAAW,CAAA;AACpC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAQ5D,OAAO,EAAyB,KAAK,MAAM,EAAE,MAAM,+BAA+B,CAAA;AAIlF,wBAAgB,KAAK,CAAC,KAAK,SAAS,MAAM,GAAG,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,OAAO,EAAE;IAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,SAAS,MAAM,EAAE,CAAC;IAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,GAAG,CAAC,YAAY,EAAE,KAAK,CAAC,CA8BzM"}
|
package/jobs/check.js
CHANGED
|
@@ -20,7 +20,8 @@ export function check(options) {
|
|
|
20
20
|
throw new Error(`check: the ${named} has timeoutMs ${timeoutMs}. Set it above 0 and at most ${longestMs} (${longestMs / 60_000} minutes).`);
|
|
21
21
|
const deadline = { ms: timeoutMs, job: 'check' };
|
|
22
22
|
return (job) => {
|
|
23
|
-
|
|
23
|
+
job.announce(`a ${named}`);
|
|
24
|
+
return afterCall(job, async (use, workspace) => {
|
|
24
25
|
const triggered = await triggeredRun(targets, run, use, workspace);
|
|
25
26
|
if (triggered === undefined)
|
|
26
27
|
return [];
|
|
@@ -35,7 +36,6 @@ export function check(options) {
|
|
|
35
36
|
return [`The ${named} failed: ${messageOf(error)}`];
|
|
36
37
|
}
|
|
37
38
|
}, (error) => [`The check job failed, so the ${named} did not run: ${messageOf(error)}`]);
|
|
38
|
-
job.announce(`a ${named}`);
|
|
39
39
|
};
|
|
40
40
|
}
|
|
41
41
|
async function triggeredRun(after, run, use, workspace) {
|
package/jobs/context.d.ts
CHANGED
|
@@ -3,8 +3,9 @@ import { type Deadline } from '../runtime/deadline.js';
|
|
|
3
3
|
import type { Call } from '../utils/call-effects.js';
|
|
4
4
|
import { type Workspace } from './permissions/find-project-scope.js';
|
|
5
5
|
import { type Target } from './permissions/match-target.js';
|
|
6
|
+
import type { Subscription } from '../utils/subscription.js';
|
|
6
7
|
export declare function workspaceReader({ mod }: JobContext): () => Promise<Workspace>;
|
|
7
|
-
export declare function afterCall<State extends object>(job: JobContext<State>, contextAfter: (call: Call, workspace: Workspace) => Promise<readonly string[]>, failed: (error: unknown) => readonly string[]):
|
|
8
|
+
export declare function afterCall<State extends object>(job: JobContext<State>, contextAfter: (call: Call, workspace: Workspace) => Promise<readonly string[]>, failed: (error: unknown) => readonly string[]): Subscription;
|
|
8
9
|
export declare function inFolder(call: Call, folder: string, workspace: Workspace): Promise<Call & {
|
|
9
10
|
readonly folder: string;
|
|
10
11
|
}>;
|
package/jobs/context.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/jobs/context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AAC3C,OAAO,EAAkB,KAAK,QAAQ,EAAE,MAAM,wBAAwB,CAAA;AAKtE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,0BAA0B,CAAA;AACpD,OAAO,EAAoB,KAAK,SAAS,EAAE,MAAM,qCAAqC,CAAA;AACtF,OAAO,EAAY,KAAK,MAAM,EAAE,MAAM,+BAA+B,CAAA;
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/jobs/context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AAC3C,OAAO,EAAkB,KAAK,QAAQ,EAAE,MAAM,wBAAwB,CAAA;AAKtE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,0BAA0B,CAAA;AACpD,OAAO,EAAoB,KAAK,SAAS,EAAE,MAAM,qCAAqC,CAAA;AACtF,OAAO,EAAY,KAAK,MAAM,EAAE,MAAM,+BAA+B,CAAA;AAErE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAI5D,wBAAgB,eAAe,CAAC,EAAE,GAAG,EAAE,EAAE,UAAU,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,CAmB7E;AAED,wBAAgB,SAAS,CAAC,KAAK,SAAS,MAAM,EAAE,GAAG,EAAE,UAAU,CAAC,KAAK,CAAC,EAAE,YAAY,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,KAAK,OAAO,CAAC,SAAS,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,SAAS,MAAM,EAAE,GAAG,YAAY,CAWnN;AAED,wBAAsB,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,GAAG;IAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAE5H;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CAEzI;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CASlD"}
|
package/jobs/context.js
CHANGED
|
@@ -28,7 +28,7 @@ export function workspaceReader({ mod }) {
|
|
|
28
28
|
export function afterCall(job, contextAfter, failed) {
|
|
29
29
|
const { router, toolCalls } = engineOf(job.mod);
|
|
30
30
|
const readWorkspace = workspaceReader(job);
|
|
31
|
-
router.add('tool.call', async (e, next) => {
|
|
31
|
+
return router.add('tool.call', async (e, next) => {
|
|
32
32
|
const before = Promise.all([toolCalls.agentOf(e.tool_use_id).then((agent) => ({ tool: e.tool, input: toolInputOf(e), ...agent })), readWorkspace()]);
|
|
33
33
|
await Promise.allSettled([before]);
|
|
34
34
|
const result = await next(e);
|
package/jobs/permissions.d.ts
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import type { Job, Mod } from '../mod.js';
|
|
2
2
|
import { type PermissionRules as RulesFor, type Rule as RuleFor } from './permissions/decide-permission.js';
|
|
3
|
+
import type { Subscription } from '../utils/subscription.js';
|
|
3
4
|
export type { CommandCall, FetchCall, FileCall, Call } from '../utils/call-effects.js';
|
|
4
5
|
export type { Target } from './permissions/match-target.js';
|
|
5
6
|
export type Rule<State extends object = Record<never, never>> = RuleFor<Mod<State>>;
|
|
6
7
|
export type PermissionRules<State extends object = Record<never, never>> = RulesFor<Mod<State>>;
|
|
7
|
-
export declare function permissions<State extends object = Record<never, never>>(rules: PermissionRules<State> | ((state: State) => PermissionRules<State>)): Job<
|
|
8
|
+
export declare function permissions<State extends object = Record<never, never>>(rules: PermissionRules<State> | ((state: State) => PermissionRules<State>)): Job<Subscription, State>;
|
|
8
9
|
//# sourceMappingURL=permissions.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"permissions.d.ts","sourceRoot":"","sources":["../src/jobs/permissions.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,WAAW,CAAA;AAKzC,OAAO,EAAqC,KAAK,eAAe,IAAI,QAAQ,EAAE,KAAK,IAAI,IAAI,OAAO,EAAgB,MAAM,oCAAoC,CAAA;
|
|
1
|
+
{"version":3,"file":"permissions.d.ts","sourceRoot":"","sources":["../src/jobs/permissions.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,WAAW,CAAA;AAKzC,OAAO,EAAqC,KAAK,eAAe,IAAI,QAAQ,EAAE,KAAK,IAAI,IAAI,OAAO,EAAgB,MAAM,oCAAoC,CAAA;AAE5J,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAI5D,YAAY,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,0BAA0B,CAAA;AACtF,YAAY,EAAE,MAAM,EAAE,MAAM,+BAA+B,CAAA;AAC3D,MAAM,MAAM,IAAI,CAAC,KAAK,SAAS,MAAM,GAAG,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAA;AACnF,MAAM,MAAM,eAAe,CAAC,KAAK,SAAS,MAAM,GAAG,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAA;AAI/F,wBAAgB,WAAW,CAAC,KAAK,SAAS,MAAM,GAAG,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,KAAK,EAAE,eAAe,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,KAAK,eAAe,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,YAAY,EAAE,KAAK,CAAC,CAmC7K"}
|
package/jobs/permissions.js
CHANGED
|
@@ -32,11 +32,11 @@ export function permissions(rules) {
|
|
|
32
32
|
return { decision: 'deny', reason: `The permissions job could not read the session, so it denies the call: ${messageOf(error)}` };
|
|
33
33
|
}
|
|
34
34
|
};
|
|
35
|
-
|
|
35
|
+
job.announce(count === undefined ? 'permission rules from its state' : `${count} permission rule${count === 1 ? '' : 's'}`);
|
|
36
|
+
return router.add('tool.check', async (e, next) => {
|
|
36
37
|
const [below, ours] = await Promise.all([next(e), verdictOf(e)]);
|
|
37
38
|
return ours === undefined ? below : stricterVerdict(below, ours);
|
|
38
39
|
}, (_e, error) => ({ decision: 'deny', reason: `Claude Code stopped the permissions job of ${job.mod.name}, so it denies the call: ${error.message}` }));
|
|
39
|
-
job.announce(count === undefined ? 'permission rules from its state' : `${count} permission rule${count === 1 ? '' : 's'}`);
|
|
40
40
|
};
|
|
41
41
|
}
|
|
42
42
|
function checkedCount(rules) {
|
package/jobs/program.js
CHANGED
|
@@ -58,7 +58,7 @@ export function program(options) {
|
|
|
58
58
|
}
|
|
59
59
|
catch (error) {
|
|
60
60
|
if (error instanceof PermissionRefused)
|
|
61
|
-
return stop(
|
|
61
|
+
return stop(messageOf(error));
|
|
62
62
|
lastError = messageOf(error);
|
|
63
63
|
}
|
|
64
64
|
if (address !== undefined)
|
package/jobs/prompt.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { Job, Mod } from '../mod.js';
|
|
2
|
+
import type { Subscription } from '../utils/subscription.js';
|
|
2
3
|
import { type Call } from '../utils/call-effects.js';
|
|
3
4
|
import { type Target } from './permissions/match-target.js';
|
|
4
5
|
type PromptInput = {
|
|
@@ -11,6 +12,6 @@ type PromptOptions<State extends object> = {
|
|
|
11
12
|
prompt: string | ((input: PromptInput, mod: Mod<State>) => string | undefined | Promise<string | undefined>);
|
|
12
13
|
after?: Target | Target[];
|
|
13
14
|
};
|
|
14
|
-
export declare function prompt<State extends object = Record<never, never>>({ name, prompt: text, after }: PromptOptions<State>): Job<
|
|
15
|
+
export declare function prompt<State extends object = Record<never, never>>({ name, prompt: text, after }: PromptOptions<State>): Job<Subscription, State>;
|
|
15
16
|
export {};
|
|
16
17
|
//# sourceMappingURL=prompt.d.ts.map
|
package/jobs/prompt.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../src/jobs/prompt.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAc,GAAG,EAAE,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../src/jobs/prompt.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAc,GAAG,EAAE,MAAM,WAAW,CAAA;AAKrD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAE5D,OAAO,EAAe,KAAK,IAAI,EAAE,MAAM,0BAA0B,CAAA;AACjE,OAAO,EAAyB,KAAK,MAAM,EAAE,MAAM,+BAA+B,CAAA;AAGlF,KAAK,WAAW,GAAG;IAAE,IAAI,CAAC,EAAE,IAAI,GAAG;QAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,CAAA;AAEhE,KAAK,aAAa,CAAC,KAAK,SAAS,MAAM,IAAI;IACzC,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,EAAE,GAAG,CAAC,KAAK,CAAC,KAAK,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC,CAAA;IAC5G,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;CAC1B,CAAA;AAID,wBAAgB,MAAM,CAAC,KAAK,SAAS,MAAM,GAAG,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,aAAa,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,YAAY,EAAE,KAAK,CAAC,CAiCjJ"}
|
package/jobs/prompt.js
CHANGED
|
@@ -13,7 +13,7 @@ export function prompt({ name, prompt: text, after }) {
|
|
|
13
13
|
for (const target of targets)
|
|
14
14
|
targetOf(target);
|
|
15
15
|
return (job) => {
|
|
16
|
-
job.reserveName('prompt', name, `prompt: ${job.mod.name} adds the name "${name}" two times. Give each prompt its own name.`);
|
|
16
|
+
const reserved = job.reserveName('prompt', name, `prompt: ${job.mod.name} adds the name "${name}" two times. Give each prompt its own name.`);
|
|
17
17
|
const log = (reason) => job.mod.log(`prompt "${name}" added nothing: ${reason}`);
|
|
18
18
|
const textFor = async (input) => {
|
|
19
19
|
try {
|
|
@@ -29,14 +29,14 @@ export function prompt({ name, prompt: text, after }) {
|
|
|
29
29
|
const value = await textFor(input);
|
|
30
30
|
return value === undefined ? undefined : `# ${name}\n${value}`;
|
|
31
31
|
};
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
}
|
|
32
|
+
job.announce(targets.length > 0 ? `the ${name} prompt after ${listed(targets.map(targetWords))}` : `the ${name} prompt`);
|
|
33
|
+
const added = targets.length > 0 ? addAfterCalls(job, targets, headedText, log) : addKeptCurrent(job, name, () => textFor({}), log);
|
|
34
|
+
return {
|
|
35
|
+
remove() {
|
|
36
|
+
added.remove();
|
|
37
|
+
reserved.remove();
|
|
38
|
+
},
|
|
39
|
+
};
|
|
40
40
|
};
|
|
41
41
|
}
|
|
42
42
|
function addKeptCurrent(job, name, textFor, log) {
|
|
@@ -45,13 +45,13 @@ function addKeptCurrent(job, name, textFor, log) {
|
|
|
45
45
|
let hasStarted = false;
|
|
46
46
|
let isQueued = false;
|
|
47
47
|
let updates = Promise.resolve();
|
|
48
|
-
router.add('classic.SessionStart', (e, next) => {
|
|
48
|
+
const starting = router.add('classic.SessionStart', (e, next) => {
|
|
49
49
|
hasStarted = e.source === 'resume' || e.source === 'compact';
|
|
50
50
|
if (!hasStarted)
|
|
51
51
|
given = undefined;
|
|
52
52
|
return next(e);
|
|
53
53
|
});
|
|
54
|
-
router.add('prompt.context', async (e, next) => {
|
|
54
|
+
const adding = router.add('prompt.context', async (e, next) => {
|
|
55
55
|
const below = await next(e);
|
|
56
56
|
hasStarted = true;
|
|
57
57
|
if (below.blocks.some((block) => block.name === name)) {
|
|
@@ -74,15 +74,22 @@ function addKeptCurrent(job, name, textFor, log) {
|
|
|
74
74
|
log(`Claude Code refused the new text: ${added.deny}`);
|
|
75
75
|
});
|
|
76
76
|
};
|
|
77
|
-
onStateChange(job.mod.state, () => {
|
|
77
|
+
const following = onStateChange(job.mod.state, () => {
|
|
78
78
|
if (isQueued)
|
|
79
79
|
return;
|
|
80
80
|
isQueued = true;
|
|
81
81
|
updates = updates.then(update).catch((error) => log(messageOf(error)));
|
|
82
82
|
});
|
|
83
|
+
return {
|
|
84
|
+
remove() {
|
|
85
|
+
starting.remove();
|
|
86
|
+
adding.remove();
|
|
87
|
+
following.remove();
|
|
88
|
+
},
|
|
89
|
+
};
|
|
83
90
|
}
|
|
84
91
|
function addAfterCalls(job, targets, textFor, log) {
|
|
85
|
-
afterCall(job, async (use, workspace) => {
|
|
92
|
+
return afterCall(job, async (use, workspace) => {
|
|
86
93
|
const effects = callEffects(use, workspace);
|
|
87
94
|
for (const target of targets) {
|
|
88
95
|
const [matched] = await matchTarget(target, use, effects, workspace);
|
package/jobs/schedule.d.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import type { Job } from '../mod.js';
|
|
2
|
+
import type { Subscription } from '../utils/subscription.js';
|
|
2
3
|
export type ScheduledPrompt = {
|
|
3
4
|
readonly cron: string;
|
|
4
5
|
readonly prompt: string;
|
|
5
6
|
};
|
|
6
|
-
export declare function schedule<State extends object = Record<never, never>>(entry: ScheduledPrompt | ((state: State) => ScheduledPrompt | undefined)): Job<
|
|
7
|
+
export declare function schedule<State extends object = Record<never, never>>(entry: ScheduledPrompt | ((state: State) => ScheduledPrompt | undefined)): Job<Subscription, State>;
|
|
7
8
|
//# sourceMappingURL=schedule.d.ts.map
|
package/jobs/schedule.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schedule.d.ts","sourceRoot":"","sources":["../src/jobs/schedule.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"schedule.d.ts","sourceRoot":"","sources":["../src/jobs/schedule.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,WAAW,CAAA;AAGpC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAE5D,MAAM,MAAM,eAAe,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAA;AAIhF,wBAAgB,QAAQ,CAAC,KAAK,SAAS,MAAM,GAAG,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,KAAK,EAAE,eAAe,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,KAAK,eAAe,GAAG,SAAS,CAAC,GAAG,GAAG,CAAC,YAAY,EAAE,KAAK,CAAC,CAiExK"}
|
package/jobs/schedule.js
CHANGED
|
@@ -50,13 +50,27 @@ export function schedule(entry) {
|
|
|
50
50
|
.then((left) => (typeof left === 'string' ? remove(left) : undefined))
|
|
51
51
|
.then(update)
|
|
52
52
|
.catch((error) => report('failed', error));
|
|
53
|
-
onStateChange(mod.state, () => {
|
|
53
|
+
const following = onStateChange(mod.state, () => {
|
|
54
54
|
if (isQueued)
|
|
55
55
|
return;
|
|
56
56
|
isQueued = true;
|
|
57
57
|
updates = updates.then(update).catch((error) => report('failed', error));
|
|
58
58
|
});
|
|
59
59
|
job.announce(typeof entry === 'function' ? 'a schedule from its state' : `a schedule at ${entry.cron}`);
|
|
60
|
+
return {
|
|
61
|
+
remove() {
|
|
62
|
+
following.remove();
|
|
63
|
+
updates = updates
|
|
64
|
+
.then(async () => {
|
|
65
|
+
if (current === undefined)
|
|
66
|
+
return;
|
|
67
|
+
const { id } = current;
|
|
68
|
+
current = undefined;
|
|
69
|
+
await remove(id);
|
|
70
|
+
})
|
|
71
|
+
.catch((error) => report('failed', error));
|
|
72
|
+
},
|
|
73
|
+
};
|
|
60
74
|
};
|
|
61
75
|
}
|
|
62
76
|
function checked(entry) {
|
package/jobs/slash-command.d.ts
CHANGED
|
@@ -1,8 +1,12 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { Job, Mod } from '../mod.js';
|
|
2
2
|
export type CommandReply = string | {
|
|
3
3
|
text?: string;
|
|
4
4
|
note?: string;
|
|
5
5
|
} | undefined;
|
|
6
|
+
export type SlashCommand = {
|
|
7
|
+
readonly name: string;
|
|
8
|
+
remove(): void;
|
|
9
|
+
};
|
|
6
10
|
export declare function slashCommand<State extends object = Record<never, never>>(options: {
|
|
7
11
|
readonly name: string;
|
|
8
12
|
readonly description: string;
|
|
@@ -12,5 +16,5 @@ export declare function slashCommand<State extends object = Record<never, never>
|
|
|
12
16
|
args: string;
|
|
13
17
|
positionals: string[];
|
|
14
18
|
}, mod: Mod<State>) => CommandReply | void | Promise<CommandReply | void>;
|
|
15
|
-
}): Job<
|
|
19
|
+
}): Job<SlashCommand, State>;
|
|
16
20
|
//# sourceMappingURL=slash-command.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slash-command.d.ts","sourceRoot":"","sources":["../src/jobs/slash-command.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"slash-command.d.ts","sourceRoot":"","sources":["../src/jobs/slash-command.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,WAAW,CAAA;AAQzC,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAAA;AAEhF,MAAM,MAAM,YAAY,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,IAAI,IAAI,CAAA;CAAE,CAAA;AAMpE,wBAAgB,YAAY,CAAC,KAAK,SAAS,MAAM,GAAG,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,OAAO,EAAE;IACjF,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAA;IAC9B,QAAQ,CAAC,SAAS,CAAC,EAAE,IAAI,CAAA;IACzB,QAAQ,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,EAAE,CAAA;KAAE,EAAE,GAAG,EAAE,GAAG,CAAC,KAAK,CAAC,KAAK,YAAY,GAAG,IAAI,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAAA;CACxI,GAAG,GAAG,CAAC,YAAY,EAAE,KAAK,CAAC,CAmC3B"}
|
package/jobs/slash-command.js
CHANGED
|
@@ -9,7 +9,7 @@ export function slashCommand(options) {
|
|
|
9
9
|
const { name, description, argumentHint, immediate, reply } = options;
|
|
10
10
|
return (job) => {
|
|
11
11
|
const { mod, announce, reserveName } = job;
|
|
12
|
-
const { claude, router, report } = engineOf(mod);
|
|
12
|
+
const { claude, router, report, answerInput } = engineOf(mod);
|
|
13
13
|
if (!commandName.test(name))
|
|
14
14
|
throw new Error(`${mod.name}: "${name}" is not a slash command name. Use 1 to 64 letters, digits, "_", or "-", without the slash.`);
|
|
15
15
|
const reserved = reserveName('slashCommand', name, `${mod.name}: the slash command /${name} is already added. Give each slashCommand its own name.`);
|
|
@@ -24,16 +24,17 @@ export function slashCommand(options) {
|
|
|
24
24
|
if (e.command !== registered)
|
|
25
25
|
return next(e);
|
|
26
26
|
try {
|
|
27
|
-
return answerOf(mod.name, await withinDeadline(mod, deadline, `/${name}`, () => reply({ args: e.args, positionals: splitWords(e.args) }, mod)));
|
|
27
|
+
return await answerInput(async () => answerOf(mod.name, await withinDeadline(mod, deadline, `/${name}`, () => reply({ args: e.args, positionals: splitWords(e.args) }, mod))), () => next(e));
|
|
28
28
|
}
|
|
29
29
|
catch (error) {
|
|
30
30
|
return { text: `/${name} failed: ${oneLine(error)}` };
|
|
31
31
|
}
|
|
32
32
|
});
|
|
33
33
|
return {
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
34
|
+
name,
|
|
35
|
+
remove() {
|
|
36
|
+
answering.remove();
|
|
37
|
+
reserved.remove();
|
|
37
38
|
},
|
|
38
39
|
};
|
|
39
40
|
};
|
package/jobs/tool.d.ts
CHANGED
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
import type { FromSchema, JSONSchema } from 'json-schema-to-ts';
|
|
2
|
-
import type {
|
|
2
|
+
import type { Job, Mod } from '../mod.js';
|
|
3
|
+
export type Tool = {
|
|
4
|
+
readonly name: string;
|
|
5
|
+
remove(): void;
|
|
6
|
+
};
|
|
3
7
|
export declare function tool<const Schema extends object = {
|
|
4
8
|
type: 'object';
|
|
5
9
|
}, State extends object = Record<never, never>>(options: {
|
|
@@ -7,7 +11,5 @@ export declare function tool<const Schema extends object = {
|
|
|
7
11
|
readonly description: string;
|
|
8
12
|
readonly inputSchema?: Schema;
|
|
9
13
|
readonly execute: (input: Schema extends JSONSchema ? FromSchema<Schema> : never, mod: Mod<State>) => unknown;
|
|
10
|
-
}): Job<
|
|
11
|
-
readonly name: string;
|
|
12
|
-
}, State>;
|
|
14
|
+
}): Job<Tool, State>;
|
|
13
15
|
//# sourceMappingURL=tool.d.ts.map
|
package/jobs/tool.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool.d.ts","sourceRoot":"","sources":["../src/jobs/tool.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAC/D,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"tool.d.ts","sourceRoot":"","sources":["../src/jobs/tool.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAC/D,OAAO,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,WAAW,CAAA;AAUzC,MAAM,MAAM,IAAI,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,IAAI,IAAI,CAAA;CAAE,CAAA;AAE5D,wBAAgB,IAAI,CAAC,KAAK,CAAC,MAAM,SAAS,MAAM,GAAG;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,EAAE,KAAK,SAAS,MAAM,GAAG,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,OAAO,EAAE;IAC3H,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;IAC7B,QAAQ,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,SAAS,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC,GAAG,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC,KAAK,CAAC,KAAK,OAAO,CAAA;CAC9G,GAAG,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CA0CnB"}
|
package/jobs/tool.js
CHANGED