@united-workforce/cli 0.2.1-rc.9 → 0.4.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/README.md +15 -8
- package/dist/__tests__/adapter-json-roundtrip.test.js +1 -1
- package/dist/__tests__/adapter-json-roundtrip.test.js.map +1 -1
- package/dist/__tests__/agent-resolution-llm-free.test.d.ts +2 -0
- package/dist/__tests__/agent-resolution-llm-free.test.d.ts.map +1 -0
- package/dist/__tests__/agent-resolution-llm-free.test.js +30 -0
- package/dist/__tests__/agent-resolution-llm-free.test.js.map +1 -0
- package/dist/__tests__/build-step-entry.test.d.ts +2 -0
- package/dist/__tests__/build-step-entry.test.d.ts.map +1 -0
- package/dist/__tests__/build-step-entry.test.js +173 -0
- package/dist/__tests__/build-step-entry.test.js.map +1 -0
- package/dist/__tests__/clear-thread-failed-attempts.test.d.ts +2 -0
- package/dist/__tests__/clear-thread-failed-attempts.test.d.ts.map +1 -0
- package/dist/__tests__/clear-thread-failed-attempts.test.js +93 -0
- package/dist/__tests__/clear-thread-failed-attempts.test.js.map +1 -0
- package/dist/__tests__/config.test.js +26 -302
- package/dist/__tests__/config.test.js.map +1 -1
- package/dist/__tests__/current-role.test.js +7 -6
- package/dist/__tests__/current-role.test.js.map +1 -1
- package/dist/__tests__/e2e-mock-agent.test.js +20 -23
- package/dist/__tests__/e2e-mock-agent.test.js.map +1 -1
- package/dist/__tests__/issue-180-workflow-ref-removed.test.d.ts +2 -0
- package/dist/__tests__/issue-180-workflow-ref-removed.test.d.ts.map +1 -0
- package/dist/__tests__/issue-180-workflow-ref-removed.test.js +40 -0
- package/dist/__tests__/issue-180-workflow-ref-removed.test.js.map +1 -0
- package/dist/__tests__/moderator-evaluate.test.js +9 -50
- package/dist/__tests__/moderator-evaluate.test.js.map +1 -1
- package/dist/__tests__/pid-recycling.test.d.ts +2 -0
- package/dist/__tests__/pid-recycling.test.d.ts.map +1 -0
- package/dist/__tests__/pid-recycling.test.js +271 -0
- package/dist/__tests__/pid-recycling.test.js.map +1 -0
- package/dist/__tests__/prompt.test.js +321 -0
- package/dist/__tests__/prompt.test.js.map +1 -1
- package/dist/__tests__/resolve-head-hash.test.js +4 -4
- package/dist/__tests__/resolve-head-hash.test.js.map +1 -1
- package/dist/__tests__/setup-agent-discovery.test.js +21 -30
- package/dist/__tests__/setup-agent-discovery.test.js.map +1 -1
- package/dist/__tests__/setup-complexity.test.js +2 -168
- package/dist/__tests__/setup-complexity.test.js.map +1 -1
- package/dist/__tests__/setup-no-llm.test.d.ts +2 -0
- package/dist/__tests__/setup-no-llm.test.d.ts.map +1 -0
- package/dist/__tests__/setup-no-llm.test.js +52 -0
- package/dist/__tests__/setup-no-llm.test.js.map +1 -0
- package/dist/__tests__/solve-issue-tea-worktree.test.js +24 -27
- package/dist/__tests__/solve-issue-tea-worktree.test.js.map +1 -1
- package/dist/__tests__/step-ask.test.d.ts +2 -0
- package/dist/__tests__/step-ask.test.d.ts.map +1 -0
- package/dist/__tests__/step-ask.test.js +499 -0
- package/dist/__tests__/step-ask.test.js.map +1 -0
- package/dist/__tests__/step-show-json.test.js +1 -0
- package/dist/__tests__/step-show-json.test.js.map +1 -1
- package/dist/__tests__/step-timing.test.js +2 -0
- package/dist/__tests__/step-timing.test.js.map +1 -1
- package/dist/__tests__/store-global-cas.test.js +2 -2
- package/dist/__tests__/store-global-cas.test.js.map +1 -1
- package/dist/__tests__/store-unified-threads.test.js +9 -9
- package/dist/__tests__/store-unified-threads.test.js.map +1 -1
- package/dist/__tests__/thread-cancel-status.test.js +6 -6
- package/dist/__tests__/thread-cancel-status.test.js.map +1 -1
- package/dist/__tests__/thread-list-filters.test.js +344 -9
- package/dist/__tests__/thread-list-filters.test.js.map +1 -1
- package/dist/__tests__/thread-poke.test.d.ts +2 -0
- package/dist/__tests__/thread-poke.test.d.ts.map +1 -0
- package/dist/__tests__/thread-poke.test.js +412 -0
- package/dist/__tests__/thread-poke.test.js.map +1 -0
- package/dist/__tests__/thread-resume.test.js +10 -14
- package/dist/__tests__/thread-resume.test.js.map +1 -1
- package/dist/__tests__/thread-show-status.test.js +17 -28
- package/dist/__tests__/thread-show-status.test.js.map +1 -1
- package/dist/__tests__/thread-suspend-step.test.js +8 -14
- package/dist/__tests__/thread-suspend-step.test.js.map +1 -1
- package/dist/__tests__/thread-suspended-display.test.js +10 -22
- package/dist/__tests__/thread-suspended-display.test.js.map +1 -1
- package/dist/__tests__/thread.test.js +4 -4
- package/dist/__tests__/thread.test.js.map +1 -1
- package/dist/__tests__/validate-semantic.test.js +49 -21
- package/dist/__tests__/validate-semantic.test.js.map +1 -1
- package/dist/__tests__/workflow-list-recursive.test.d.ts +2 -0
- package/dist/__tests__/workflow-list-recursive.test.d.ts.map +1 -0
- package/dist/__tests__/workflow-list-recursive.test.js +283 -0
- package/dist/__tests__/workflow-list-recursive.test.js.map +1 -0
- package/dist/__tests__/workflow-resolution.test.js +36 -21
- package/dist/__tests__/workflow-resolution.test.js.map +1 -1
- package/dist/__tests__/workflow-show-resolution.test.d.ts +2 -0
- package/dist/__tests__/workflow-show-resolution.test.d.ts.map +1 -0
- package/dist/__tests__/workflow-show-resolution.test.js +210 -0
- package/dist/__tests__/workflow-show-resolution.test.js.map +1 -0
- package/dist/__tests__/workflow-validate.test.d.ts +2 -0
- package/dist/__tests__/workflow-validate.test.d.ts.map +1 -0
- package/dist/__tests__/workflow-validate.test.js +687 -0
- package/dist/__tests__/workflow-validate.test.js.map +1 -0
- package/dist/background/background.d.ts +22 -1
- package/dist/background/background.d.ts.map +1 -1
- package/dist/background/background.js +83 -6
- package/dist/background/background.js.map +1 -1
- package/dist/background/index.d.ts +1 -1
- package/dist/background/index.d.ts.map +1 -1
- package/dist/background/index.js +1 -1
- package/dist/background/index.js.map +1 -1
- package/dist/background/types.d.ts +1 -0
- package/dist/background/types.d.ts.map +1 -1
- package/dist/cli.js +66 -31
- package/dist/cli.js.map +1 -1
- package/dist/commands/config.d.ts +3 -1
- package/dist/commands/config.d.ts.map +1 -1
- package/dist/commands/config.js +7 -33
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/prompt.d.ts.map +1 -1
- package/dist/commands/prompt.js +15 -2
- package/dist/commands/prompt.js.map +1 -1
- package/dist/commands/setup.d.ts +7 -39
- package/dist/commands/setup.d.ts.map +1 -1
- package/dist/commands/setup.js +27 -302
- package/dist/commands/setup.js.map +1 -1
- package/dist/commands/step.d.ts +44 -1
- package/dist/commands/step.d.ts.map +1 -1
- package/dist/commands/step.js +255 -11
- package/dist/commands/step.js.map +1 -1
- package/dist/commands/thread.d.ts +16 -3
- package/dist/commands/thread.d.ts.map +1 -1
- package/dist/commands/thread.js +379 -140
- package/dist/commands/thread.js.map +1 -1
- package/dist/commands/workflow.d.ts +9 -1
- package/dist/commands/workflow.d.ts.map +1 -1
- package/dist/commands/workflow.js +130 -6
- package/dist/commands/workflow.js.map +1 -1
- package/dist/moderator/__tests__/evaluate.test.js +31 -17
- package/dist/moderator/__tests__/evaluate.test.js.map +1 -1
- package/dist/moderator/evaluate.d.ts.map +1 -1
- package/dist/moderator/evaluate.js +4 -16
- package/dist/moderator/evaluate.js.map +1 -1
- package/dist/moderator/index.d.ts +1 -2
- package/dist/moderator/index.d.ts.map +1 -1
- package/dist/moderator/index.js +0 -1
- package/dist/moderator/index.js.map +1 -1
- package/dist/moderator/types.d.ts +6 -10
- package/dist/moderator/types.d.ts.map +1 -1
- package/dist/moderator/types.js +1 -3
- package/dist/moderator/types.js.map +1 -1
- package/dist/schemas.d.ts +2 -0
- package/dist/schemas.d.ts.map +1 -1
- package/dist/schemas.js +5 -3
- package/dist/schemas.js.map +1 -1
- package/dist/store.d.ts +28 -9
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +75 -16
- package/dist/store.js.map +1 -1
- package/dist/validate-semantic.d.ts.map +1 -1
- package/dist/validate-semantic.js +83 -66
- package/dist/validate-semantic.js.map +1 -1
- package/dist/validate.d.ts +6 -0
- package/dist/validate.d.ts.map +1 -1
- package/dist/validate.js +24 -0
- package/dist/validate.js.map +1 -1
- package/package.json +8 -10
- package/src/__tests__/adapter-json-roundtrip.test.ts +1 -1
- package/src/__tests__/agent-resolution-llm-free.test.ts +39 -0
- package/src/__tests__/build-step-entry.test.ts +203 -0
- package/src/__tests__/clear-thread-failed-attempts.test.ts +122 -0
- package/src/__tests__/config.test.ts +33 -321
- package/src/__tests__/current-role.test.ts +7 -6
- package/src/__tests__/e2e-mock-agent.test.ts +20 -23
- package/src/__tests__/fixtures/e2e-count.workflow.yaml +1 -0
- package/src/__tests__/fixtures/e2e-linear.workflow.yaml +1 -0
- package/src/__tests__/fixtures/{e2e-mustache.workflow.yaml → e2e-liquid.workflow.yaml} +3 -2
- package/src/__tests__/fixtures/e2e-loop.workflow.yaml +1 -0
- package/src/__tests__/fixtures/e2e-suspend.mock.yaml +2 -2
- package/src/__tests__/fixtures/e2e-suspend.workflow.yaml +6 -10
- package/src/__tests__/issue-180-workflow-ref-removed.test.ts +43 -0
- package/src/__tests__/moderator-evaluate.test.ts +9 -52
- package/src/__tests__/pid-recycling.test.ts +328 -0
- package/src/__tests__/prompt.test.ts +397 -0
- package/src/__tests__/resolve-head-hash.test.ts +4 -4
- package/src/__tests__/setup-agent-discovery.test.ts +26 -51
- package/src/__tests__/setup-complexity.test.ts +1 -203
- package/src/__tests__/setup-no-llm.test.ts +68 -0
- package/src/__tests__/solve-issue-tea-worktree.test.ts +24 -30
- package/src/__tests__/step-ask.test.ts +670 -0
- package/src/__tests__/step-show-json.test.ts +1 -0
- package/src/__tests__/step-timing.test.ts +2 -0
- package/src/__tests__/store-global-cas.test.ts +2 -2
- package/src/__tests__/store-unified-threads.test.ts +9 -9
- package/src/__tests__/thread-cancel-status.test.ts +6 -6
- package/src/__tests__/thread-list-filters.test.ts +434 -8
- package/src/__tests__/thread-poke.test.ts +545 -0
- package/src/__tests__/thread-resume.test.ts +10 -14
- package/src/__tests__/thread-show-status.test.ts +17 -29
- package/src/__tests__/thread-suspend-step.test.ts +8 -14
- package/src/__tests__/thread-suspended-display.test.ts +10 -22
- package/src/__tests__/thread.test.ts +4 -4
- package/src/__tests__/validate-semantic.test.ts +59 -31
- package/src/__tests__/workflow-list-recursive.test.ts +370 -0
- package/src/__tests__/workflow-resolution.test.ts +39 -21
- package/src/__tests__/workflow-show-resolution.test.ts +285 -0
- package/src/__tests__/workflow-validate.test.ts +806 -0
- package/src/background/background.ts +88 -6
- package/src/background/index.ts +2 -0
- package/src/background/types.ts +1 -0
- package/src/cli.ts +97 -47
- package/src/commands/config.ts +7 -35
- package/src/commands/prompt.ts +15 -2
- package/src/commands/setup.ts +29 -357
- package/src/commands/step.ts +339 -12
- package/src/commands/thread.ts +463 -169
- package/src/commands/workflow.ts +159 -4
- package/src/moderator/__tests__/evaluate.test.ts +34 -17
- package/src/moderator/evaluate.ts +5 -17
- package/src/moderator/index.ts +1 -6
- package/src/moderator/types.ts +6 -14
- package/src/schemas.ts +13 -3
- package/src/store.ts +86 -20
- package/src/validate-semantic.ts +109 -78
- package/src/validate.ts +27 -0
- package/dist/__tests__/setup-validate.test.d.ts +0 -2
- package/dist/__tests__/setup-validate.test.d.ts.map +0 -1
- package/dist/__tests__/setup-validate.test.js +0 -108
- package/dist/__tests__/setup-validate.test.js.map +0 -1
- package/src/__tests__/setup-validate.test.ts +0 -148
- /package/src/__tests__/fixtures/{e2e-mustache.mock.yaml → e2e-liquid.mock.yaml} +0 -0
package/dist/commands/config.js
CHANGED
|
@@ -2,17 +2,11 @@ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
|
2
2
|
import { join } from "node:path";
|
|
3
3
|
import { parse, stringify } from "yaml";
|
|
4
4
|
/**
|
|
5
|
-
* Valid configuration key schema
|
|
5
|
+
* Valid configuration key schema. Engine config is LLM-free — providers,
|
|
6
|
+
* models, defaultModel, and modelOverrides are no longer accepted here.
|
|
7
|
+
* Each adapter owns its own LLM configuration.
|
|
6
8
|
*/
|
|
7
9
|
const VALID_CONFIG_KEYS = {
|
|
8
|
-
providers: {
|
|
9
|
-
nested: true,
|
|
10
|
-
knownFields: ["baseUrl", "apiKey"],
|
|
11
|
-
},
|
|
12
|
-
models: {
|
|
13
|
-
nested: true,
|
|
14
|
-
knownFields: ["provider", "name"],
|
|
15
|
-
},
|
|
16
10
|
agents: {
|
|
17
11
|
nested: true,
|
|
18
12
|
knownFields: ["command", "args"],
|
|
@@ -22,14 +16,7 @@ const VALID_CONFIG_KEYS = {
|
|
|
22
16
|
// agentOverrides.<workflowName>.<roleName> = agentAlias (string value)
|
|
23
17
|
// No knownFields — workflow/role names are user-defined
|
|
24
18
|
},
|
|
25
|
-
modelOverrides: {
|
|
26
|
-
nested: true,
|
|
27
|
-
minDepth: 2,
|
|
28
|
-
// modelOverrides.<scenario> = modelAlias (string value)
|
|
29
|
-
// No knownFields — scenarios are user-defined
|
|
30
|
-
},
|
|
31
19
|
defaultAgent: { nested: false },
|
|
32
|
-
defaultModel: { nested: false },
|
|
33
20
|
};
|
|
34
21
|
/**
|
|
35
22
|
* Validate a config key path against the known schema
|
|
@@ -149,25 +136,12 @@ export function setNestedValue(obj, path, value) {
|
|
|
149
136
|
current[lastSegment] = value;
|
|
150
137
|
}
|
|
151
138
|
/**
|
|
152
|
-
* Deep clone
|
|
139
|
+
* Deep clone the config. Engine config is LLM-free, so there are no apiKey
|
|
140
|
+
* fields to mask — this function is preserved as a defensive deep-clone
|
|
141
|
+
* boundary used by `cmdConfigList`.
|
|
153
142
|
*/
|
|
154
143
|
export function maskApiKeys(config) {
|
|
155
|
-
|
|
156
|
-
const cloned = JSON.parse(JSON.stringify(config));
|
|
157
|
-
// Mask apiKey values in providers
|
|
158
|
-
if (cloned.providers && typeof cloned.providers === "object") {
|
|
159
|
-
const providers = cloned.providers;
|
|
160
|
-
for (const providerName of Object.keys(providers)) {
|
|
161
|
-
const provider = providers[providerName];
|
|
162
|
-
if (provider && typeof provider === "object") {
|
|
163
|
-
const providerObj = provider;
|
|
164
|
-
if ("apiKey" in providerObj) {
|
|
165
|
-
providerObj.apiKey = "***MASKED***";
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
return cloned;
|
|
144
|
+
return JSON.parse(JSON.stringify(config));
|
|
171
145
|
}
|
|
172
146
|
/**
|
|
173
147
|
* List all configuration values (masks API keys)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAExC
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../../src/commands/prompt.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,kCAAkC,EAClC,sBAAsB,EACtB,kCAAkC,EACnC,MAAM,wBAAwB,CAAC;AAyBhC,OAAO,EACL,kCAAkC,IAAI,0BAA0B,EAChE,sBAAsB,IAAI,cAAc,EACxC,kCAAkC,IAAI,0BAA0B,GACjE,CAAC;AAQF,wBAAgB,aAAa,IAAI,aAAa,CAAC,MAAM,CAAC,CAErD;AAED,wBAAgB,kBAAkB,IAAI,MAAM,
|
|
1
|
+
{"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../../src/commands/prompt.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,kCAAkC,EAClC,sBAAsB,EACtB,kCAAkC,EACnC,MAAM,wBAAwB,CAAC;AAyBhC,OAAO,EACL,kCAAkC,IAAI,0BAA0B,EAChE,sBAAsB,IAAI,cAAc,EACxC,kCAAkC,IAAI,0BAA0B,GACjE,CAAC;AAQF,wBAAgB,aAAa,IAAI,aAAa,CAAC,MAAM,CAAC,CAErD;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CAsS3C"}
|
package/dist/commands/prompt.js
CHANGED
|
@@ -226,7 +226,17 @@ uwf thread exec <thread-id>
|
|
|
226
226
|
uwf thread show <thread-id>
|
|
227
227
|
\`\`\`
|
|
228
228
|
|
|
229
|
-
If the thread reaches \`$END\` with status \`
|
|
229
|
+
If the thread reaches \`$END\` with status \`end\`, the setup is working.
|
|
230
|
+
|
|
231
|
+
To verify suspend/resume and poke:
|
|
232
|
+
|
|
233
|
+
\`\`\`bash
|
|
234
|
+
# After a role yields with $status: "$SUSPEND", resume the suspended thread:
|
|
235
|
+
uwf thread resume <thread-id> -p "Additional context for the agent"
|
|
236
|
+
|
|
237
|
+
# Re-run the head step's agent with a supplementary prompt (replaces head step):
|
|
238
|
+
uwf thread poke <thread-id> -p "Try again with this hint"
|
|
239
|
+
\`\`\`
|
|
230
240
|
|
|
231
241
|
## Scenario B: Upgrade from Previous Version
|
|
232
242
|
|
|
@@ -282,7 +292,7 @@ Check the changelog for breaking changes. Known migrations:
|
|
|
282
292
|
resume: { role: planner, prompt: "Review previous run and continue." }
|
|
283
293
|
\`\`\`
|
|
284
294
|
|
|
285
|
-
Update all \`.
|
|
295
|
+
Update all \`.workflows/\` and \`.workflow/\` YAML files in your projects. \`uwf workflow add\` will reject files with the old \`_\` syntax.
|
|
286
296
|
|
|
287
297
|
- **v0.2.1**: \`$status: { enum: [value] }\` → \`$status: { const: "value" }\`. The validator no longer accepts \`enum\` for \`$status\`. Update all workflow YAML files:
|
|
288
298
|
\`\`\`yaml
|
|
@@ -295,6 +305,9 @@ Update all \`.workflow/\` and \`.workflows/\` YAML files in your projects. \`uwf
|
|
|
295
305
|
# For multi-exit, use oneOf with const (unchanged)
|
|
296
306
|
\`\`\`
|
|
297
307
|
|
|
308
|
+
- **v0.4.0**: Thread status \`completed\` → \`end\`. Update scripts that filter \`--status completed\` to use \`--status end\`. Legacy on-disk \`status: completed\` is normalized to \`end\` on read.
|
|
309
|
+
- **v0.4.0**: \`$SUSPEND\` is now an engine-level coroutine yield, not a graph target. Workflows that routed to \`role: "$SUSPEND"\` must emit \`$status: "$SUSPEND"\` with a \`reason\` from the role output instead. The thread becomes \`suspended\`; continue with \`uwf thread resume\`.
|
|
310
|
+
|
|
298
311
|
### Step 4 — Verify
|
|
299
312
|
|
|
300
313
|
\`\`\`bash
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/commands/prompt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EACL,kCAAkC,EAClC,sBAAsB,EACtB,kCAAkC,GACnC,MAAM,wBAAwB,CAAC;AAEhC,yEAAyE;AACzE,2FAA2F;AAC3F,SAAS,eAAe;IACtB,IAAI,GAAG,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAClD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;QAC5C,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAGtD,CAAC;YACF,IAAI,GAAG,CAAC,IAAI,KAAK,uBAAuB,EAAE,CAAC;gBACzC,OAAO,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC;YAChC,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,0BAA0B;QAC5B,CAAC;QACD,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IACrB,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AACD,MAAM,WAAW,GAAG,eAAe,EAAE,CAAC;AAEtC,OAAO,EACL,kCAAkC,IAAI,0BAA0B,EAChE,sBAAsB,IAAI,cAAc,EACxC,kCAAkC,IAAI,0BAA0B,GACjE,CAAC;AAEF,MAAM,cAAc,GAA4D;IAC9E,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,sBAAsB,EAAE;IACnD,EAAE,IAAI,EAAE,oBAAoB,EAAE,QAAQ,EAAE,kCAAkC,EAAE;IAC5E,EAAE,IAAI,EAAE,oBAAoB,EAAE,QAAQ,EAAE,kCAAkC,EAAE;CAC7E,CAAC;AAEF,MAAM,UAAU,aAAa;IAC3B,OAAO,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;wCAwE+B,WAAW
|
|
1
|
+
{"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/commands/prompt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EACL,kCAAkC,EAClC,sBAAsB,EACtB,kCAAkC,GACnC,MAAM,wBAAwB,CAAC;AAEhC,yEAAyE;AACzE,2FAA2F;AAC3F,SAAS,eAAe;IACtB,IAAI,GAAG,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAClD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;QAC5C,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAGtD,CAAC;YACF,IAAI,GAAG,CAAC,IAAI,KAAK,uBAAuB,EAAE,CAAC;gBACzC,OAAO,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC;YAChC,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,0BAA0B;QAC5B,CAAC;QACD,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IACrB,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AACD,MAAM,WAAW,GAAG,eAAe,EAAE,CAAC;AAEtC,OAAO,EACL,kCAAkC,IAAI,0BAA0B,EAChE,sBAAsB,IAAI,cAAc,EACxC,kCAAkC,IAAI,0BAA0B,GACjE,CAAC;AAEF,MAAM,cAAc,GAA4D;IAC9E,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,sBAAsB,EAAE;IACnD,EAAE,IAAI,EAAE,oBAAoB,EAAE,QAAQ,EAAE,kCAAkC,EAAE;IAC5E,EAAE,IAAI,EAAE,oBAAoB,EAAE,QAAQ,EAAE,kCAAkC,EAAE;CAC7E,CAAC;AAEF,MAAM,UAAU,aAAa;IAC3B,OAAO,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;wCAwE+B,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iCAmJlB,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyE3C,CAAC;AACF,CAAC"}
|
package/dist/commands/setup.d.ts
CHANGED
|
@@ -1,18 +1,6 @@
|
|
|
1
1
|
import { createInterface } from "node:readline/promises";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
* Send a minimal chat completion request to verify the model is reachable.
|
|
5
|
-
* Returns ok on 2xx, error with reason string otherwise.
|
|
6
|
-
*/
|
|
7
|
-
export declare function validateModel(baseUrl: string, apiKey: string, model: string): Promise<Result<void, string>>;
|
|
8
|
-
/** Look up the base URL for a preset provider name. Returns null if not a preset. */
|
|
9
|
-
export declare function resolvePresetBaseUrl(providerName: string): string | null;
|
|
10
|
-
type SetupArgs = {
|
|
11
|
-
provider: string;
|
|
12
|
-
baseUrl: string;
|
|
13
|
-
apiKey: string;
|
|
14
|
-
model: string;
|
|
15
|
-
agent?: string | undefined;
|
|
2
|
+
export type SetupArgs = {
|
|
3
|
+
agent: string;
|
|
16
4
|
storageRoot: string;
|
|
17
5
|
};
|
|
18
6
|
/**
|
|
@@ -32,22 +20,6 @@ export declare function _discoverAgents(): Promise<string[]>;
|
|
|
32
20
|
export declare function _isTerminator(c: string): boolean;
|
|
33
21
|
/** Returns true for DEL or backspace. */
|
|
34
22
|
export declare function _isBackspace(c: string): boolean;
|
|
35
|
-
type ProviderEntry = {
|
|
36
|
-
name: string;
|
|
37
|
-
label: string;
|
|
38
|
-
baseUrl: string;
|
|
39
|
-
};
|
|
40
|
-
/** Prints the numbered provider list and custom option to stdout. */
|
|
41
|
-
export declare function _printProviderMenu(providers: readonly ProviderEntry[]): void;
|
|
42
|
-
/** Resolves a numeric choice string to a preset provider, or null for custom/invalid. */
|
|
43
|
-
export declare function _resolveProviderChoice(choice: string, providers: readonly ProviderEntry[]): {
|
|
44
|
-
providerName: string;
|
|
45
|
-
baseUrl: string;
|
|
46
|
-
} | null;
|
|
47
|
-
/** Resolves numeric index or literal model name to a model string. */
|
|
48
|
-
export declare function _resolveModelChoice(input: string, models: string[]): string;
|
|
49
|
-
/** Prints the multi-column model list to stdout. */
|
|
50
|
-
export declare function _printModelMenu(models: string[], termCols: number): void;
|
|
51
23
|
/** Extract short agent name from binary name: uwf-claude-code → claude-code */
|
|
52
24
|
export declare function _agentNameFromBinary(binary: string): string;
|
|
53
25
|
/** Prints numbered agent list to stdout. */
|
|
@@ -57,24 +29,20 @@ export declare function _printAgentMenu(agents: string[]): void;
|
|
|
57
29
|
* Returns short agent name (e.g. "hermes", "claude-code").
|
|
58
30
|
*/
|
|
59
31
|
export declare function _promptAgentSelection(rl: ReturnType<typeof createInterface>): Promise<string>;
|
|
60
|
-
type ValidationResult = {
|
|
61
|
-
ok: boolean;
|
|
62
|
-
error: string | null;
|
|
63
|
-
};
|
|
64
|
-
/** Prints the model validation result to stdout. */
|
|
65
|
-
export declare function _printValidationResult(validation: ValidationResult): void;
|
|
66
32
|
/**
|
|
67
33
|
* Check if the configured adapter binary (and its dependencies) are in PATH.
|
|
68
34
|
* Returns warnings array — empty means all good.
|
|
69
35
|
*/
|
|
70
36
|
export declare function _checkAdapterAvailability(agentName: string): string[];
|
|
71
37
|
/**
|
|
72
|
-
* Non-interactive setup.
|
|
38
|
+
* Non-interactive setup. Engine config is LLM-free — only writes
|
|
39
|
+
* agents + defaultAgent. LLM provider/model configuration lives in
|
|
40
|
+
* config.yaml under `providers` and `models`.
|
|
73
41
|
*/
|
|
74
42
|
export declare function cmdSetup(args: SetupArgs): Promise<Record<string, unknown>>;
|
|
75
43
|
/**
|
|
76
|
-
* Interactive setup — prompts user for
|
|
44
|
+
* Interactive setup — prompts the user only for the default agent. LLM
|
|
45
|
+
* configuration lives in config.yaml under `providers` and `models`.
|
|
77
46
|
*/
|
|
78
47
|
export declare function cmdSetupInteractive(storageRoot: string): Promise<Record<string, unknown>>;
|
|
79
|
-
export {};
|
|
80
48
|
//# sourceMappingURL=setup.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/commands/setup.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/commands/setup.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAGzD,MAAM,MAAM,SAAS,GAAG;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AA2BF;;GAEG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAQxE;AA0BD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAWxD;AAED;;;GAGG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAQzD;AAkBD,+DAA+D;AAC/D,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAEhD;AAED,yCAAyC;AACzC,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAE/C;AAcD,+EAA+E;AAC/E,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAE3D;AAED,4CAA4C;AAC5C,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAStD;AAED;;;GAGG;AACH,wBAAsB,qBAAqB,CACzC,EAAE,EAAE,UAAU,CAAC,OAAO,eAAe,CAAC,GACrC,OAAO,CAAC,MAAM,CAAC,CAoCjB;AA+BD;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,CAyBrE;AAED;;;;GAIG;AACH,wBAAsB,QAAQ,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CA0BhF;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAsB/F"}
|
package/dist/commands/setup.js
CHANGED
|
@@ -4,73 +4,6 @@ import { join } from "node:path";
|
|
|
4
4
|
import { stdin as input, stdout as output } from "node:process";
|
|
5
5
|
import { createInterface } from "node:readline/promises";
|
|
6
6
|
import { parse, stringify } from "yaml";
|
|
7
|
-
/**
|
|
8
|
-
* Send a minimal chat completion request to verify the model is reachable.
|
|
9
|
-
* Returns ok on 2xx, error with reason string otherwise.
|
|
10
|
-
*/
|
|
11
|
-
export async function validateModel(baseUrl, apiKey, model) {
|
|
12
|
-
try {
|
|
13
|
-
const url = `${baseUrl.replace(/\/+$/, "")}/chat/completions`;
|
|
14
|
-
const res = await fetch(url, {
|
|
15
|
-
method: "POST",
|
|
16
|
-
headers: {
|
|
17
|
-
Authorization: `Bearer ${apiKey}`,
|
|
18
|
-
"Content-Type": "application/json",
|
|
19
|
-
},
|
|
20
|
-
body: JSON.stringify({
|
|
21
|
-
model,
|
|
22
|
-
messages: [{ role: "user", content: "hi" }],
|
|
23
|
-
max_tokens: 1,
|
|
24
|
-
}),
|
|
25
|
-
signal: AbortSignal.timeout(15_000),
|
|
26
|
-
});
|
|
27
|
-
if (!res.ok) {
|
|
28
|
-
return { ok: false, error: `HTTP ${res.status} ${res.statusText}` };
|
|
29
|
-
}
|
|
30
|
-
return { ok: true, value: undefined };
|
|
31
|
-
}
|
|
32
|
-
catch (err) {
|
|
33
|
-
if (err instanceof DOMException && err.name === "AbortError") {
|
|
34
|
-
return { ok: false, error: "Request timed out — model endpoint unreachable" };
|
|
35
|
-
}
|
|
36
|
-
return { ok: false, error: `Network error — could not reach endpoint (${String(err)})` };
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
/**
|
|
40
|
-
* Preset provider list — embedded to avoid runtime YAML loading dependency.
|
|
41
|
-
* Keep in sync with providers.yaml in cli.
|
|
42
|
-
*/
|
|
43
|
-
const PRESET_PROVIDERS = [
|
|
44
|
-
// International
|
|
45
|
-
{ name: "openai", label: "OpenAI", baseUrl: "https://api.openai.com/v1" },
|
|
46
|
-
{ name: "xai", label: "xAI", baseUrl: "https://api.x.ai/v1" },
|
|
47
|
-
{ name: "openrouter", label: "OpenRouter", baseUrl: "https://openrouter.ai/api/v1" },
|
|
48
|
-
{ name: "venice", label: "Venice", baseUrl: "https://api.venice.ai/api/v1" },
|
|
49
|
-
// China
|
|
50
|
-
{
|
|
51
|
-
name: "dashscope",
|
|
52
|
-
label: "DashScope (Alibaba)",
|
|
53
|
-
baseUrl: "https://dashscope.aliyuncs.com/compatible-mode/v1",
|
|
54
|
-
},
|
|
55
|
-
{ name: "deepseek", label: "DeepSeek", baseUrl: "https://api.deepseek.com/v1" },
|
|
56
|
-
{ name: "siliconflow", label: "SiliconFlow", baseUrl: "https://api.siliconflow.cn/v1" },
|
|
57
|
-
{
|
|
58
|
-
name: "volcengine",
|
|
59
|
-
label: "Volcengine (ByteDance)",
|
|
60
|
-
baseUrl: "https://ark.cn-beijing.volces.com/api/v3",
|
|
61
|
-
},
|
|
62
|
-
{ name: "kimi", label: "Kimi (Moonshot)", baseUrl: "https://api.moonshot.cn/v1" },
|
|
63
|
-
{ name: "glm", label: "GLM (Zhipu AI)", baseUrl: "https://open.bigmodel.cn/api/paas/v4" },
|
|
64
|
-
{ name: "stepfun", label: "StepFun", baseUrl: "https://api.stepfun.com/v1" },
|
|
65
|
-
{ name: "minimax", label: "MiniMax", baseUrl: "https://api.minimax.io/v1" },
|
|
66
|
-
// Local
|
|
67
|
-
{ name: "ollama", label: "Ollama (local)", baseUrl: "http://localhost:11434/v1" },
|
|
68
|
-
];
|
|
69
|
-
/** Look up the base URL for a preset provider name. Returns null if not a preset. */
|
|
70
|
-
export function resolvePresetBaseUrl(providerName) {
|
|
71
|
-
const preset = PRESET_PROVIDERS.find((p) => p.name === providerName);
|
|
72
|
-
return preset !== undefined ? preset.baseUrl : null;
|
|
73
|
-
}
|
|
74
7
|
function getConfigPath(root) {
|
|
75
8
|
return join(root, "config.yaml");
|
|
76
9
|
}
|
|
@@ -178,66 +111,15 @@ async function _tryWhichDiscovery() {
|
|
|
178
111
|
}
|
|
179
112
|
}
|
|
180
113
|
// ──────────────────────────────────────────────────────────────────────────────
|
|
181
|
-
//
|
|
114
|
+
// Terminator/backspace helpers (kept for reuse + test coverage)
|
|
182
115
|
// ──────────────────────────────────────────────────────────────────────────────
|
|
183
116
|
/** Returns true for newline, carriage return, or EOF (EOT). */
|
|
184
117
|
export function _isTerminator(c) {
|
|
185
|
-
return c === "\n" || c === "\r" || c === "
|
|
118
|
+
return c === "\n" || c === "\r" || c === "\u0004";
|
|
186
119
|
}
|
|
187
120
|
/** Returns true for DEL or backspace. */
|
|
188
121
|
export function _isBackspace(c) {
|
|
189
|
-
return c === "
|
|
190
|
-
}
|
|
191
|
-
/** Prints the numbered provider list and custom option to stdout. */
|
|
192
|
-
export function _printProviderMenu(providers) {
|
|
193
|
-
const numWidth = String(providers.length + 1).length;
|
|
194
|
-
for (let i = 0; i < providers.length; i++) {
|
|
195
|
-
const p = providers[i];
|
|
196
|
-
if (!p)
|
|
197
|
-
continue;
|
|
198
|
-
const num = String(i + 1).padStart(numWidth);
|
|
199
|
-
console.log(` ${num}) ${p.label.padEnd(28)} ${p.baseUrl}`);
|
|
200
|
-
}
|
|
201
|
-
const customNum = String(providers.length + 1).padStart(numWidth);
|
|
202
|
-
console.log(` ${customNum}) Custom (enter name and URL manually)\n`);
|
|
203
|
-
}
|
|
204
|
-
/** Resolves a numeric choice string to a preset provider, or null for custom/invalid. */
|
|
205
|
-
export function _resolveProviderChoice(choice, providers) {
|
|
206
|
-
const n = Number.parseInt(choice, 10);
|
|
207
|
-
if (Number.isNaN(n) || n < 1 || n > providers.length)
|
|
208
|
-
return null;
|
|
209
|
-
const p = providers[n - 1];
|
|
210
|
-
if (!p)
|
|
211
|
-
return null;
|
|
212
|
-
return { providerName: p.name, baseUrl: p.baseUrl };
|
|
213
|
-
}
|
|
214
|
-
/** Resolves numeric index or literal model name to a model string. */
|
|
215
|
-
export function _resolveModelChoice(input, models) {
|
|
216
|
-
const n = Number.parseInt(input, 10);
|
|
217
|
-
if (!Number.isNaN(n) && n >= 1 && n <= models.length) {
|
|
218
|
-
return models[n - 1] ?? input;
|
|
219
|
-
}
|
|
220
|
-
return input;
|
|
221
|
-
}
|
|
222
|
-
/** Prints the multi-column model list to stdout. */
|
|
223
|
-
export function _printModelMenu(models, termCols) {
|
|
224
|
-
const nw = String(models.length).length;
|
|
225
|
-
const maxLen = models.reduce((m, s) => Math.max(m, s.length), 0);
|
|
226
|
-
const colWidth = nw + 2 + maxLen + 4;
|
|
227
|
-
const cols = Math.max(1, Math.floor(termCols / colWidth));
|
|
228
|
-
const rows = Math.ceil(models.length / cols);
|
|
229
|
-
for (let r = 0; r < rows; r++) {
|
|
230
|
-
let line = "";
|
|
231
|
-
for (let c = 0; c < cols; c++) {
|
|
232
|
-
const idx = c * rows + r;
|
|
233
|
-
if (idx >= models.length)
|
|
234
|
-
break;
|
|
235
|
-
const num = String(idx + 1).padStart(nw);
|
|
236
|
-
const name = (models[idx] ?? "").padEnd(maxLen);
|
|
237
|
-
line += ` ${num}) ${name} `;
|
|
238
|
-
}
|
|
239
|
-
console.log(line.trimEnd());
|
|
240
|
-
}
|
|
122
|
+
return c === "\u007f" || c === "\b";
|
|
241
123
|
}
|
|
242
124
|
// ──────────────────────────────────────────────────────────────────────────────
|
|
243
125
|
// Agent selection prompt
|
|
@@ -302,45 +184,28 @@ export async function _promptAgentSelection(rl) {
|
|
|
302
184
|
console.log(` → ${name}\n`);
|
|
303
185
|
return name;
|
|
304
186
|
}
|
|
305
|
-
/** Prints the model validation result to stdout. */
|
|
306
|
-
export function _printValidationResult(validation) {
|
|
307
|
-
if (validation.ok) {
|
|
308
|
-
console.log("✓ Model verified — connection successful.\n");
|
|
309
|
-
}
|
|
310
|
-
else {
|
|
311
|
-
console.log(`\n⚠ Warning: Could not reach model — ${validation.error}`);
|
|
312
|
-
console.log(" Config saved, but you may want to try a different model or check your API key.\n");
|
|
313
|
-
}
|
|
314
|
-
}
|
|
315
187
|
// ──────────────────────────────────────────────────────────────────────────────
|
|
316
188
|
/**
|
|
317
|
-
* Merge setup args into config.yaml structure. Non-destructive — preserves
|
|
189
|
+
* Merge setup args into config.yaml structure. Non-destructive — preserves
|
|
190
|
+
* existing entries (including agentOverrides). Engine config is LLM-free, so
|
|
191
|
+
* legacy provider/model fields are dropped on rewrite.
|
|
318
192
|
*/
|
|
319
193
|
function mergeConfig(existing, args) {
|
|
320
|
-
const providers = (typeof existing.providers === "object" && existing.providers !== null
|
|
321
|
-
? { ...existing.providers }
|
|
322
|
-
: {});
|
|
323
|
-
providers[args.provider] = { baseUrl: args.baseUrl, apiKey: args.apiKey };
|
|
324
|
-
const models = (typeof existing.models === "object" && existing.models !== null
|
|
325
|
-
? { ...existing.models }
|
|
326
|
-
: {});
|
|
327
|
-
models.default = { provider: args.provider, name: args.model };
|
|
328
194
|
const agents = (typeof existing.agents === "object" && existing.agents !== null
|
|
329
195
|
? { ...existing.agents }
|
|
330
196
|
: {});
|
|
331
|
-
const agentName = _agentNameFromBinary(args.agent
|
|
332
|
-
// Ensure the selected agent has an entry
|
|
197
|
+
const agentName = _agentNameFromBinary(args.agent);
|
|
333
198
|
if (!agents[agentName]) {
|
|
334
199
|
agents[agentName] = { command: `uwf-${agentName}`, args: [] };
|
|
335
200
|
}
|
|
336
|
-
|
|
337
|
-
...existing,
|
|
338
|
-
providers,
|
|
339
|
-
models,
|
|
201
|
+
const merged = {
|
|
340
202
|
agents,
|
|
341
203
|
defaultAgent: agentName,
|
|
342
|
-
defaultModel: existing.defaultModel ?? "default",
|
|
343
204
|
};
|
|
205
|
+
if (existing.agentOverrides !== undefined) {
|
|
206
|
+
merged.agentOverrides = existing.agentOverrides;
|
|
207
|
+
}
|
|
208
|
+
return merged;
|
|
344
209
|
}
|
|
345
210
|
/**
|
|
346
211
|
* Check if the configured adapter binary (and its dependencies) are in PATH.
|
|
@@ -368,7 +233,9 @@ export function _checkAdapterAvailability(agentName) {
|
|
|
368
233
|
return warnings;
|
|
369
234
|
}
|
|
370
235
|
/**
|
|
371
|
-
* Non-interactive setup.
|
|
236
|
+
* Non-interactive setup. Engine config is LLM-free — only writes
|
|
237
|
+
* agents + defaultAgent. LLM provider/model configuration lives in
|
|
238
|
+
* config.yaml under `providers` and `models`.
|
|
372
239
|
*/
|
|
373
240
|
export async function cmdSetup(args) {
|
|
374
241
|
const { storageRoot } = args;
|
|
@@ -379,178 +246,36 @@ export async function cmdSetup(args) {
|
|
|
379
246
|
writeFileSync(configPath, stringify(merged, { indent: 2 }), "utf8");
|
|
380
247
|
// Print config path to stderr (stdout is reserved for JSON output)
|
|
381
248
|
console.error(`Config saved to ${configPath} ✓`);
|
|
382
|
-
// Validate model connectivity
|
|
383
|
-
const validation = await validateModel(args.baseUrl, args.apiKey, args.model);
|
|
384
249
|
// Check adapter availability
|
|
385
|
-
const agentName = _agentNameFromBinary(args.agent
|
|
250
|
+
const agentName = _agentNameFromBinary(args.agent);
|
|
386
251
|
const adapterWarnings = _checkAdapterAvailability(agentName);
|
|
387
252
|
for (const w of adapterWarnings) {
|
|
388
253
|
console.error(`⚠ ${w}`);
|
|
389
254
|
}
|
|
390
255
|
return {
|
|
391
256
|
configPath,
|
|
392
|
-
provider: args.provider,
|
|
393
|
-
model: args.model,
|
|
394
257
|
defaultAgent: merged.defaultAgent,
|
|
395
|
-
validation,
|
|
396
258
|
adapterWarnings,
|
|
397
259
|
};
|
|
398
260
|
}
|
|
399
|
-
function _handleSecretTerminator(state) {
|
|
400
|
-
if (process.stdin.isTTY)
|
|
401
|
-
process.stdin.setRawMode(state.rawWasSet);
|
|
402
|
-
process.stdin.pause();
|
|
403
|
-
process.stdin.removeListener("data", state.onData);
|
|
404
|
-
process.stdout.write("\n");
|
|
405
|
-
state.resolve(state.buf.trim());
|
|
406
|
-
}
|
|
407
|
-
function _handleSecretBackspace(state) {
|
|
408
|
-
if (state.buf.length > 0) {
|
|
409
|
-
state.buf = state.buf.slice(0, -1);
|
|
410
|
-
process.stdout.write("\b \b");
|
|
411
|
-
}
|
|
412
|
-
}
|
|
413
|
-
function _handleSecretChar(c, state) {
|
|
414
|
-
if (_isTerminator(c)) {
|
|
415
|
-
_handleSecretTerminator(state);
|
|
416
|
-
return true;
|
|
417
|
-
}
|
|
418
|
-
if (_isBackspace(c)) {
|
|
419
|
-
_handleSecretBackspace(state);
|
|
420
|
-
return false;
|
|
421
|
-
}
|
|
422
|
-
if (c === "") {
|
|
423
|
-
if (process.stdin.isTTY)
|
|
424
|
-
process.stdin.setRawMode(state.rawWasSet);
|
|
425
|
-
process.exit(130);
|
|
426
|
-
}
|
|
427
|
-
state.buf += c;
|
|
428
|
-
process.stdout.write("*");
|
|
429
|
-
return false;
|
|
430
|
-
}
|
|
431
|
-
/** Read a line with terminal echo disabled (for secrets). */
|
|
432
|
-
async function promptSecret(label) {
|
|
433
|
-
process.stdout.write(label);
|
|
434
|
-
return new Promise((resolve) => {
|
|
435
|
-
const rawWasSet = process.stdin.isRaw;
|
|
436
|
-
if (process.stdin.isTTY) {
|
|
437
|
-
process.stdin.setRawMode(true);
|
|
438
|
-
}
|
|
439
|
-
process.stdin.resume();
|
|
440
|
-
process.stdin.setEncoding("utf8");
|
|
441
|
-
const state = { buf: "", rawWasSet, resolve, onData: () => { } };
|
|
442
|
-
state.onData = (chunk) => {
|
|
443
|
-
for (const c of chunk.toString()) {
|
|
444
|
-
if (_handleSecretChar(c, state))
|
|
445
|
-
return;
|
|
446
|
-
}
|
|
447
|
-
};
|
|
448
|
-
process.stdin.on("data", state.onData);
|
|
449
|
-
});
|
|
450
|
-
}
|
|
451
|
-
/** Fetch available models from an OpenAI-compatible /models endpoint. */
|
|
452
|
-
async function fetchModels(baseUrl, apiKey) {
|
|
453
|
-
try {
|
|
454
|
-
const url = `${baseUrl.replace(/\/+$/, "")}/models`;
|
|
455
|
-
const res = await fetch(url, {
|
|
456
|
-
headers: { Authorization: `Bearer ${apiKey}` },
|
|
457
|
-
signal: AbortSignal.timeout(10_000),
|
|
458
|
-
});
|
|
459
|
-
if (!res.ok)
|
|
460
|
-
return [];
|
|
461
|
-
const body = (await res.json());
|
|
462
|
-
if (!Array.isArray(body.data))
|
|
463
|
-
return [];
|
|
464
|
-
const NON_CHAT = /speech|embed|image|video|audio|ocr|rerank|tts|asr|paraformer|sambert|cosyvoice|wordart|wanx|wan2|flux|stable-diffusion|gui-/i;
|
|
465
|
-
return body.data
|
|
466
|
-
.map((m) => m.id)
|
|
467
|
-
.filter((id) => !NON_CHAT.test(id))
|
|
468
|
-
.sort();
|
|
469
|
-
}
|
|
470
|
-
catch {
|
|
471
|
-
return [];
|
|
472
|
-
}
|
|
473
|
-
}
|
|
474
|
-
async function _promptProviderSelection(rl) {
|
|
475
|
-
console.log("Select a provider:\n");
|
|
476
|
-
_printProviderMenu(PRESET_PROVIDERS);
|
|
477
|
-
const choice = (await rl.question(`Choose [1-${PRESET_PROVIDERS.length + 1}]: `)).trim();
|
|
478
|
-
const choiceNum = Number.parseInt(choice, 10);
|
|
479
|
-
if (Number.isNaN(choiceNum) || choiceNum < 1 || choiceNum > PRESET_PROVIDERS.length + 1) {
|
|
480
|
-
throw new Error(`Invalid choice: ${choice}`);
|
|
481
|
-
}
|
|
482
|
-
const preset = _resolveProviderChoice(choice, PRESET_PROVIDERS);
|
|
483
|
-
if (preset) {
|
|
484
|
-
const selected = PRESET_PROVIDERS[choiceNum - 1];
|
|
485
|
-
if (selected) {
|
|
486
|
-
console.log(`\n → ${selected.label} (${selected.baseUrl})\n`);
|
|
487
|
-
}
|
|
488
|
-
return preset;
|
|
489
|
-
}
|
|
490
|
-
const providerName = (await rl.question("Provider name (e.g. my-proxy): ")).trim();
|
|
491
|
-
if (!providerName)
|
|
492
|
-
throw new Error("Provider name required");
|
|
493
|
-
const baseUrl = (await rl.question("OpenAI-compatible API base URL: ")).trim();
|
|
494
|
-
if (!baseUrl)
|
|
495
|
-
throw new Error("Base URL required");
|
|
496
|
-
return { providerName, baseUrl };
|
|
497
|
-
}
|
|
498
|
-
async function _promptModelSelection(rl, baseUrl, apiKey) {
|
|
499
|
-
console.log("\nFetching available models...");
|
|
500
|
-
const models = await fetchModels(baseUrl, apiKey);
|
|
501
|
-
if (models.length === 0) {
|
|
502
|
-
console.log("Could not fetch models. Enter model name manually.");
|
|
503
|
-
const model = (await rl.question("Default model (e.g. qwen-plus, gpt-4o): ")).trim();
|
|
504
|
-
if (!model)
|
|
505
|
-
throw new Error("Model required");
|
|
506
|
-
return model;
|
|
507
|
-
}
|
|
508
|
-
console.log(`\nAvailable models (${models.length}):\n`);
|
|
509
|
-
_printModelMenu(models, process.stdout.columns || 100);
|
|
510
|
-
console.log(`\nChoose a number, or type a model name directly.`);
|
|
511
|
-
const modelInput = (await rl.question(`Default model [1-${models.length}]: `)).trim();
|
|
512
|
-
if (!modelInput)
|
|
513
|
-
throw new Error("Model required");
|
|
514
|
-
return _resolveModelChoice(modelInput, models);
|
|
515
|
-
}
|
|
516
261
|
/**
|
|
517
|
-
* Interactive setup — prompts user for
|
|
262
|
+
* Interactive setup — prompts the user only for the default agent. LLM
|
|
263
|
+
* configuration lives in config.yaml under `providers` and `models`.
|
|
518
264
|
*/
|
|
519
265
|
export async function cmdSetupInteractive(storageRoot) {
|
|
520
266
|
const rl = createInterface({ input, output });
|
|
521
267
|
try {
|
|
522
|
-
console.log("Configure
|
|
523
|
-
const
|
|
524
|
-
// 2. API key
|
|
268
|
+
console.log("Configure default agent for uwf workflow.\n");
|
|
269
|
+
const agentName = await _promptAgentSelection(rl);
|
|
525
270
|
rl.close();
|
|
526
|
-
|
|
527
|
-
if (!apiKey)
|
|
528
|
-
throw new Error("API key required");
|
|
529
|
-
// 3. Model selection
|
|
530
|
-
const rl2 = createInterface({ input, output });
|
|
531
|
-
const model = await _promptModelSelection(rl2, baseUrl, apiKey);
|
|
532
|
-
rl2.close();
|
|
533
|
-
console.log(` → ${providerName}/${model}\n`);
|
|
534
|
-
// 4. Agent discovery & selection
|
|
535
|
-
const rl3 = createInterface({ input, output });
|
|
536
|
-
const agentName = await _promptAgentSelection(rl3);
|
|
537
|
-
rl3.close();
|
|
538
|
-
const setupResult = await cmdSetup({
|
|
539
|
-
provider: providerName,
|
|
540
|
-
baseUrl,
|
|
541
|
-
apiKey,
|
|
542
|
-
model,
|
|
543
|
-
agent: agentName,
|
|
544
|
-
storageRoot,
|
|
545
|
-
});
|
|
546
|
-
// Show validation result
|
|
547
|
-
if (setupResult.validation && typeof setupResult.validation === "object") {
|
|
548
|
-
_printValidationResult(setupResult.validation);
|
|
549
|
-
}
|
|
271
|
+
await cmdSetup({ agent: agentName, storageRoot });
|
|
550
272
|
console.log("Setup complete! Get started:\n");
|
|
551
|
-
console.log(" uwf workflow
|
|
552
|
-
console.log(
|
|
553
|
-
console.log(
|
|
273
|
+
console.log(" uwf workflow list List available workflows");
|
|
274
|
+
console.log(" uwf workflow add <workflow.yaml> Register a workflow");
|
|
275
|
+
console.log(' uwf thread start <name> -p "..." Start a thread');
|
|
276
|
+
console.log(" uwf thread exec <thread-id> Execute next step");
|
|
277
|
+
console.log("");
|
|
278
|
+
console.log("LLM config: edit ~/.uwf/config.yaml (providers + models sections).");
|
|
554
279
|
console.log("");
|
|
555
280
|
return null;
|
|
556
281
|
}
|