@moxxy/sdk 0.1.0 → 0.1.3
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/README.md +239 -0
- package/dist/compactor-helpers.d.ts +4 -1
- package/dist/compactor-helpers.d.ts.map +1 -1
- package/dist/compactor-helpers.js +50 -21
- package/dist/compactor-helpers.js.map +1 -1
- package/dist/define.d.ts +4 -0
- package/dist/define.d.ts.map +1 -1
- package/dist/define.js +6 -0
- package/dist/define.js.map +1 -1
- package/dist/embedding.d.ts +17 -0
- package/dist/embedding.d.ts.map +1 -1
- package/dist/errors.d.ts +1 -1
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js.map +1 -1
- package/dist/fs-utils.d.ts +27 -0
- package/dist/fs-utils.d.ts.map +1 -0
- package/dist/fs-utils.js +44 -0
- package/dist/fs-utils.js.map +1 -0
- package/dist/http-utils.d.ts +16 -0
- package/dist/http-utils.d.ts.map +1 -0
- package/dist/http-utils.js +40 -0
- package/dist/http-utils.js.map +1 -0
- package/dist/index.d.ts +12 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -4
- package/dist/index.js.map +1 -1
- package/dist/mode-helpers.d.ts +58 -0
- package/dist/mode-helpers.d.ts.map +1 -1
- package/dist/mode-helpers.js +119 -0
- package/dist/mode-helpers.js.map +1 -1
- package/dist/mode.d.ts +8 -0
- package/dist/mode.d.ts.map +1 -1
- package/dist/mutex.d.ts +15 -0
- package/dist/mutex.d.ts.map +1 -0
- package/dist/mutex.js +15 -0
- package/dist/mutex.js.map +1 -0
- package/dist/plugin.d.ts +27 -1
- package/dist/plugin.d.ts.map +1 -1
- package/dist/provider-utils.d.ts +6 -0
- package/dist/provider-utils.d.ts.map +1 -1
- package/dist/provider-utils.js +8 -0
- package/dist/provider-utils.js.map +1 -1
- package/dist/resolvers.d.ts +52 -0
- package/dist/resolvers.d.ts.map +1 -0
- package/dist/resolvers.js +123 -0
- package/dist/resolvers.js.map +1 -0
- package/dist/session-like.d.ts +85 -1
- package/dist/session-like.d.ts.map +1 -1
- package/dist/voice.d.ts +36 -0
- package/dist/voice.d.ts.map +1 -0
- package/dist/voice.js +82 -0
- package/dist/voice.js.map +1 -0
- package/dist/workflow.d.ts +144 -0
- package/dist/workflow.d.ts.map +1 -0
- package/dist/workflow.js +14 -0
- package/dist/workflow.js.map +1 -0
- package/package.json +38 -2
- package/src/compactor-helpers.test.ts +41 -0
- package/src/compactor-helpers.ts +53 -19
- package/src/define.ts +10 -0
- package/src/embedding.ts +18 -0
- package/src/errors.ts +3 -0
- package/src/fs-utils.test.ts +61 -0
- package/src/fs-utils.ts +55 -0
- package/src/http-utils.test.ts +36 -0
- package/src/http-utils.ts +40 -0
- package/src/index.ts +58 -3
- package/src/mode-helpers.ts +169 -0
- package/src/mode.ts +8 -0
- package/src/mutex.test.ts +36 -0
- package/src/mutex.ts +31 -0
- package/src/plugin.ts +27 -1
- package/src/provider-utils.ts +9 -0
- package/src/resolvers.test.ts +45 -0
- package/src/resolvers.ts +164 -0
- package/src/session-like.ts +87 -1
- package/src/stuck-loop.test.ts +42 -0
- package/src/voice.ts +103 -0
- package/src/workflow.ts +165 -0
package/dist/provider-utils.d.ts
CHANGED
|
@@ -4,6 +4,12 @@
|
|
|
4
4
|
*/
|
|
5
5
|
/** Canonical stop reasons emitted on `message_end` events. */
|
|
6
6
|
export type StopReason = 'end_turn' | 'tool_use' | 'max_tokens' | 'stop_sequence' | 'error';
|
|
7
|
+
/**
|
|
8
|
+
* Rough token estimate for a blob of text: ~4 chars per token. The shared
|
|
9
|
+
* fallback for a provider's `countTokens` when no native tokenizer is wired —
|
|
10
|
+
* previously each provider hardcoded `Math.ceil(text.length / 4)` independently.
|
|
11
|
+
*/
|
|
12
|
+
export declare function estimateTextTokens(text: string): number;
|
|
7
13
|
/**
|
|
8
14
|
* Heuristic: should a provider request retry on this error? Used by stream
|
|
9
15
|
* modes to attach a `retryable: boolean` flag to the `error` event so callers
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider-utils.d.ts","sourceRoot":"","sources":["../src/provider-utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,8DAA8D;AAC9D,MAAM,MAAM,UAAU,GAAG,UAAU,GAAG,UAAU,GAAG,YAAY,GAAG,eAAe,GAAG,OAAO,CAAC;AAE5F;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAYtD;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAC7B,GAAG,EAAE,OAAO,EACZ,GAAG,GAAE;IAAE,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAO,GAC9D;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,CAYzC;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAyGxD"}
|
|
1
|
+
{"version":3,"file":"provider-utils.d.ts","sourceRoot":"","sources":["../src/provider-utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,8DAA8D;AAC9D,MAAM,MAAM,UAAU,GAAG,UAAU,GAAG,UAAU,GAAG,YAAY,GAAG,eAAe,GAAG,OAAO,CAAC;AAE5F;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAYtD;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAC7B,GAAG,EAAE,OAAO,EACZ,GAAG,GAAE;IAAE,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAO,GAC9D;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,CAYzC;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAyGxD"}
|
package/dist/provider-utils.js
CHANGED
|
@@ -3,6 +3,14 @@
|
|
|
3
3
|
* are only allowed to depend on @moxxy/sdk, not core.
|
|
4
4
|
*/
|
|
5
5
|
import { classifyNetworkError } from './errors.js';
|
|
6
|
+
/**
|
|
7
|
+
* Rough token estimate for a blob of text: ~4 chars per token. The shared
|
|
8
|
+
* fallback for a provider's `countTokens` when no native tokenizer is wired —
|
|
9
|
+
* previously each provider hardcoded `Math.ceil(text.length / 4)` independently.
|
|
10
|
+
*/
|
|
11
|
+
export function estimateTextTokens(text) {
|
|
12
|
+
return Math.ceil(text.length / 4);
|
|
13
|
+
}
|
|
6
14
|
/**
|
|
7
15
|
* Heuristic: should a provider request retry on this error? Used by stream
|
|
8
16
|
* modes to attach a `retryable: boolean` flag to the `error` event so callers
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider-utils.js","sourceRoot":"","sources":["../src/provider-utils.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"provider-utils.js","sourceRoot":"","sources":["../src/provider-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import type { PendingToolCall, PermissionContext, PermissionDecision, PermissionResolver, PermissionRule } from './permission.js';
|
|
2
|
+
export declare const autoAllowResolver: PermissionResolver;
|
|
3
|
+
export declare const denyByDefaultResolver: PermissionResolver;
|
|
4
|
+
export interface CallbackResolverOptions {
|
|
5
|
+
readonly name?: string;
|
|
6
|
+
readonly callback: (call: PendingToolCall, ctx: PermissionContext) => Promise<PermissionDecision>;
|
|
7
|
+
}
|
|
8
|
+
export declare function createCallbackResolver(opts: CallbackResolverOptions): PermissionResolver;
|
|
9
|
+
export declare function createAllowListResolver(toolNames: ReadonlyArray<string>): PermissionResolver;
|
|
10
|
+
export type PermissionPromptHandler = (call: PendingToolCall, ctx: PermissionContext) => Promise<PermissionDecision>;
|
|
11
|
+
export interface DeferredPermissionResolverOptions {
|
|
12
|
+
readonly prompt: PermissionPromptHandler;
|
|
13
|
+
readonly name?: string;
|
|
14
|
+
readonly sessionAllows?: Set<string>;
|
|
15
|
+
}
|
|
16
|
+
export interface DeferredPermissionResolver extends PermissionResolver {
|
|
17
|
+
/**
|
|
18
|
+
* Resolve all in-flight prompts with `deny`. Call from a channel's `stop`
|
|
19
|
+
* so a pending permission prompt doesn't hang forever when the host UI
|
|
20
|
+
* unmounts (the TUI bug the audit flagged).
|
|
21
|
+
*/
|
|
22
|
+
abortAll(reason?: string): void;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Resolver for channels that defer permission decisions to an external UI
|
|
26
|
+
* (Ink dialog, Telegram inline keyboard, web form). Wraps a `prompt`
|
|
27
|
+
* callback with:
|
|
28
|
+
* - sessionAllows shortcut — `allow_session` decisions skip subsequent
|
|
29
|
+
* prompts for the same tool name.
|
|
30
|
+
* - in-flight tracking — `abortAll()` resolves pending prompts with
|
|
31
|
+
* `deny`, so the channel can shut down cleanly without hangs.
|
|
32
|
+
*/
|
|
33
|
+
export declare function createDeferredPermissionResolver(opts: DeferredPermissionResolverOptions): DeferredPermissionResolver;
|
|
34
|
+
/**
|
|
35
|
+
* Evaluate a tool's OWN declared {@link PermissionRule} against a call.
|
|
36
|
+
*
|
|
37
|
+
* Tools can ship a `permission` rule to express their author's policy — e.g.
|
|
38
|
+
* `reload_skills` / `load_tool` declare `{ action: 'allow' }` because they're
|
|
39
|
+
* safe, internal, idempotent operations that should never prompt. That rule
|
|
40
|
+
* was previously stored on the ToolDef but never consulted, so in headless
|
|
41
|
+
* runs (where the channel resolver denies by default) even these safe tools
|
|
42
|
+
* were blocked. The session resolver now consults this BETWEEN the user's
|
|
43
|
+
* `permissions.json` policy and the channel resolver, so:
|
|
44
|
+
*
|
|
45
|
+
* user policy (deny/allow) > tool-declared rule > channel resolver
|
|
46
|
+
*
|
|
47
|
+
* Returns a decision for a matching `allow`/`deny` rule, or `null` to defer
|
|
48
|
+
* (no rule, pattern didn't match, or `action: 'prompt'` — the interactive
|
|
49
|
+
* resolver should handle those).
|
|
50
|
+
*/
|
|
51
|
+
export declare function evaluateToolRule(rule: PermissionRule | undefined, call: PendingToolCall): PermissionDecision | null;
|
|
52
|
+
//# sourceMappingURL=resolvers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolvers.d.ts","sourceRoot":"","sources":["../src/resolvers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,iBAAiB,EACjB,kBAAkB,EAClB,kBAAkB,EAClB,cAAc,EACf,MAAM,iBAAiB,CAAC;AAEzB,eAAO,MAAM,iBAAiB,EAAE,kBAK/B,CAAC;AAEF,eAAO,MAAM,qBAAqB,EAAE,kBAKnC,CAAC;AAEF,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,eAAe,EAAE,GAAG,EAAE,iBAAiB,KAAK,OAAO,CAAC,kBAAkB,CAAC,CAAC;CACnG;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,uBAAuB,GAAG,kBAAkB,CAKxF;AAED,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,kBAAkB,CAS5F;AAED,MAAM,MAAM,uBAAuB,GAAG,CACpC,IAAI,EAAE,eAAe,EACrB,GAAG,EAAE,iBAAiB,KACnB,OAAO,CAAC,kBAAkB,CAAC,CAAC;AAEjC,MAAM,WAAW,iCAAiC;IAChD,QAAQ,CAAC,MAAM,EAAE,uBAAuB,CAAC;IACzC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,aAAa,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CACtC;AAED,MAAM,WAAW,0BAA2B,SAAQ,kBAAkB;IACpE;;;;OAIG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACjC;AAED;;;;;;;;GAQG;AACH,wBAAgB,gCAAgC,CAC9C,IAAI,EAAE,iCAAiC,GACtC,0BAA0B,CAsC5B;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,cAAc,GAAG,SAAS,EAChC,IAAI,EAAE,eAAe,GACpB,kBAAkB,GAAG,IAAI,CAU3B"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
export const autoAllowResolver = {
|
|
2
|
+
name: 'auto-allow',
|
|
3
|
+
async check() {
|
|
4
|
+
return { mode: 'allow', reason: 'auto-allow resolver (test mode)' };
|
|
5
|
+
},
|
|
6
|
+
};
|
|
7
|
+
export const denyByDefaultResolver = {
|
|
8
|
+
name: 'deny-by-default',
|
|
9
|
+
async check() {
|
|
10
|
+
return { mode: 'deny', reason: 'No interactive resolver available in headless mode. Use --allow-tools or permissions.json.' };
|
|
11
|
+
},
|
|
12
|
+
};
|
|
13
|
+
export function createCallbackResolver(opts) {
|
|
14
|
+
return {
|
|
15
|
+
name: opts.name ?? 'callback',
|
|
16
|
+
check: opts.callback,
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
export function createAllowListResolver(toolNames) {
|
|
20
|
+
const allowed = new Set(toolNames);
|
|
21
|
+
return {
|
|
22
|
+
name: 'allow-list',
|
|
23
|
+
async check(call) {
|
|
24
|
+
if (allowed.has(call.name))
|
|
25
|
+
return { mode: 'allow_session', reason: 'allow-list' };
|
|
26
|
+
return { mode: 'deny', reason: `Tool '${call.name}' not in allow-list` };
|
|
27
|
+
},
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Resolver for channels that defer permission decisions to an external UI
|
|
32
|
+
* (Ink dialog, Telegram inline keyboard, web form). Wraps a `prompt`
|
|
33
|
+
* callback with:
|
|
34
|
+
* - sessionAllows shortcut — `allow_session` decisions skip subsequent
|
|
35
|
+
* prompts for the same tool name.
|
|
36
|
+
* - in-flight tracking — `abortAll()` resolves pending prompts with
|
|
37
|
+
* `deny`, so the channel can shut down cleanly without hangs.
|
|
38
|
+
*/
|
|
39
|
+
export function createDeferredPermissionResolver(opts) {
|
|
40
|
+
const sessionAllows = opts.sessionAllows ?? new Set();
|
|
41
|
+
const pending = new Set();
|
|
42
|
+
return {
|
|
43
|
+
name: opts.name ?? 'deferred',
|
|
44
|
+
async check(call, ctx) {
|
|
45
|
+
if (sessionAllows.has(call.name)) {
|
|
46
|
+
return { mode: 'allow_session', reason: 'allow_session previously granted' };
|
|
47
|
+
}
|
|
48
|
+
const decision = await new Promise((resolve) => {
|
|
49
|
+
pending.add(resolve);
|
|
50
|
+
opts.prompt(call, ctx).then((d) => {
|
|
51
|
+
pending.delete(resolve);
|
|
52
|
+
resolve(d);
|
|
53
|
+
}, (err) => {
|
|
54
|
+
pending.delete(resolve);
|
|
55
|
+
resolve({ mode: 'deny', reason: err instanceof Error ? err.message : String(err) });
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
// Both allow_session and allow_always should skip future prompts for
|
|
59
|
+
// the same tool within this resolver instance. allow_always
|
|
60
|
+
// additionally signals to the caller (via the decision flag) that
|
|
61
|
+
// the rule should be persisted to ~/.moxxy/permissions.json — but
|
|
62
|
+
// that persistence isn't our job; the channel does it when wiring
|
|
63
|
+
// up the dialog.
|
|
64
|
+
if (decision.mode === 'allow_session' || decision.mode === 'allow_always') {
|
|
65
|
+
sessionAllows.add(call.name);
|
|
66
|
+
}
|
|
67
|
+
return decision;
|
|
68
|
+
},
|
|
69
|
+
abortAll(reason = 'channel closed') {
|
|
70
|
+
for (const r of pending)
|
|
71
|
+
r({ mode: 'deny', reason });
|
|
72
|
+
pending.clear();
|
|
73
|
+
},
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Evaluate a tool's OWN declared {@link PermissionRule} against a call.
|
|
78
|
+
*
|
|
79
|
+
* Tools can ship a `permission` rule to express their author's policy — e.g.
|
|
80
|
+
* `reload_skills` / `load_tool` declare `{ action: 'allow' }` because they're
|
|
81
|
+
* safe, internal, idempotent operations that should never prompt. That rule
|
|
82
|
+
* was previously stored on the ToolDef but never consulted, so in headless
|
|
83
|
+
* runs (where the channel resolver denies by default) even these safe tools
|
|
84
|
+
* were blocked. The session resolver now consults this BETWEEN the user's
|
|
85
|
+
* `permissions.json` policy and the channel resolver, so:
|
|
86
|
+
*
|
|
87
|
+
* user policy (deny/allow) > tool-declared rule > channel resolver
|
|
88
|
+
*
|
|
89
|
+
* Returns a decision for a matching `allow`/`deny` rule, or `null` to defer
|
|
90
|
+
* (no rule, pattern didn't match, or `action: 'prompt'` — the interactive
|
|
91
|
+
* resolver should handle those).
|
|
92
|
+
*/
|
|
93
|
+
export function evaluateToolRule(rule, call) {
|
|
94
|
+
if (!rule || !toolRuleMatches(rule, call))
|
|
95
|
+
return null;
|
|
96
|
+
switch (rule.action) {
|
|
97
|
+
case 'allow':
|
|
98
|
+
return { mode: 'allow', reason: rule.reason ?? 'tool-declared allow' };
|
|
99
|
+
case 'deny':
|
|
100
|
+
return { mode: 'deny', reason: rule.reason ?? 'tool-declared deny' };
|
|
101
|
+
case 'prompt':
|
|
102
|
+
return null; // defer to the interactive resolver
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
function toolRuleMatches(rule, call) {
|
|
106
|
+
const p = rule.pattern;
|
|
107
|
+
if (!p)
|
|
108
|
+
return true; // no pattern → applies to every call of this tool
|
|
109
|
+
if (p.name !== undefined && !patternMatch(p.name, call.name))
|
|
110
|
+
return false;
|
|
111
|
+
if (p.inputMatches) {
|
|
112
|
+
const input = (call.input ?? {});
|
|
113
|
+
for (const [key, matcher] of Object.entries(p.inputMatches)) {
|
|
114
|
+
if (!patternMatch(matcher, String(input[key] ?? '')))
|
|
115
|
+
return false;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
return true;
|
|
119
|
+
}
|
|
120
|
+
function patternMatch(pattern, candidate) {
|
|
121
|
+
return pattern instanceof RegExp ? pattern.test(candidate) : pattern === candidate;
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=resolvers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolvers.js","sourceRoot":"","sources":["../src/resolvers.ts"],"names":[],"mappings":"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"}
|
package/dist/session-like.d.ts
CHANGED
|
@@ -37,10 +37,22 @@ export interface RunTurnOptions {
|
|
|
37
37
|
export interface SessionLogReader extends EventLogReader {
|
|
38
38
|
subscribe(fn: (event: MoxxyEvent) => void | Promise<void>): () => void;
|
|
39
39
|
}
|
|
40
|
-
/**
|
|
40
|
+
/** How a provider authenticates. UIs use this to decide whether to
|
|
41
|
+
* show an API-key field or kick off an OAuth flow. */
|
|
42
|
+
export type ProviderAuthKind = 'api-key' | 'oauth';
|
|
43
|
+
/** Serializable provider metadata (models + context windows + auth)
|
|
44
|
+
* for display. */
|
|
41
45
|
export interface ProviderInfo {
|
|
42
46
|
readonly name: string;
|
|
43
47
|
readonly models: ReadonlyArray<ModelDescriptor>;
|
|
48
|
+
/** 'oauth' when the provider declares an oauth login on its plugin
|
|
49
|
+
* definition, 'api-key' otherwise. Defaults to 'api-key' for
|
|
50
|
+
* providers that don't declare. */
|
|
51
|
+
readonly authKind: ProviderAuthKind;
|
|
52
|
+
/** True when the provider's plugin can list its models live (e.g.
|
|
53
|
+
* via /v1/models). Lets the desktop's model picker show a
|
|
54
|
+
* "Fetch live" affordance only where it makes sense. */
|
|
55
|
+
readonly supportsLiveModelDiscovery: boolean;
|
|
44
56
|
}
|
|
45
57
|
/** Serializable tool metadata for status lines / slash menus / compact rendering. */
|
|
46
58
|
export interface ToolInfo {
|
|
@@ -86,6 +98,64 @@ export interface SessionInfo {
|
|
|
86
98
|
/** Name of the active transcriber, or null. Lets a thin client proxy STT. */
|
|
87
99
|
readonly activeTranscriber: string | null;
|
|
88
100
|
}
|
|
101
|
+
/**
|
|
102
|
+
* Resolves a provider's stored credentials (vault tokens / API keys) into the
|
|
103
|
+
* config object `providers.setActive` needs. The host installs one on a local
|
|
104
|
+
* Session at boot; it is undefined across a `RemoteSession` transport (a closure
|
|
105
|
+
* can't cross the wire — the runner side resolves credentials there instead).
|
|
106
|
+
*/
|
|
107
|
+
export type CredentialResolver = (providerName: string) => Promise<Record<string, unknown>>;
|
|
108
|
+
/** One server's status in {@link McpAdminView.listServers}. */
|
|
109
|
+
export interface McpServerStatusView {
|
|
110
|
+
readonly name: string;
|
|
111
|
+
readonly enabled: boolean;
|
|
112
|
+
readonly connected: boolean;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* The slice of the MCP admin API a channel needs to drive the MCP picker and
|
|
116
|
+
* status line. Present on a local Session when the MCP admin plugin is wired;
|
|
117
|
+
* a `RemoteSession` leaves {@link SessionLike.mcpAdmin} undefined and the UI
|
|
118
|
+
* degrades gracefully.
|
|
119
|
+
*/
|
|
120
|
+
export interface McpAdminView {
|
|
121
|
+
enableAndAttach(name: string): Promise<{
|
|
122
|
+
toolNames: ReadonlyArray<string>;
|
|
123
|
+
} | null>;
|
|
124
|
+
detach(name: string): Promise<boolean>;
|
|
125
|
+
listServers(): Promise<ReadonlyArray<McpServerStatusView>>;
|
|
126
|
+
}
|
|
127
|
+
/** One workflow's summary for the `/workflows` modal. */
|
|
128
|
+
export interface WorkflowSummaryView {
|
|
129
|
+
readonly name: string;
|
|
130
|
+
readonly description: string;
|
|
131
|
+
readonly enabled: boolean;
|
|
132
|
+
readonly scope: string;
|
|
133
|
+
readonly steps: number;
|
|
134
|
+
/** Human-readable trigger summary, e.g. `cron(0 8 * * *)` or `on-demand`. */
|
|
135
|
+
readonly triggers: string;
|
|
136
|
+
}
|
|
137
|
+
/** Result of running a workflow from the modal. */
|
|
138
|
+
export interface WorkflowRunView {
|
|
139
|
+
readonly ok: boolean;
|
|
140
|
+
readonly output: string;
|
|
141
|
+
readonly error?: string;
|
|
142
|
+
readonly steps: ReadonlyArray<{
|
|
143
|
+
readonly id: string;
|
|
144
|
+
readonly status: string;
|
|
145
|
+
readonly error?: string;
|
|
146
|
+
}>;
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* The slice of the workflows API a channel needs to drive the `/workflows`
|
|
150
|
+
* modal (list, enable/disable toggle, run). Present on a local Session when
|
|
151
|
+
* `@moxxy/plugin-workflows` is wired; a `RemoteSession` leaves
|
|
152
|
+
* {@link SessionLike.workflows} undefined and the UI degrades gracefully.
|
|
153
|
+
*/
|
|
154
|
+
export interface WorkflowsView {
|
|
155
|
+
list(): Promise<ReadonlyArray<WorkflowSummaryView>>;
|
|
156
|
+
setEnabled(name: string, enabled: boolean): Promise<void>;
|
|
157
|
+
run(name: string): Promise<WorkflowRunView>;
|
|
158
|
+
}
|
|
89
159
|
/**
|
|
90
160
|
* The session surface a `Channel` depends on, decoupled from whether the
|
|
91
161
|
* session runs in-process (`@moxxy/core`'s `Session`) or is a thin-client
|
|
@@ -107,5 +177,19 @@ export interface SessionLike {
|
|
|
107
177
|
/** Wire-friendly registry snapshot for rendering. */
|
|
108
178
|
getInfo(): SessionInfo;
|
|
109
179
|
close(reason?: string): Promise<void>;
|
|
180
|
+
/**
|
|
181
|
+
* Live runtime capabilities present only on an in-process Session; a
|
|
182
|
+
* `RemoteSession` thin client leaves them undefined, so callers MUST guard.
|
|
183
|
+
* For plain display prefer the serializable {@link getInfo} snapshot — these
|
|
184
|
+
* are for the mutate/guard paths a channel drives (provider switch, MCP picker).
|
|
185
|
+
*/
|
|
186
|
+
/** Providers whose credentials resolved this session (live, mutable). */
|
|
187
|
+
readyProviders?: Set<string>;
|
|
188
|
+
/** Re-resolves a provider's credentials before `providers.setActive`. */
|
|
189
|
+
credentialResolver?: CredentialResolver;
|
|
190
|
+
/** MCP admin slice backing the MCP picker / status line. */
|
|
191
|
+
mcpAdmin?: McpAdminView;
|
|
192
|
+
/** Workflows slice backing the `/workflows` modal. */
|
|
193
|
+
workflows?: WorkflowsView;
|
|
110
194
|
}
|
|
111
195
|
//# sourceMappingURL=session-like.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-like.d.ts","sourceRoot":"","sources":["../src/session-like.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACpE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC/C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAClD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAC1D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,WAAW,CAAC;AAEzD;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC;;;OAGG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;IAC9B,8EAA8E;IAC9E,QAAQ,CAAC,WAAW,CAAC,EAAE,aAAa,CAAC,oBAAoB,CAAC,CAAC;IAC3D;;;;OAIG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;;;;GAKG;AACH,MAAM,WAAW,gBAAiB,SAAQ,cAAc;IACtD,SAAS,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,MAAM,IAAI,CAAC;CACxE;AAED,
|
|
1
|
+
{"version":3,"file":"session-like.d.ts","sourceRoot":"","sources":["../src/session-like.ts"],"names":[],"mappings":"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"}
|
package/dist/voice.d.ts
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Voice / transcription helpers shared across surfaces.
|
|
3
|
+
*
|
|
4
|
+
* The TUI's voice-input infrastructure used to inline the same logic
|
|
5
|
+
* with a `Codex`-specific name baked in. Pulled out here as
|
|
6
|
+
* *agnostic* helpers that take a transcriber name as input, so the
|
|
7
|
+
* desktop, TUI, and any future channel can mirror the same flow:
|
|
8
|
+
*
|
|
9
|
+
* - Is the session ready to transcribe? Check via the requirements
|
|
10
|
+
* API for a named transcriber. (`checkTranscriberReady`)
|
|
11
|
+
* - Activate any registered transcriber lazily. Returns the active
|
|
12
|
+
* transcriber instance. (`resolveTranscriber`)
|
|
13
|
+
* - "Just give me whatever works" — try a list of candidates in
|
|
14
|
+
* order, or fall back to the first registered one. (`pickFirstAvailableTranscriber`)
|
|
15
|
+
*/
|
|
16
|
+
import type { ClientSession } from './client-session.js';
|
|
17
|
+
import type { MoxxyRequirement, RequirementCheck } from './requirements.js';
|
|
18
|
+
import type { Transcriber } from './transcriber.js';
|
|
19
|
+
/** Probe whether a *named* transcriber is ready: registered, with any
|
|
20
|
+
* declared upstream requirements satisfied. The optional `requires`
|
|
21
|
+
* list lets channels gate on additional provider / auth runtimes
|
|
22
|
+
* (the Codex transcriber e.g. depends on the `openai-codex` provider
|
|
23
|
+
* + its OAuth runtime). */
|
|
24
|
+
export declare function checkTranscriberReady(session: ClientSession, transcriberName: string, requires?: ReadonlyArray<MoxxyRequirement>): RequirementCheck;
|
|
25
|
+
/** Activate a transcriber by name, lazily. Returns the active instance
|
|
26
|
+
* ready to `.transcribe(...)`. Throws if no such transcriber is
|
|
27
|
+
* registered, or a *different* one is already active. */
|
|
28
|
+
export declare function resolveTranscriber(session: ClientSession, transcriberName: string): Transcriber;
|
|
29
|
+
/** "Just pick a transcriber that works."
|
|
30
|
+
*
|
|
31
|
+
* Tries each name in `candidates` in order — first one that can be
|
|
32
|
+
* activated wins. Returns null if none can be activated, so callers
|
|
33
|
+
* can degrade gracefully (hide their mic button, show a "no voice
|
|
34
|
+
* configured" tip, …) instead of throwing. */
|
|
35
|
+
export declare function pickFirstAvailableTranscriber(session: ClientSession, candidates: ReadonlyArray<string>): Transcriber | null;
|
|
36
|
+
//# sourceMappingURL=voice.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"voice.d.ts","sourceRoot":"","sources":["../src/voice.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,KAAK,EACV,gBAAgB,EAChB,gBAAgB,EAEjB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEpD;;;;4BAI4B;AAC5B,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,aAAa,EACtB,eAAe,EAAE,MAAM,EACvB,QAAQ,GAAE,aAAa,CAAC,gBAAgB,CAAM,GAC7C,gBAAgB,CAqBlB;AAED;;0DAE0D;AAC1D,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,aAAa,EACtB,eAAe,EAAE,MAAM,GACtB,WAAW,CAcb;AAED;;;;;+CAK+C;AAC/C,wBAAgB,6BAA6B,CAC3C,OAAO,EAAE,aAAa,EACtB,UAAU,EAAE,aAAa,CAAC,MAAM,CAAC,GAChC,WAAW,GAAG,IAAI,CAepB"}
|
package/dist/voice.js
ADDED
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Voice / transcription helpers shared across surfaces.
|
|
3
|
+
*
|
|
4
|
+
* The TUI's voice-input infrastructure used to inline the same logic
|
|
5
|
+
* with a `Codex`-specific name baked in. Pulled out here as
|
|
6
|
+
* *agnostic* helpers that take a transcriber name as input, so the
|
|
7
|
+
* desktop, TUI, and any future channel can mirror the same flow:
|
|
8
|
+
*
|
|
9
|
+
* - Is the session ready to transcribe? Check via the requirements
|
|
10
|
+
* API for a named transcriber. (`checkTranscriberReady`)
|
|
11
|
+
* - Activate any registered transcriber lazily. Returns the active
|
|
12
|
+
* transcriber instance. (`resolveTranscriber`)
|
|
13
|
+
* - "Just give me whatever works" — try a list of candidates in
|
|
14
|
+
* order, or fall back to the first registered one. (`pickFirstAvailableTranscriber`)
|
|
15
|
+
*/
|
|
16
|
+
/** Probe whether a *named* transcriber is ready: registered, with any
|
|
17
|
+
* declared upstream requirements satisfied. The optional `requires`
|
|
18
|
+
* list lets channels gate on additional provider / auth runtimes
|
|
19
|
+
* (the Codex transcriber e.g. depends on the `openai-codex` provider
|
|
20
|
+
* + its OAuth runtime). */
|
|
21
|
+
export function checkTranscriberReady(session, transcriberName, requires = []) {
|
|
22
|
+
const baseline = [
|
|
23
|
+
{ kind: 'transcriber', name: transcriberName },
|
|
24
|
+
...requires,
|
|
25
|
+
];
|
|
26
|
+
const check = session.requirements.check(baseline);
|
|
27
|
+
const activeName = session.transcribers.getActiveName();
|
|
28
|
+
if (!activeName || activeName === transcriberName)
|
|
29
|
+
return check;
|
|
30
|
+
const conflict = {
|
|
31
|
+
requirement: {
|
|
32
|
+
kind: 'transcriber',
|
|
33
|
+
name: transcriberName,
|
|
34
|
+
state: 'active',
|
|
35
|
+
hint: `Switch active transcriber to ${transcriberName}.`,
|
|
36
|
+
},
|
|
37
|
+
code: 'inactive',
|
|
38
|
+
message: `Required active transcriber ${transcriberName}; active is ${activeName}`,
|
|
39
|
+
hint: `Switch active transcriber to ${transcriberName}.`,
|
|
40
|
+
};
|
|
41
|
+
return { ready: false, issues: [conflict, ...check.issues] };
|
|
42
|
+
}
|
|
43
|
+
/** Activate a transcriber by name, lazily. Returns the active instance
|
|
44
|
+
* ready to `.transcribe(...)`. Throws if no such transcriber is
|
|
45
|
+
* registered, or a *different* one is already active. */
|
|
46
|
+
export function resolveTranscriber(session, transcriberName) {
|
|
47
|
+
const activeName = session.transcribers.getActiveName();
|
|
48
|
+
if (activeName && activeName !== transcriberName) {
|
|
49
|
+
throw new Error(`Another transcriber is already active: ${activeName}.`);
|
|
50
|
+
}
|
|
51
|
+
if (activeName === transcriberName)
|
|
52
|
+
return session.transcribers.getActive();
|
|
53
|
+
if (session.transcribers.has(transcriberName)) {
|
|
54
|
+
return session.transcribers.setActive(transcriberName);
|
|
55
|
+
}
|
|
56
|
+
throw new Error(`No transcriber registered as ${transcriberName}. Configure one via your moxxy plugins.`);
|
|
57
|
+
}
|
|
58
|
+
/** "Just pick a transcriber that works."
|
|
59
|
+
*
|
|
60
|
+
* Tries each name in `candidates` in order — first one that can be
|
|
61
|
+
* activated wins. Returns null if none can be activated, so callers
|
|
62
|
+
* can degrade gracefully (hide their mic button, show a "no voice
|
|
63
|
+
* configured" tip, …) instead of throwing. */
|
|
64
|
+
export function pickFirstAvailableTranscriber(session, candidates) {
|
|
65
|
+
// If something's already active, just hand that back — never fight
|
|
66
|
+
// a user-chosen activation.
|
|
67
|
+
const existing = session.transcribers.tryGetActive();
|
|
68
|
+
if (existing)
|
|
69
|
+
return existing;
|
|
70
|
+
for (const name of candidates) {
|
|
71
|
+
try {
|
|
72
|
+
return resolveTranscriber(session, name);
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
// Wrong-active errors don't apply here (we just returned early),
|
|
76
|
+
// so any throw is "this candidate isn't registered" — keep
|
|
77
|
+
// trying.
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=voice.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"voice.js","sourceRoot":"","sources":["../src/voice.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAUH;;;;4BAI4B;AAC5B,MAAM,UAAU,qBAAqB,CACnC,OAAsB,EACtB,eAAuB,EACvB,WAA4C,EAAE;IAE9C,MAAM,QAAQ,GAAoC;QAChD,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,eAAe,EAAE;QAC9C,GAAG,QAAQ;KACZ,CAAC;IACF,MAAM,KAAK,GAAG,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACnD,MAAM,UAAU,GAAG,OAAO,CAAC,YAAY,CAAC,aAAa,EAAE,CAAC;IACxD,IAAI,CAAC,UAAU,IAAI,UAAU,KAAK,eAAe;QAAE,OAAO,KAAK,CAAC;IAEhE,MAAM,QAAQ,GAAqB;QACjC,WAAW,EAAE;YACX,IAAI,EAAE,aAAa;YACnB,IAAI,EAAE,eAAe;YACrB,KAAK,EAAE,QAAQ;YACf,IAAI,EAAE,gCAAgC,eAAe,GAAG;SACzD;QACD,IAAI,EAAE,UAAU;QAChB,OAAO,EAAE,+BAA+B,eAAe,eAAe,UAAU,EAAE;QAClF,IAAI,EAAE,gCAAgC,eAAe,GAAG;KACzD,CAAC;IACF,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,QAAQ,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;AAC/D,CAAC;AAED;;0DAE0D;AAC1D,MAAM,UAAU,kBAAkB,CAChC,OAAsB,EACtB,eAAuB;IAEvB,MAAM,UAAU,GAAG,OAAO,CAAC,YAAY,CAAC,aAAa,EAAE,CAAC;IACxD,IAAI,UAAU,IAAI,UAAU,KAAK,eAAe,EAAE,CAAC;QACjD,MAAM,IAAI,KAAK,CACb,0CAA0C,UAAU,GAAG,CACxD,CAAC;IACJ,CAAC;IACD,IAAI,UAAU,KAAK,eAAe;QAAE,OAAO,OAAO,CAAC,YAAY,CAAC,SAAS,EAAE,CAAC;IAC5E,IAAI,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE,CAAC;QAC9C,OAAO,OAAO,CAAC,YAAY,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;IACzD,CAAC;IACD,MAAM,IAAI,KAAK,CACb,gCAAgC,eAAe,yCAAyC,CACzF,CAAC;AACJ,CAAC;AAED;;;;;+CAK+C;AAC/C,MAAM,UAAU,6BAA6B,CAC3C,OAAsB,EACtB,UAAiC;IAEjC,mEAAmE;IACnE,4BAA4B;IAC5B,MAAM,QAAQ,GAAG,OAAO,CAAC,YAAY,CAAC,YAAY,EAAE,CAAC;IACrD,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC9B,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;QAC9B,IAAI,CAAC;YACH,OAAO,kBAAkB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAC3C,CAAC;QAAC,MAAM,CAAC;YACP,iEAAiE;YACjE,2DAA2D;YAC3D,UAAU;QACZ,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Workflows — saved, parameterized, schedulable/event-triggered DAGs whose
|
|
3
|
+
* steps run a skill, a free-form prompt, a tool, or a nested workflow, piping
|
|
4
|
+
* each step's output into the next. A workflow is an *artifact* (authored like
|
|
5
|
+
* a skill, discovered from disk); the strategy that *executes* it is a
|
|
6
|
+
* swappable block — {@link WorkflowExecutorDef} — registered into the
|
|
7
|
+
* `WorkflowExecutorRegistry` and selected by name, mirroring modes/compactors.
|
|
8
|
+
*
|
|
9
|
+
* These are the shared structural types. The zod schema that validates
|
|
10
|
+
* on-disk YAML lives in `@moxxy/plugin-workflows`; its parsed output is
|
|
11
|
+
* assignable to {@link Workflow}.
|
|
12
|
+
*/
|
|
13
|
+
import type { Skill } from './skill.js';
|
|
14
|
+
import type { SubagentSpawner } from './subagent.js';
|
|
15
|
+
/** What fires a workflow. Omit `on` entirely for an on-demand-only workflow. */
|
|
16
|
+
export interface WorkflowTrigger {
|
|
17
|
+
/** Cron / one-shot time trigger, dispatched by `@moxxy/plugin-scheduler`. */
|
|
18
|
+
readonly schedule?: {
|
|
19
|
+
readonly cron?: string;
|
|
20
|
+
readonly runAt?: number | string;
|
|
21
|
+
readonly timeZone?: string;
|
|
22
|
+
};
|
|
23
|
+
/** Run when the named workflow(s) complete successfully (EventLog-driven). */
|
|
24
|
+
readonly afterWorkflow?: string | ReadonlyArray<string>;
|
|
25
|
+
/** Run when files matching the glob(s) under cwd change (fs.watch-driven). */
|
|
26
|
+
readonly fileChanged?: string | ReadonlyArray<string>;
|
|
27
|
+
/** Named webhook provider whose delivery fires this workflow. */
|
|
28
|
+
readonly webhook?: string;
|
|
29
|
+
}
|
|
30
|
+
/** How a failed step is handled: abort the workflow, skip past it, or retry. */
|
|
31
|
+
export type WorkflowStepErrorMode = 'fail' | 'continue' | 'retry';
|
|
32
|
+
/**
|
|
33
|
+
* One node in the DAG. Exactly one *action* key is set
|
|
34
|
+
* (`skill` | `prompt` | `tool` | `workflow`). `input` is the templated prompt
|
|
35
|
+
* for skill/prompt actions; `args` are the templated arguments for
|
|
36
|
+
* tool/workflow actions. `needs` are the upstream step ids this step depends on.
|
|
37
|
+
*/
|
|
38
|
+
export interface WorkflowStep {
|
|
39
|
+
readonly id: string;
|
|
40
|
+
readonly skill?: string;
|
|
41
|
+
readonly prompt?: string;
|
|
42
|
+
readonly tool?: string;
|
|
43
|
+
readonly workflow?: string;
|
|
44
|
+
readonly input?: string;
|
|
45
|
+
readonly args?: Record<string, unknown>;
|
|
46
|
+
readonly needs: ReadonlyArray<string>;
|
|
47
|
+
/** Condition DSL; when it evaluates false the step is skipped. */
|
|
48
|
+
readonly when?: string;
|
|
49
|
+
readonly onError: WorkflowStepErrorMode;
|
|
50
|
+
readonly retries: number;
|
|
51
|
+
readonly label?: string;
|
|
52
|
+
}
|
|
53
|
+
export interface WorkflowInputSpec {
|
|
54
|
+
readonly default?: unknown;
|
|
55
|
+
readonly description?: string;
|
|
56
|
+
}
|
|
57
|
+
export interface WorkflowDelivery {
|
|
58
|
+
/** Soft hint for delivery target — e.g. "telegram", "inbox". */
|
|
59
|
+
readonly channel?: string;
|
|
60
|
+
/** Also drop the final output into `~/.moxxy/inbox/`. Default true. */
|
|
61
|
+
readonly inbox: boolean;
|
|
62
|
+
}
|
|
63
|
+
export interface Workflow {
|
|
64
|
+
readonly name: string;
|
|
65
|
+
readonly description: string;
|
|
66
|
+
readonly version: number;
|
|
67
|
+
/**
|
|
68
|
+
* When false the workflow is inert: triggers (schedule/event) never fire it
|
|
69
|
+
* and it is excluded from auto-runs, but it stays listable and can still be
|
|
70
|
+
* run explicitly. Toggled from the `/workflows` command.
|
|
71
|
+
*/
|
|
72
|
+
readonly enabled: boolean;
|
|
73
|
+
readonly inputs: Record<string, WorkflowInputSpec>;
|
|
74
|
+
readonly on?: WorkflowTrigger;
|
|
75
|
+
readonly delivery?: WorkflowDelivery;
|
|
76
|
+
/** Max steps to run concurrently in one ready-set round. */
|
|
77
|
+
readonly concurrency: number;
|
|
78
|
+
readonly steps: ReadonlyArray<WorkflowStep>;
|
|
79
|
+
}
|
|
80
|
+
/** Minimal tool surface a step needs — structurally a subset of `ToolRegistry`. */
|
|
81
|
+
export interface WorkflowToolRunner {
|
|
82
|
+
get(name: string): unknown | undefined;
|
|
83
|
+
execute(name: string, input: unknown, signal: AbortSignal): Promise<unknown>;
|
|
84
|
+
}
|
|
85
|
+
/** Look up sibling artifacts by name during a run. */
|
|
86
|
+
export interface WorkflowLookup {
|
|
87
|
+
skill(name: string): Skill | undefined;
|
|
88
|
+
workflow(name: string): Workflow | undefined;
|
|
89
|
+
}
|
|
90
|
+
/** Lifecycle subtypes an executor emits as `plugin_event`s (mirrors plan_*). */
|
|
91
|
+
export type WorkflowEventSubtype = 'workflow_started' | 'workflow_step_started' | 'workflow_step_completed' | 'workflow_step_skipped' | 'workflow_step_failed' | 'workflow_completed' | 'workflow_failed';
|
|
92
|
+
/**
|
|
93
|
+
* Everything an executor needs to run a workflow, supplied by the caller.
|
|
94
|
+
* The in-turn `workflow_run` tool wires `spawner` from `ctx.subagents`; the
|
|
95
|
+
* autonomous runner builds one from an isolated session. Kept free of core
|
|
96
|
+
* imports so the executor stays in a plugin.
|
|
97
|
+
*/
|
|
98
|
+
export interface WorkflowRunDeps {
|
|
99
|
+
readonly spawner: SubagentSpawner;
|
|
100
|
+
readonly tools: WorkflowToolRunner;
|
|
101
|
+
readonly lookup: WorkflowLookup;
|
|
102
|
+
readonly signal: AbortSignal;
|
|
103
|
+
/** Resolved input values (defaults already applied) for this run. */
|
|
104
|
+
readonly inputs?: Record<string, unknown>;
|
|
105
|
+
/** Free-form description of what fired the run (for `{{ trigger }}`). */
|
|
106
|
+
readonly trigger?: string;
|
|
107
|
+
/** Wall-clock source. Injected so tests are deterministic. */
|
|
108
|
+
readonly now?: () => number;
|
|
109
|
+
/** Emit a workflow lifecycle event. No-op when omitted. */
|
|
110
|
+
readonly emit?: (subtype: WorkflowEventSubtype, payload: unknown) => void | Promise<void>;
|
|
111
|
+
readonly logger?: {
|
|
112
|
+
warn?(msg: string, meta?: Record<string, unknown>): void;
|
|
113
|
+
info?(msg: string, meta?: Record<string, unknown>): void;
|
|
114
|
+
};
|
|
115
|
+
/** Nested-workflow recursion depth; executors guard against runaway nesting. */
|
|
116
|
+
readonly depth?: number;
|
|
117
|
+
}
|
|
118
|
+
export type WorkflowStepStatus = 'completed' | 'skipped' | 'failed';
|
|
119
|
+
export interface WorkflowStepResult {
|
|
120
|
+
readonly id: string;
|
|
121
|
+
readonly status: WorkflowStepStatus;
|
|
122
|
+
readonly output: string;
|
|
123
|
+
readonly error?: string;
|
|
124
|
+
readonly startedAt: number;
|
|
125
|
+
readonly endedAt: number;
|
|
126
|
+
}
|
|
127
|
+
export interface WorkflowRunResult {
|
|
128
|
+
readonly ok: boolean;
|
|
129
|
+
readonly steps: ReadonlyArray<WorkflowStepResult>;
|
|
130
|
+
/** Output of the terminal (sink) step(s) — what delivery sends. */
|
|
131
|
+
readonly output: string;
|
|
132
|
+
readonly error?: string;
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* A swappable workflow-execution strategy. v1 ships one (`dag`); a plugin can
|
|
136
|
+
* register alternatives (parallel-heavy, dry-run, …) and the active one is
|
|
137
|
+
* selected by name via `session.workflowExecutors.setActive(name)`.
|
|
138
|
+
*/
|
|
139
|
+
export interface WorkflowExecutorDef {
|
|
140
|
+
readonly name: string;
|
|
141
|
+
readonly description?: string;
|
|
142
|
+
run(workflow: Workflow, deps: WorkflowRunDeps): Promise<WorkflowRunResult>;
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=workflow.d.ts.map
|