skyloom 1.15.5 → 1.16.1
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/dist/cli/command_args.d.ts +74 -0
- package/dist/cli/command_args.d.ts.map +1 -0
- package/dist/cli/command_args.js +129 -0
- package/dist/cli/command_args.js.map +1 -0
- package/dist/cli/loom.d.ts +36 -1
- package/dist/cli/loom.d.ts.map +1 -1
- package/dist/cli/loom.js +237 -33
- package/dist/cli/loom.js.map +1 -1
- package/dist/cli/loom_chat.d.ts.map +1 -1
- package/dist/cli/loom_chat.js +71 -3
- package/dist/cli/loom_chat.js.map +1 -1
- package/dist/core/agent.js +2 -2
- package/dist/core/agent.js.map +1 -1
- package/dist/core/commands.d.ts +5 -0
- package/dist/core/commands.d.ts.map +1 -1
- package/dist/core/commands.js +21 -0
- package/dist/core/commands.js.map +1 -1
- package/dist/core/security.d.ts.map +1 -1
- package/dist/core/security.js +1 -0
- package/dist/core/security.js.map +1 -1
- package/dist/core/tool_router.d.ts.map +1 -1
- package/dist/core/tool_router.js +11 -3
- package/dist/core/tool_router.js.map +1 -1
- package/dist/tools/builtin.d.ts.map +1 -1
- package/dist/tools/builtin.js +38 -192
- package/dist/tools/builtin.js.map +1 -1
- package/dist/tools/websearch.d.ts +92 -0
- package/dist/tools/websearch.d.ts.map +1 -0
- package/dist/tools/websearch.js +343 -0
- package/dist/tools/websearch.js.map +1 -0
- package/package.json +1 -1
- package/src/cli/command_args.ts +159 -0
- package/src/cli/loom.ts +191 -24
- package/src/cli/loom_chat.ts +63 -3
- package/src/core/agent.ts +2 -2
- package/src/core/commands.ts +21 -0
- package/src/core/security.ts +1 -0
- package/src/core/tool_router.ts +11 -3
- package/src/tools/builtin.ts +38 -190
- package/src/tools/websearch.ts +368 -0
- package/tests/command_args.test.ts +115 -0
- package/tests/commands.test.ts +23 -0
- package/tests/loom.test.ts +116 -0
- package/tests/tool_router.test.ts +15 -0
- package/tests/websearch.test.ts +190 -0
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 斜杠命令向导 · Cascading argument wizard for slash commands.
|
|
3
|
+
*
|
|
4
|
+
* After a slash command that takes structured arguments is chosen in the loom
|
|
5
|
+
* palette, the TUI walks the user through its arguments one level at a time:
|
|
6
|
+
* pick a provider, then paste a key; pick a model; pick a session. Each level is
|
|
7
|
+
* navigable with ↑/↓ and filterable by typing — the same affordance as the
|
|
8
|
+
* command palette itself, extended to arguments.
|
|
9
|
+
*
|
|
10
|
+
* This module is the pure brain of that flow (no I/O, no terminal) so it is
|
|
11
|
+
* fully unit-testable: given a command, the values chosen so far, and a snapshot
|
|
12
|
+
* of runtime context, it returns the next step — or null when the command is
|
|
13
|
+
* complete and ready to submit.
|
|
14
|
+
*/
|
|
15
|
+
export interface ArgChoice {
|
|
16
|
+
/** The value contributed to the final command line. */
|
|
17
|
+
value: string;
|
|
18
|
+
/** Display label in the list. */
|
|
19
|
+
label: string;
|
|
20
|
+
/** Optional dim hint shown after the label. */
|
|
21
|
+
hint?: string;
|
|
22
|
+
/** Optional group heading (e.g. provider name) for sectioned lists. */
|
|
23
|
+
group?: string;
|
|
24
|
+
}
|
|
25
|
+
export interface WizardStep {
|
|
26
|
+
kind: 'choice' | 'freeform';
|
|
27
|
+
/** Heading shown above the list / prompt. */
|
|
28
|
+
title: string;
|
|
29
|
+
/** Choices for a 'choice' step (already ordered). */
|
|
30
|
+
choices: ArgChoice[];
|
|
31
|
+
/** A 'choice' step may also accept a typed value not in the list. */
|
|
32
|
+
allowFreeform: boolean;
|
|
33
|
+
/** Placeholder for a 'freeform' step (or a free-typed choice). */
|
|
34
|
+
placeholder?: string;
|
|
35
|
+
/** Mask typed input (API keys). */
|
|
36
|
+
secret?: boolean;
|
|
37
|
+
}
|
|
38
|
+
export interface WizardProvider {
|
|
39
|
+
id: string;
|
|
40
|
+
label: string;
|
|
41
|
+
configured: boolean;
|
|
42
|
+
envVar?: string;
|
|
43
|
+
}
|
|
44
|
+
export interface WizardModel {
|
|
45
|
+
id: string;
|
|
46
|
+
provider: string;
|
|
47
|
+
label: string;
|
|
48
|
+
hint?: string;
|
|
49
|
+
}
|
|
50
|
+
export interface WizardSession {
|
|
51
|
+
id: string;
|
|
52
|
+
label: string;
|
|
53
|
+
}
|
|
54
|
+
export interface WizardContext {
|
|
55
|
+
providers: WizardProvider[];
|
|
56
|
+
models: WizardModel[];
|
|
57
|
+
sessions: WizardSession[];
|
|
58
|
+
}
|
|
59
|
+
/** Does this base command (with or without leading slash) have a wizard? */
|
|
60
|
+
export declare function hasWizard(command: string): boolean;
|
|
61
|
+
/**
|
|
62
|
+
* The next step for `command` given the values already chosen, or null when the
|
|
63
|
+
* command is complete (ready to submit via {@link buildCommandLine}).
|
|
64
|
+
*/
|
|
65
|
+
export declare function nextWizardStep(command: string, prior: string[], ctx: WizardContext): WizardStep | null;
|
|
66
|
+
/** Assemble the final command line from the base command + chosen values. */
|
|
67
|
+
export declare function buildCommandLine(command: string, values: string[]): string;
|
|
68
|
+
/**
|
|
69
|
+
* Filter + rank choices by a typed query (case-insensitive substring on value,
|
|
70
|
+
* label, and group). Empty query returns the list unchanged. Exact value/label
|
|
71
|
+
* prefix matches sort first so the obvious pick lands at the top.
|
|
72
|
+
*/
|
|
73
|
+
export declare function filterChoices(choices: ArgChoice[], typed: string): ArgChoice[];
|
|
74
|
+
//# sourceMappingURL=command_args.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command_args.d.ts","sourceRoot":"","sources":["../../src/cli/command_args.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,MAAM,WAAW,SAAS;IACxB,uDAAuD;IACvD,KAAK,EAAE,MAAM,CAAC;IACd,iCAAiC;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,+CAA+C;IAC/C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,uEAAuE;IACvE,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,QAAQ,GAAG,UAAU,CAAC;IAC5B,6CAA6C;IAC7C,KAAK,EAAE,MAAM,CAAC;IACd,qDAAqD;IACrD,OAAO,EAAE,SAAS,EAAE,CAAC;IACrB,qEAAqE;IACrE,aAAa,EAAE,OAAO,CAAC;IACvB,kEAAkE;IAClE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mCAAmC;IACnC,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAAG,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE;AACnG,MAAM,WAAW,WAAW;IAAG,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE;AAC3F,MAAM,WAAW,aAAa;IAAG,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE;AAE5D,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,cAAc,EAAE,CAAC;IAC5B,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,QAAQ,EAAE,aAAa,EAAE,CAAC;CAC3B;AAKD,4EAA4E;AAC5E,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAElD;AAmBD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,aAAa,GAAG,UAAU,GAAG,IAAI,CAoCtG;AAED,6EAA6E;AAC7E,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAgB1E;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,CAiB9E"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* 斜杠命令向导 · Cascading argument wizard for slash commands.
|
|
4
|
+
*
|
|
5
|
+
* After a slash command that takes structured arguments is chosen in the loom
|
|
6
|
+
* palette, the TUI walks the user through its arguments one level at a time:
|
|
7
|
+
* pick a provider, then paste a key; pick a model; pick a session. Each level is
|
|
8
|
+
* navigable with ↑/↓ and filterable by typing — the same affordance as the
|
|
9
|
+
* command palette itself, extended to arguments.
|
|
10
|
+
*
|
|
11
|
+
* This module is the pure brain of that flow (no I/O, no terminal) so it is
|
|
12
|
+
* fully unit-testable: given a command, the values chosen so far, and a snapshot
|
|
13
|
+
* of runtime context, it returns the next step — or null when the command is
|
|
14
|
+
* complete and ready to submit.
|
|
15
|
+
*/
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.hasWizard = hasWizard;
|
|
18
|
+
exports.nextWizardStep = nextWizardStep;
|
|
19
|
+
exports.buildCommandLine = buildCommandLine;
|
|
20
|
+
exports.filterChoices = filterChoices;
|
|
21
|
+
/** Commands that drive a guided wizard (base name without the leading slash). */
|
|
22
|
+
const WIZARD_COMMANDS = new Set(['model', 'apikey', 'connect', 'resume']);
|
|
23
|
+
/** Does this base command (with or without leading slash) have a wizard? */
|
|
24
|
+
function hasWizard(command) {
|
|
25
|
+
return WIZARD_COMMANDS.has(command.replace(/^\//, '').trim().toLowerCase());
|
|
26
|
+
}
|
|
27
|
+
function providerChoices(ctx) {
|
|
28
|
+
return ctx.providers.map((p) => ({
|
|
29
|
+
value: p.id,
|
|
30
|
+
label: p.label,
|
|
31
|
+
hint: p.configured ? '✓ 已配置' : (p.envVar ? `需 ${p.envVar}` : '未配置'),
|
|
32
|
+
}));
|
|
33
|
+
}
|
|
34
|
+
function modelChoices(ctx) {
|
|
35
|
+
return ctx.models.map((m) => ({
|
|
36
|
+
value: m.id,
|
|
37
|
+
label: m.id,
|
|
38
|
+
hint: m.hint,
|
|
39
|
+
group: m.provider,
|
|
40
|
+
}));
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* The next step for `command` given the values already chosen, or null when the
|
|
44
|
+
* command is complete (ready to submit via {@link buildCommandLine}).
|
|
45
|
+
*/
|
|
46
|
+
function nextWizardStep(command, prior, ctx) {
|
|
47
|
+
const cmd = command.replace(/^\//, '').trim().toLowerCase();
|
|
48
|
+
switch (cmd) {
|
|
49
|
+
case 'model': {
|
|
50
|
+
if (prior.length >= 1)
|
|
51
|
+
return null;
|
|
52
|
+
const choices = [
|
|
53
|
+
{ value: 'reset', label: '↺ reset', hint: '回到统一默认模型' },
|
|
54
|
+
...modelChoices(ctx),
|
|
55
|
+
];
|
|
56
|
+
return { kind: 'choice', title: '选择模型(输入可筛选)', choices, allowFreeform: true, placeholder: '模型 id' };
|
|
57
|
+
}
|
|
58
|
+
case 'connect': {
|
|
59
|
+
if (prior.length >= 1)
|
|
60
|
+
return null;
|
|
61
|
+
return { kind: 'choice', title: '选择 Provider', choices: providerChoices(ctx), allowFreeform: true, placeholder: 'provider' };
|
|
62
|
+
}
|
|
63
|
+
case 'apikey': {
|
|
64
|
+
// step 0: provider · step 1: the key
|
|
65
|
+
if (prior.length === 0) {
|
|
66
|
+
return { kind: 'choice', title: '为哪个 Provider 配置 API Key', choices: providerChoices(ctx), allowFreeform: true, placeholder: 'provider' };
|
|
67
|
+
}
|
|
68
|
+
if (prior.length === 1) {
|
|
69
|
+
return { kind: 'freeform', title: `粘贴 ${prior[0]} 的 API Key`, choices: [], allowFreeform: true, placeholder: 'sk-…(回车保存)', secret: true };
|
|
70
|
+
}
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
case 'resume': {
|
|
74
|
+
if (prior.length >= 1)
|
|
75
|
+
return null;
|
|
76
|
+
const choices = ctx.sessions.map((s, i) => ({ value: String(i + 1), label: `${i + 1}. ${s.label}`, hint: s.id.slice(0, 8) }));
|
|
77
|
+
return { kind: 'choice', title: choices.length ? '选择要恢复的会话' : '暂无历史会话', choices, allowFreeform: true, placeholder: '序号或 id' };
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
/** Assemble the final command line from the base command + chosen values. */
|
|
83
|
+
function buildCommandLine(command, values) {
|
|
84
|
+
const cmd = command.replace(/^\//, '').trim().toLowerCase();
|
|
85
|
+
const v = values.filter((x) => x !== undefined && x !== null);
|
|
86
|
+
switch (cmd) {
|
|
87
|
+
case 'apikey':
|
|
88
|
+
// /apikey set <provider> <key>
|
|
89
|
+
return `/apikey set ${v.join(' ')}`.trim();
|
|
90
|
+
case 'model':
|
|
91
|
+
return `/model ${v.join(' ')}`.trim();
|
|
92
|
+
case 'connect':
|
|
93
|
+
return `/connect ${v.join(' ')}`.trim();
|
|
94
|
+
case 'resume':
|
|
95
|
+
return `/resume ${v.join(' ')}`.trim();
|
|
96
|
+
default:
|
|
97
|
+
return `/${cmd} ${v.join(' ')}`.trim();
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Filter + rank choices by a typed query (case-insensitive substring on value,
|
|
102
|
+
* label, and group). Empty query returns the list unchanged. Exact value/label
|
|
103
|
+
* prefix matches sort first so the obvious pick lands at the top.
|
|
104
|
+
*/
|
|
105
|
+
function filterChoices(choices, typed) {
|
|
106
|
+
const q = typed.trim().toLowerCase();
|
|
107
|
+
if (!q)
|
|
108
|
+
return choices;
|
|
109
|
+
const scored = [];
|
|
110
|
+
for (const c of choices) {
|
|
111
|
+
const value = c.value.toLowerCase();
|
|
112
|
+
const label = c.label.toLowerCase();
|
|
113
|
+
const group = (c.group || '').toLowerCase();
|
|
114
|
+
let rank = -1;
|
|
115
|
+
if (value === q || label === q)
|
|
116
|
+
rank = 0;
|
|
117
|
+
else if (value.startsWith(q) || label.startsWith(q))
|
|
118
|
+
rank = 1;
|
|
119
|
+
else if (value.includes(q) || label.includes(q))
|
|
120
|
+
rank = 2;
|
|
121
|
+
else if (group.includes(q))
|
|
122
|
+
rank = 3;
|
|
123
|
+
if (rank >= 0)
|
|
124
|
+
scored.push({ c, rank });
|
|
125
|
+
}
|
|
126
|
+
scored.sort((a, b) => a.rank - b.rank); // stable within equal ranks
|
|
127
|
+
return scored.map((s) => s.c);
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=command_args.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command_args.js","sourceRoot":"","sources":["../../src/cli/command_args.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;GAaG;;AAyCH,8BAEC;AAuBD,wCAoCC;AAGD,4CAgBC;AAOD,sCAiBC;AA5GD,iFAAiF;AACjF,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC;AAE1E,4EAA4E;AAC5E,SAAgB,SAAS,CAAC,OAAe;IACvC,OAAO,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;AAC9E,CAAC;AAED,SAAS,eAAe,CAAC,GAAkB;IACzC,OAAO,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC/B,KAAK,EAAE,CAAC,CAAC,EAAE;QACX,KAAK,EAAE,CAAC,CAAC,KAAK;QACd,IAAI,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;KACpE,CAAC,CAAC,CAAC;AACN,CAAC;AAED,SAAS,YAAY,CAAC,GAAkB;IACtC,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC5B,KAAK,EAAE,CAAC,CAAC,EAAE;QACX,KAAK,EAAE,CAAC,CAAC,EAAE;QACX,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,KAAK,EAAE,CAAC,CAAC,QAAQ;KAClB,CAAC,CAAC,CAAC;AACN,CAAC;AAED;;;GAGG;AACH,SAAgB,cAAc,CAAC,OAAe,EAAE,KAAe,EAAE,GAAkB;IACjF,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAE5D,QAAQ,GAAG,EAAE,CAAC;QACZ,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC;gBAAE,OAAO,IAAI,CAAC;YACnC,MAAM,OAAO,GAAgB;gBAC3B,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE;gBACtD,GAAG,YAAY,CAAC,GAAG,CAAC;aACrB,CAAC;YACF,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC;QACtG,CAAC;QAED,KAAK,SAAS,CAAC,CAAC,CAAC;YACf,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC;gBAAE,OAAO,IAAI,CAAC;YACnC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,eAAe,CAAC,GAAG,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE,WAAW,EAAE,UAAU,EAAE,CAAC;QAC/H,CAAC;QAED,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,qCAAqC;YACrC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACvB,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,yBAAyB,EAAE,OAAO,EAAE,eAAe,CAAC,GAAG,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE,WAAW,EAAE,UAAU,EAAE,CAAC;YAC3I,CAAC;YACD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACvB,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,KAAK,CAAC,CAAC,CAAC,YAAY,EAAE,OAAO,EAAE,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;YAC5I,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QAED,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC;gBAAE,OAAO,IAAI,CAAC;YACnC,MAAM,OAAO,GAAgB,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAC3I,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,EAAE,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC;QAChI,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,6EAA6E;AAC7E,SAAgB,gBAAgB,CAAC,OAAe,EAAE,MAAgB;IAChE,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC5D,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC;IAC9D,QAAQ,GAAG,EAAE,CAAC;QACZ,KAAK,QAAQ;YACX,+BAA+B;YAC/B,OAAO,eAAe,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;QAC7C,KAAK,OAAO;YACV,OAAO,UAAU,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;QACxC,KAAK,SAAS;YACZ,OAAO,YAAY,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;QAC1C,KAAK,QAAQ;YACX,OAAO,WAAW,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;QACzC;YACE,OAAO,IAAI,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;IAC3C,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,SAAgB,aAAa,CAAC,OAAoB,EAAE,KAAa;IAC/D,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACrC,IAAI,CAAC,CAAC;QAAE,OAAO,OAAO,CAAC;IACvB,MAAM,MAAM,GAA0C,EAAE,CAAC;IACzD,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;QACpC,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;QACpC,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;QAC5C,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC;QACd,IAAI,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC;YAAE,IAAI,GAAG,CAAC,CAAC;aACpC,IAAI,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC;YAAE,IAAI,GAAG,CAAC,CAAC;aACzD,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;YAAE,IAAI,GAAG,CAAC,CAAC;aACrD,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;YAAE,IAAI,GAAG,CAAC,CAAC;QACrC,IAAI,IAAI,IAAI,CAAC;YAAE,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1C,CAAC;IACD,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,4BAA4B;IACpE,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAChC,CAAC"}
|
package/dist/cli/loom.d.ts
CHANGED
|
@@ -25,6 +25,7 @@
|
|
|
25
25
|
*
|
|
26
26
|
* Design rationale: docs/AESTHETIC_DESIGN.md §2.2 (方案三 · 立轴).
|
|
27
27
|
*/
|
|
28
|
+
import { type WizardStep } from "./command_args";
|
|
28
29
|
/** Truncate a styled string to a visual width, keeping ANSI sequences intact. */
|
|
29
30
|
export declare function cutVisual(s: string, maxW: number): string;
|
|
30
31
|
/** Pad a styled string with spaces to an exact visual width (truncates if over). */
|
|
@@ -168,6 +169,14 @@ export declare class LoomUI {
|
|
|
168
169
|
modeBadge: string;
|
|
169
170
|
/** User-defined slash commands shown in the palette ([name, description]). */
|
|
170
171
|
extraCommands: [string, string][];
|
|
172
|
+
/**
|
|
173
|
+
* Cascading argument wizard, active after a structured slash command is
|
|
174
|
+
* chosen (e.g. /apikey → pick provider → paste key). Resolved step-by-step
|
|
175
|
+
* via the wizardStep callback the chat loop wires up.
|
|
176
|
+
*/
|
|
177
|
+
private wizard;
|
|
178
|
+
/** Next-step resolver for the argument wizard (set by the chat loop with runtime context). */
|
|
179
|
+
wizardStep: ((command: string, prior: string[]) => WizardStep | null) | null;
|
|
171
180
|
private keypressHandler;
|
|
172
181
|
private resizeHandler;
|
|
173
182
|
constructor(opts?: LoomOpts);
|
|
@@ -194,14 +203,40 @@ export declare class LoomUI {
|
|
|
194
203
|
flash(msg: string, ms?: number): void;
|
|
195
204
|
/** Read one submitted line (the editor stays live during streaming). */
|
|
196
205
|
readInput(): Promise<string>;
|
|
197
|
-
/**
|
|
206
|
+
/**
|
|
207
|
+
* Single-key modal prompt. Resolves with the chosen choice key, the
|
|
208
|
+
* `defaultKey` on Enter, or '' on Esc. The building block for confirm and the
|
|
209
|
+
* tool-approval prompt.
|
|
210
|
+
*/
|
|
211
|
+
promptChoice(text: string, choices: {
|
|
212
|
+
key: string;
|
|
213
|
+
label: string;
|
|
214
|
+
}[], defaultKey?: string): Promise<string>;
|
|
215
|
+
/** Modal y/N confirmation. */
|
|
198
216
|
confirm(text: string): Promise<boolean>;
|
|
217
|
+
/**
|
|
218
|
+
* Tool-approval prompt with an "always allow this tool (this session)" option,
|
|
219
|
+
* the enterprise affordance that stops re-prompting for a trusted tool.
|
|
220
|
+
* Returns 'once' (approve this call), 'always' (approve + remember), or 'deny'.
|
|
221
|
+
*/
|
|
222
|
+
confirmApproval(text: string): Promise<"once" | "always" | "deny">;
|
|
199
223
|
setHistory(h: string[]): void;
|
|
200
224
|
private mouseBuf;
|
|
201
225
|
private handleMouse;
|
|
202
226
|
private onKey;
|
|
203
227
|
private handleSigint;
|
|
204
228
|
private flashHint;
|
|
229
|
+
/** Submit a turn: clear input, record history, resolve the pending read. */
|
|
230
|
+
private submitText;
|
|
231
|
+
/** Choices for the current wizard step, filtered by what the user has typed. */
|
|
232
|
+
private wizardFiltered;
|
|
233
|
+
/** Open the wizard for `command` (e.g. "/model"). Returns false if it has none. */
|
|
234
|
+
private startWizard;
|
|
235
|
+
/** Accept a value for the current step; advance to the next or submit. */
|
|
236
|
+
private wizardCommit;
|
|
237
|
+
/** Step back one level (or close the wizard when at the first level). */
|
|
238
|
+
private wizardBack;
|
|
239
|
+
private handleWizardKey;
|
|
205
240
|
private paletteMatches;
|
|
206
241
|
private cols;
|
|
207
242
|
private rows;
|
package/dist/cli/loom.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loom.d.ts","sourceRoot":"","sources":["../../src/cli/loom.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;
|
|
1
|
+
{"version":3,"file":"loom.d.ts","sourceRoot":"","sources":["../../src/cli/loom.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAMH,OAAO,EAA8C,KAAK,UAAU,EAAkB,MAAM,gBAAgB,CAAC;AAS7G,iFAAiF;AACjF,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAmBzD;AAED,oFAAoF;AACpF,wBAAgB,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAIpD;AAED,6EAA6E;AAC7E,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CA8C/D;AAMD,MAAM,WAAW,OAAO;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CAC3B;AAED,yEAAyE;AACzE,qBAAa,MAAM;IAEL,OAAO,CAAC,GAAG;IADvB,OAAO,CAAC,IAAI,CAAgB;gBACR,GAAG,EAAE,OAAO;IAEhC,oEAAoE;IACpE,UAAU;IAEV,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;CAclE;AAMD,UAAU,QAAQ;IAAG,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE;AAE1D,mFAAmF;AACnF,qBAAa,QAAQ;IAGP,OAAO,CAAC,QAAQ,CAAC,CAAC;IAF9B,SAAS,EAAE,QAAQ,EAAE,CAAM;IAC3B,OAAO,CAAC,CAAC,CAAK;gBACe,CAAC,GAAE,MAAU;IAE1C,MAAM,CAAC,CAAC,EAAE,MAAM;IAUhB,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;IAiBjC,6EAA6E;IAC7E,MAAM,CACJ,CAAC,EAAE,MAAM,EACT,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,EAAE,GAClE,MAAM,EAAE;CA6BZ;AAED,0EAA0E;AAC1E,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAYhE;AAMD;;;;GAIG;AACH,MAAM,WAAW,KAAK;IACpB,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,2DAA2D;IAC3D,KAAK,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IAC9B,6DAA6D;IAC7D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,+DAA+D;IAC/D,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;CAC7D;AAGD,wBAAgB,OAAO,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAAuC;AAMjF,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,KAAK,EAAE,MAAM,GAAG,KAAK,GAAG,IAAI,GAAG,MAAM,CAAC;IACtC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,EAAE,CAAC,EAAE,MAAM,CAAC;CACb;AAED,qBAAa,SAAS;IACpB,KAAK,wBAA+B;IACpC,KAAK,EAAE,MAAM,EAAE,CAAM;IACrB,MAAM,UAAS;IACf,kDAAkD;IAClD,QAAQ,sBAA6B;IAErC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE;IAgBf,KAAK,CAAC,EAAE,EAAE,MAAM;IAKhB,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO;IAU5B,MAAM;IAEN,aAAa,IAAI,MAAM,EAAE;IAIzB,wCAAwC;IACxC,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,OAAO,CAAA;KAAE;IAWhE,QAAQ,IAAI;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE;CAK5C;AAMD,MAAM,WAAW,QAAQ;IACvB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC;IAC/B,wCAAwC;IACxC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAaD,qBAAa,MAAM;IACjB,OAAO,CAAC,GAAG,CAAU;IACrB,OAAO,CAAC,GAAG,CAA2B;IACtC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,GAAG,CAAuB;IAClC,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,IAAI,CAA4B;IACxC,OAAO,CAAC,IAAI,CAAK;IACjB,OAAO,CAAC,KAAK,CAA+B;IAC5C,OAAO,CAAC,QAAQ,CAAU;IAC1B,OAAO,CAAC,SAAS,CAAS;IAE1B,SAAS,SAAS;IAClB,KAAK,SAAK;IACV,IAAI,UAAS;IACb,SAAS,SAAM;IACf,IAAI,YAAmB;IAEvB,gDAAgD;IAChD,WAAW,EAAE,MAAM,MAAM,CAAY;IAGrC,OAAO,CAAC,WAAW,CAAgB;IACnC,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,OAAO,CAAM;IACrB,OAAO,CAAC,SAAS,CAAM;IACvB,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,cAAc,CAAsC;IAC5D,OAAO,CAAC,KAAK,CAAgI;IAC7I,OAAO,CAAC,QAAQ,CAAK;IACrB,WAAW,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,IAAI,CAAQ;IACxC,sFAAsF;IACtF,WAAW,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,IAAI,CAAQ;IACxC,8EAA8E;IAC9E,SAAS,SAAM;IACf,8EAA8E;IAC9E,aAAa,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAM;IACvC;;;;OAIG;IACH,OAAO,CAAC,MAAM,CAAoG;IAClH,8FAA8F;IAC9F,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,UAAU,GAAG,IAAI,CAAC,GAAG,IAAI,CAAQ;IACpF,OAAO,CAAC,eAAe,CAAkD;IACzE,OAAO,CAAC,aAAa,CAA6B;gBAEtC,IAAI,CAAC,EAAE,QAAQ;IAS3B,KAAK;IAiBL,OAAO;IAYP,oEAAoE;IAC9D,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAsBlD,OAAO,CAAC,IAAI;IAeZ,KAAK;IAEL,yDAAyD;IACzD,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM;IAK9B,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;IAK/B,4EAA4E;IAC5E,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM;IAO5E,OAAO,CAAC,SAAS,CAAsB;IACvC,OAAO,CAAC,QAAQ,CAAK;IAErB,WAAW,CAAC,SAAS,EAAE,MAAM;IAS7B,6EAA6E;IAC7E,cAAc;IAMd,WAAW,CAAC,CAAC,EAAE,MAAM;IAQrB,SAAS;IAKT,aAAa;IAEb,4CAA4C;IAC5C,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,SAAO;IAQ5B,wEAAwE;IACxE,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC;IAI5B;;;;OAIG;IACH,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,EAAE,UAAU,SAAK,GAAG,OAAO,CAAC,MAAM,CAAC;IAIvG,8BAA8B;IAC9B,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAIvC;;;;OAIG;IACH,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,QAAQ,GAAG,MAAM,CAAC;IAQlE,UAAU,CAAC,CAAC,EAAE,MAAM,EAAE;IAOtB,OAAO,CAAC,QAAQ,CAAuB;IAEvC,OAAO,CAAC,WAAW;IAuBnB,OAAO,CAAC,KAAK;IAuIb,OAAO,CAAC,YAAY;IAepB,OAAO,CAAC,SAAS,CAAM;IAIvB,4EAA4E;IAC5E,OAAO,CAAC,UAAU;IAWlB,gFAAgF;IAChF,OAAO,CAAC,cAAc;IAKtB,mFAAmF;IACnF,OAAO,CAAC,WAAW;IAUnB,0EAA0E;IAC1E,OAAO,CAAC,YAAY;IAYpB,yEAAyE;IACzE,OAAO,CAAC,UAAU;IAUlB,OAAO,CAAC,eAAe;IA8BvB,OAAO,CAAC,cAAc;IAQtB,OAAO,CAAC,IAAI;IACZ,OAAO,CAAC,IAAI;IAEZ,OAAO,CAAC,KAAK;IAEb,OAAO,CAAC,WAAW;IAMnB,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,KAAK;IAgBb,OAAO,CAAC,aAAa,CAAiD;IAEtE,OAAO,CAAC,aAAa;IAqCrB,OAAO,CAAC,KAAK;IAEb,OAAO,CAAC,SAAS;IAgCjB,4EAA4E;IAC5E,KAAK,IAAI,MAAM,EAAE;CAgMlB;AAED,gFAAgF;AAChF,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAmCxE"}
|