opendevbrowser 0.0.18 → 0.0.20
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 +36 -27
- package/dist/automation/coordinator.d.ts +61 -2
- package/dist/automation/coordinator.d.ts.map +1 -1
- package/dist/browser/browser-manager.d.ts +6 -1
- package/dist/browser/browser-manager.d.ts.map +1 -1
- package/dist/browser/canvas-manager.d.ts +4 -0
- package/dist/browser/canvas-manager.d.ts.map +1 -1
- package/dist/browser/manager-types.d.ts +6 -1
- package/dist/browser/manager-types.d.ts.map +1 -1
- package/dist/browser/ops-browser-manager.d.ts +6 -1
- package/dist/browser/ops-browser-manager.d.ts.map +1 -1
- package/dist/browser/screencast-recorder.d.ts.map +1 -1
- package/dist/browser/session-inspector.d.ts +39 -0
- package/dist/browser/session-inspector.d.ts.map +1 -1
- package/dist/canvas/document-store.d.ts +14 -5
- package/dist/canvas/document-store.d.ts.map +1 -1
- package/dist/canvas/starters/catalog.d.ts.map +1 -1
- package/dist/canvas/types.d.ts +120 -9
- package/dist/canvas/types.d.ts.map +1 -1
- package/dist/challenges/action-loop.d.ts +2 -1
- package/dist/challenges/action-loop.d.ts.map +1 -1
- package/dist/challenges/capture.d.ts +14 -0
- package/dist/challenges/capture.d.ts.map +1 -0
- package/dist/challenges/index.d.ts +3 -1
- package/dist/challenges/index.d.ts.map +1 -1
- package/dist/challenges/inspect-plan.d.ts +40 -0
- package/dist/challenges/inspect-plan.d.ts.map +1 -0
- package/dist/challenges/orchestrator.d.ts.map +1 -1
- package/dist/challenges/types.d.ts +34 -0
- package/dist/challenges/types.d.ts.map +1 -1
- package/dist/{chunk-YBQECXZX.js → chunk-3VA6XR25.js} +3 -3
- package/dist/chunk-3VA6XR25.js.map +1 -0
- package/dist/{chunk-5FZQJRBQ.js → chunk-C6QUKABT.js} +2789 -992
- package/dist/chunk-C6QUKABT.js.map +1 -0
- package/dist/{chunk-L57D35TB.js → chunk-LMNFPJRI.js} +4255 -2752
- package/dist/chunk-LMNFPJRI.js.map +1 -0
- package/dist/cli/commands/challenge-automation-mode.d.ts +3 -0
- package/dist/cli/commands/challenge-automation-mode.d.ts.map +1 -0
- package/dist/cli/commands/inspiredesign.d.ts +25 -0
- package/dist/cli/commands/inspiredesign.d.ts.map +1 -0
- package/dist/cli/commands/macro-resolve.d.ts.map +1 -1
- package/dist/cli/commands/nav/review-desktop.d.ts +7 -0
- package/dist/cli/commands/nav/review-desktop.d.ts.map +1 -0
- package/dist/cli/commands/nav/review-shared.d.ts +10 -0
- package/dist/cli/commands/nav/review-shared.d.ts.map +1 -0
- package/dist/cli/commands/nav/review.d.ts.map +1 -1
- package/dist/cli/commands/serve.d.ts.map +1 -1
- package/dist/cli/commands/session/inspector-audit.d.ts +7 -0
- package/dist/cli/commands/session/inspector-audit.d.ts.map +1 -0
- package/dist/cli/commands/session/inspector-plan.d.ts +7 -0
- package/dist/cli/commands/session/inspector-plan.d.ts.map +1 -0
- package/dist/cli/commands/session/inspector-shared.d.ts +11 -0
- package/dist/cli/commands/session/inspector-shared.d.ts.map +1 -0
- package/dist/cli/commands/session/inspector.d.ts +1 -11
- package/dist/cli/commands/session/inspector.d.ts.map +1 -1
- package/dist/cli/commands/status-capabilities.d.ts +7 -0
- package/dist/cli/commands/status-capabilities.d.ts.map +1 -0
- package/dist/cli/daemon-client.d.ts.map +1 -1
- package/dist/cli/daemon-commands.d.ts.map +1 -1
- package/dist/cli/daemon-status.d.ts +5 -0
- package/dist/cli/daemon-status.d.ts.map +1 -1
- package/dist/cli/daemon.d.ts +5 -0
- package/dist/cli/daemon.d.ts.map +1 -1
- package/dist/cli/help.d.ts +2 -0
- package/dist/cli/help.d.ts.map +1 -1
- package/dist/cli/index.js +620 -242
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/remote-manager.d.ts +6 -0
- package/dist/cli/remote-manager.d.ts.map +1 -1
- package/dist/cli/utils/parse.d.ts +1 -0
- package/dist/cli/utils/parse.d.ts.map +1 -1
- package/dist/cli/utils/skills.d.ts +1 -1
- package/dist/cli/utils/skills.d.ts.map +1 -1
- package/dist/cli/utils/workflow-message.d.ts +3 -0
- package/dist/cli/utils/workflow-message.d.ts.map +1 -1
- package/dist/config.d.ts +1 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/core/bootstrap.d.ts.map +1 -1
- package/dist/core/runtime-assemblies.d.ts +2 -1
- package/dist/core/runtime-assemblies.d.ts.map +1 -1
- package/dist/core/types.d.ts +1 -1
- package/dist/core/types.d.ts.map +1 -1
- package/dist/desktop/runtime.d.ts +1 -0
- package/dist/desktop/runtime.d.ts.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +728 -447
- package/dist/index.js.map +1 -1
- package/dist/opendevbrowser.d.ts.map +1 -1
- package/dist/opendevbrowser.js +728 -447
- package/dist/opendevbrowser.js.map +1 -1
- package/dist/providers/browser-fallback.d.ts.map +1 -1
- package/dist/providers/constraint.d.ts +11 -0
- package/dist/providers/constraint.d.ts.map +1 -1
- package/dist/providers/cookie-source.d.ts +8 -0
- package/dist/providers/cookie-source.d.ts.map +1 -0
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/inspiredesign-capture.d.ts +17 -0
- package/dist/providers/inspiredesign-capture.d.ts.map +1 -0
- package/dist/providers/inspiredesign-contract.d.ts +77 -0
- package/dist/providers/inspiredesign-contract.d.ts.map +1 -0
- package/dist/providers/renderer.d.ts +21 -0
- package/dist/providers/renderer.d.ts.map +1 -1
- package/dist/providers/runtime-bundle.d.ts +2 -1
- package/dist/providers/runtime-bundle.d.ts.map +1 -1
- package/dist/providers/runtime-factory.d.ts +4 -2
- package/dist/providers/runtime-factory.d.ts.map +1 -1
- package/dist/providers/shopping/index.d.ts +1 -1
- package/dist/providers/types.d.ts +3 -2
- package/dist/providers/types.d.ts.map +1 -1
- package/dist/providers/workflow-contracts.d.ts +1 -1
- package/dist/providers/workflow-contracts.d.ts.map +1 -1
- package/dist/providers/workflows.d.ts +21 -2
- package/dist/providers/workflows.d.ts.map +1 -1
- package/dist/{providers-G36AM3Z2.js → providers-3VBLTNAX.js} +6 -2
- package/dist/public-surface/generated-manifest.d.ts +143 -7
- package/dist/public-surface/generated-manifest.d.ts.map +1 -1
- package/dist/public-surface/source.d.ts +102 -3
- package/dist/public-surface/source.d.ts.map +1 -1
- package/dist/relay/protocol.d.ts +1 -1
- package/dist/relay/protocol.d.ts.map +1 -1
- package/dist/relay/relay-server.d.ts +1 -0
- package/dist/relay/relay-server.d.ts.map +1 -1
- package/dist/skills/skill-loader.js +1 -1
- package/dist/tools/automation-shared.d.ts +6 -0
- package/dist/tools/automation-shared.d.ts.map +1 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/inspiredesign_run.d.ts +4 -0
- package/dist/tools/inspiredesign_run.d.ts.map +1 -0
- package/dist/tools/review_desktop.d.ts +4 -0
- package/dist/tools/review_desktop.d.ts.map +1 -0
- package/dist/tools/session_inspector.d.ts.map +1 -1
- package/dist/tools/session_inspector_audit.d.ts +4 -0
- package/dist/tools/session_inspector_audit.d.ts.map +1 -0
- package/dist/tools/session_inspector_plan.d.ts +4 -0
- package/dist/tools/session_inspector_plan.d.ts.map +1 -0
- package/dist/tools/status_capabilities.d.ts +4 -0
- package/dist/tools/status_capabilities.d.ts.map +1 -0
- package/extension/dist/background.js +70 -10
- package/extension/dist/canvas/canvas-runtime.js +14 -1
- package/extension/dist/ops/ops-runtime.js +18 -1
- package/extension/dist/popup.js +29 -16
- package/extension/dist/services/ConnectionManager.js +27 -2
- package/extension/manifest.json +1 -1
- package/extension/popup.html +11 -0
- package/package.json +5 -5
- package/skills/AGENTS.md +2 -2
- package/skills/opendevbrowser-best-practices/SKILL.md +50 -15
- package/skills/opendevbrowser-best-practices/artifacts/canvas-governance-playbook.md +31 -12
- package/skills/opendevbrowser-best-practices/artifacts/command-channel-reference.md +64 -15
- package/skills/opendevbrowser-best-practices/artifacts/provider-workflows.md +4 -0
- package/skills/opendevbrowser-best-practices/artifacts/skill-runtime-surface-matrix.md +11 -10
- package/skills/opendevbrowser-best-practices/assets/templates/canvas-blocker-checklist.json +28 -22
- package/skills/opendevbrowser-best-practices/assets/templates/canvas-generation-plan.v1.json +18 -17
- package/skills/opendevbrowser-best-practices/assets/templates/canvas-handshake-example.json +135 -17
- package/skills/opendevbrowser-best-practices/assets/templates/skill-runtime-pack-matrix.json +55 -8
- package/skills/opendevbrowser-best-practices/assets/templates/surface-audit-checklist.json +18 -4
- package/skills/opendevbrowser-best-practices/scripts/odb-workflow.sh +16 -4
- package/skills/opendevbrowser-best-practices/scripts/run-robustness-audit.sh +3 -1
- package/skills/opendevbrowser-best-practices/scripts/validate-skill-assets.sh +68 -25
- package/skills/opendevbrowser-design-agent/SKILL.md +9 -4
- package/skills/opendevbrowser-design-agent/artifacts/design-workflows.md +15 -6
- package/skills/opendevbrowser-design-agent/assets/templates/canvas-generation-plan.design.v1.json +18 -17
- package/skills/opendevbrowser-design-agent/scripts/design-workflow.sh +11 -0
- package/skills/opendevbrowser-design-agent/scripts/validate-skill-assets.sh +57 -0
- package/dist/chunk-5FZQJRBQ.js.map +0 -1
- package/dist/chunk-L57D35TB.js.map +0 -1
- package/dist/chunk-YBQECXZX.js.map +0 -1
- /package/dist/{providers-G36AM3Z2.js.map → providers-3VBLTNAX.js.map} +0 -0
package/dist/cli/index.js
CHANGED
|
@@ -21,6 +21,7 @@ import {
|
|
|
21
21
|
formatErrorPayload,
|
|
22
22
|
generateSecureToken,
|
|
23
23
|
getChromeUserDataRoots,
|
|
24
|
+
getCurrentDaemonFingerprint,
|
|
24
25
|
getExtensionPath,
|
|
25
26
|
getProfileDirs,
|
|
26
27
|
loadGlobalConfig,
|
|
@@ -30,22 +31,22 @@ import {
|
|
|
30
31
|
resolveExitCode,
|
|
31
32
|
startDaemon,
|
|
32
33
|
toCliError
|
|
33
|
-
} from "../chunk-
|
|
34
|
+
} from "../chunk-LMNFPJRI.js";
|
|
34
35
|
import {
|
|
35
36
|
getBundledSkillsDir,
|
|
36
37
|
listBundledSkillDirectories
|
|
37
|
-
} from "../chunk-
|
|
38
|
-
import "../chunk-Y2KL55OG.js";
|
|
38
|
+
} from "../chunk-3VA6XR25.js";
|
|
39
39
|
import {
|
|
40
40
|
writeFileAtomic
|
|
41
41
|
} from "../chunk-TBUCZX4A.js";
|
|
42
|
+
import "../chunk-Y2KL55OG.js";
|
|
42
43
|
import {
|
|
43
44
|
cleanupExpiredArtifacts,
|
|
44
45
|
isChallengeAutomationMode,
|
|
45
46
|
setDefaultLogSink,
|
|
46
47
|
stderrSink,
|
|
47
48
|
summarizePrimaryProviderIssue
|
|
48
|
-
} from "../chunk-
|
|
49
|
+
} from "../chunk-C6QUKABT.js";
|
|
49
50
|
import "../chunk-FUSXMW3G.js";
|
|
50
51
|
|
|
51
52
|
// src/cli/args.ts
|
|
@@ -245,25 +246,18 @@ function detectOutputFormat(argv) {
|
|
|
245
246
|
}
|
|
246
247
|
}
|
|
247
248
|
|
|
248
|
-
// src/cli/commands/registry.ts
|
|
249
|
-
var registry = /* @__PURE__ */ new Map();
|
|
250
|
-
function registerCommand(definition) {
|
|
251
|
-
registry.set(definition.name, definition);
|
|
252
|
-
}
|
|
253
|
-
function getCommand(name) {
|
|
254
|
-
return registry.get(name);
|
|
255
|
-
}
|
|
256
|
-
function listCommands() {
|
|
257
|
-
return Array.from(registry.values());
|
|
258
|
-
}
|
|
259
|
-
|
|
260
249
|
// src/cli/help.ts
|
|
261
250
|
var LABEL_WIDTH = 42;
|
|
262
251
|
var DETAIL_LABEL_WIDTH = 9;
|
|
263
252
|
var COMMAND_SET = new Set(CLI_COMMANDS);
|
|
264
253
|
var FLAG_SET = new Set(VALID_FLAGS);
|
|
265
254
|
var TOOL_COUNT = TOOL_SURFACE_ENTRIES.length;
|
|
255
|
+
var CLI_EQUIVALENT_SET = new Set(
|
|
256
|
+
TOOL_SURFACE_ENTRIES.flatMap((entry) => entry.cliEquivalent ? [entry.cliEquivalent] : [])
|
|
257
|
+
);
|
|
266
258
|
var formatFlags = (flags) => flags.length > 0 ? flags.join(", ") : "none";
|
|
259
|
+
var getCliOnlyCommands = () => CLI_COMMANDS.filter((command) => !CLI_EQUIVALENT_SET.has(command));
|
|
260
|
+
var getToolOnlyHelperNames = () => TOOL_SURFACE_ENTRIES.filter((entry) => !entry.cliEquivalent).map((entry) => entry.name);
|
|
267
261
|
var HELP_COMMAND_GROUPS = PUBLIC_CLI_COMMAND_GROUPS.map((group) => ({
|
|
268
262
|
title: group.title,
|
|
269
263
|
summary: group.summary,
|
|
@@ -330,7 +324,7 @@ var HELP_FLAG_GROUPS = [
|
|
|
330
324
|
title: "Navigation / Interaction / Diagnostics Flags",
|
|
331
325
|
summary: "Command-specific flags for page actions, reads, and diagnostics.",
|
|
332
326
|
flags: [
|
|
333
|
-
{ flag: "--url", description: "Target URL for navigation, connect, or workflow commands.", example: "opendevbrowser goto --session-id s1 --url https://example.com" },
|
|
327
|
+
{ flag: "--url", description: "Target URL for navigation, connect, or workflow commands; repeat for multi-reference inspiredesign runs.", example: "opendevbrowser goto --session-id s1 --url https://example.com" },
|
|
334
328
|
{ flag: "--wait-until", description: "Navigation wait strategy such as load or domcontentloaded." },
|
|
335
329
|
{ flag: "--timeout-ms", description: "Operation timeout in milliseconds.", example: "opendevbrowser canvas --timeout-ms 120000 --command canvas.session.open ..." },
|
|
336
330
|
{ flag: "--ref", description: "Snapshot ref id for element-targeted commands.", example: "opendevbrowser click --session-id s1 --ref r12" },
|
|
@@ -409,6 +403,9 @@ var HELP_FLAG_GROUPS = [
|
|
|
409
403
|
{ flag: "--budget", description: "Budget filter for shopping workflows." },
|
|
410
404
|
{ flag: "--region", description: "Region or country hint for provider selection. Treat it as advisory unless output metadata reports `region_authoritative=true`." },
|
|
411
405
|
{ flag: "--sort", description: "Sort mode for shopping results." },
|
|
406
|
+
{ flag: "--brief", description: "Inspiredesign brief describing the target design direction." },
|
|
407
|
+
{ flag: "--capture-mode", description: "Inspiredesign capture mode: off (default) or deep." },
|
|
408
|
+
{ flag: "--include-prototype-guidance", description: "Include inspiredesign prototype guidance in workflow output." },
|
|
412
409
|
{ flag: "--product-url", description: "Target product URL for product-video workflows." },
|
|
413
410
|
{ flag: "--product-name", description: "Product name override for product-video workflows." },
|
|
414
411
|
{ flag: "--provider-hint", description: "Provider hint override for product workflows." },
|
|
@@ -438,7 +435,7 @@ var HELP_CAPABILITY_ENTRIES = [
|
|
|
438
435
|
},
|
|
439
436
|
{
|
|
440
437
|
label: "desktop observation",
|
|
441
|
-
description: "Use the public read-only desktop observation plane for sibling desktop evidence on macOS; window inventory and accessibility probes use the local swift command, while screenshots use screencapture outside extension relay.",
|
|
438
|
+
description: "Use the public read-only desktop observation plane for sibling desktop evidence on macOS; availability, window inventory, and accessibility probes use the local swift command, while screenshots use macOS screencapture outside extension relay.",
|
|
442
439
|
details: [
|
|
443
440
|
{
|
|
444
441
|
label: "cli:",
|
|
@@ -453,6 +450,7 @@ var HELP_CAPABILITY_ENTRIES = [
|
|
|
453
450
|
details: [
|
|
454
451
|
{ label: "flag:", value: "--challenge-automation-mode off|browser|browser_with_helper" },
|
|
455
452
|
{ label: "works:", value: "research run, shopping run, product-video run, macro-resolve --execute" },
|
|
453
|
+
{ label: "entry:", value: onboarding_metadata_default.quickStartCommands.computerUseEntry },
|
|
456
454
|
{ label: "proof:", value: "review, session-inspector, workflow fallback metadata" }
|
|
457
455
|
]
|
|
458
456
|
}
|
|
@@ -488,11 +486,24 @@ var HELP_ONBOARDING_ENTRIES = [
|
|
|
488
486
|
description: "Start deal hunting with explicit providers in managed mode and only trust regional comparisons when the result reports `region_authoritative=true`.",
|
|
489
487
|
details: [{ label: "cli:", value: onboarding_metadata_default.quickStartCommands.validatedShopping }]
|
|
490
488
|
},
|
|
489
|
+
{
|
|
490
|
+
label: "computer_use_entry",
|
|
491
|
+
description: "Enter browser-scoped computer use from a workflow run, not from a separate desktop command family.",
|
|
492
|
+
details: [{ label: "cli:", value: onboarding_metadata_default.quickStartCommands.computerUseEntry }]
|
|
493
|
+
},
|
|
491
494
|
{
|
|
492
495
|
label: "happy_path",
|
|
493
496
|
description: "After guidance, verify a minimal managed happy path before widening into multi-step automation.",
|
|
494
497
|
details: [{ label: "cli:", value: onboarding_metadata_default.quickStartCommands.happyPath }]
|
|
495
498
|
},
|
|
499
|
+
{
|
|
500
|
+
label: "surface_split",
|
|
501
|
+
description: "Use the existing public-surface split when a workflow or helper only exists on one side of the CLI or tool surface.",
|
|
502
|
+
details: [
|
|
503
|
+
{ label: "cli-only:", value: getCliOnlyCommands().join(", ") },
|
|
504
|
+
{ label: "tool-only:", value: getToolOnlyHelperNames().join(", ") }
|
|
505
|
+
]
|
|
506
|
+
},
|
|
496
507
|
{
|
|
497
508
|
label: "docs",
|
|
498
509
|
description: "Use the first-run checklist and canonical skill runbook for proof and deeper operating details.",
|
|
@@ -513,6 +524,7 @@ var HELP_REFERENCE_ENTRIES = [
|
|
|
513
524
|
{ label: "docs/CLI.md", description: "Detailed CLI guide and release-gate runbooks." },
|
|
514
525
|
{ label: onboarding_metadata_default.referencePaths.onboardingDoc, description: "First-run checklist for help-led onboarding and happy-path proof." },
|
|
515
526
|
{ label: onboarding_metadata_default.referencePaths.skillDoc, description: "Canonical bundled best-practices runbook and quick-start guidance." },
|
|
527
|
+
{ label: "docs/WORKFLOW_SURFACE_MAP.md", description: "Code-derived workflow and validation inventory, including CLI-only and tool-only surface splits." },
|
|
516
528
|
{ label: "docs/SURFACE_REFERENCE.md", description: "Canonical CLI, tool, and relay channel inventory." },
|
|
517
529
|
{ label: "opendevbrowser --help", description: "Primary full help invocation for quick discovery." },
|
|
518
530
|
{ label: "opendevbrowser help", description: "Alias that prints the same full help inventory." }
|
|
@@ -526,14 +538,7 @@ function formatRows(rows) {
|
|
|
526
538
|
return lines.join("\n");
|
|
527
539
|
}).join("\n");
|
|
528
540
|
}
|
|
529
|
-
function
|
|
530
|
-
const descriptions = /* @__PURE__ */ new Map();
|
|
531
|
-
for (const definition of listCommands()) {
|
|
532
|
-
descriptions.set(definition.name, definition.description);
|
|
533
|
-
}
|
|
534
|
-
return descriptions;
|
|
535
|
-
}
|
|
536
|
-
function assertCommandCoverage(commandDescriptions) {
|
|
541
|
+
function assertCommandCoverage() {
|
|
537
542
|
const seen = /* @__PURE__ */ new Set();
|
|
538
543
|
for (const group of HELP_COMMAND_GROUPS) {
|
|
539
544
|
for (const command of group.commands) {
|
|
@@ -541,13 +546,10 @@ function assertCommandCoverage(commandDescriptions) {
|
|
|
541
546
|
if (!COMMAND_SET.has(command)) {
|
|
542
547
|
throw new Error(`Help references unknown CLI command: ${command}`);
|
|
543
548
|
}
|
|
544
|
-
if (!commandDescriptions.has(command)) {
|
|
545
|
-
throw new Error(`Help references unregistered CLI command: ${command}`);
|
|
546
|
-
}
|
|
547
549
|
if (seen.has(command)) {
|
|
548
550
|
throw new Error(`Help command appears multiple times: ${command}`);
|
|
549
551
|
}
|
|
550
|
-
if (!detail || !detail.usage.trim()) {
|
|
552
|
+
if (!detail || !detail.description.trim() || !detail.usage.trim()) {
|
|
551
553
|
throw new Error(`Missing command help metadata: ${command}`);
|
|
552
554
|
}
|
|
553
555
|
for (const flag of detail.flags) {
|
|
@@ -602,13 +604,13 @@ function assertToolCoverage() {
|
|
|
602
604
|
throw new Error(`Help tool inventory must list ${TOOL_COUNT} tools; got ${HELP_TOOL_ENTRIES.length}`);
|
|
603
605
|
}
|
|
604
606
|
}
|
|
605
|
-
function formatCommandGroups(
|
|
607
|
+
function formatCommandGroups() {
|
|
606
608
|
return HELP_COMMAND_GROUPS.map((group) => {
|
|
607
609
|
const rows = group.commands.map((command) => {
|
|
608
610
|
const detail = COMMAND_HELP_DETAILS[command];
|
|
609
611
|
return {
|
|
610
612
|
label: command,
|
|
611
|
-
description:
|
|
613
|
+
description: detail.description,
|
|
612
614
|
details: [
|
|
613
615
|
{ label: "usage:", value: detail.usage },
|
|
614
616
|
{ label: "flags:", value: formatFlags(detail.flags) }
|
|
@@ -650,8 +652,7 @@ function formatReferenceEntries() {
|
|
|
650
652
|
})));
|
|
651
653
|
}
|
|
652
654
|
function getHelpText() {
|
|
653
|
-
|
|
654
|
-
assertCommandCoverage(commandDescriptions);
|
|
655
|
+
assertCommandCoverage();
|
|
655
656
|
assertFlagCoverage();
|
|
656
657
|
assertToolCoverage();
|
|
657
658
|
return [
|
|
@@ -669,7 +670,7 @@ function getHelpText() {
|
|
|
669
670
|
formatOnboardingEntries(),
|
|
670
671
|
"",
|
|
671
672
|
`Command Inventory (all ${CLI_COMMANDS.length} commands):`,
|
|
672
|
-
formatCommandGroups(
|
|
673
|
+
formatCommandGroups(),
|
|
673
674
|
"",
|
|
674
675
|
"Flag Inventory (all supported flags):",
|
|
675
676
|
formatFlagGroups(),
|
|
@@ -682,6 +683,15 @@ function getHelpText() {
|
|
|
682
683
|
].join("\n");
|
|
683
684
|
}
|
|
684
685
|
|
|
686
|
+
// src/cli/commands/registry.ts
|
|
687
|
+
var registry = /* @__PURE__ */ new Map();
|
|
688
|
+
function registerCommand(definition) {
|
|
689
|
+
registry.set(definition.name, definition);
|
|
690
|
+
}
|
|
691
|
+
function getCommand(name) {
|
|
692
|
+
return registry.get(name);
|
|
693
|
+
}
|
|
694
|
+
|
|
685
695
|
// src/cli/installers/global.ts
|
|
686
696
|
import * as fs3 from "fs";
|
|
687
697
|
|
|
@@ -958,10 +968,10 @@ function getCodexHomeDir() {
|
|
|
958
968
|
return process.env.CODEX_HOME || path3.join(os3.homedir(), ".codex");
|
|
959
969
|
}
|
|
960
970
|
function getClaudeCodeHomeDir() {
|
|
961
|
-
return process.env.CLAUDECODE_HOME ||
|
|
971
|
+
return process.env.CLAUDECODE_HOME || path3.join(os3.homedir(), ".claude");
|
|
962
972
|
}
|
|
963
973
|
function getAmpHomeDir() {
|
|
964
|
-
return process.env.
|
|
974
|
+
return process.env.AMP_CLI_HOME || path3.join(os3.homedir(), ".amp");
|
|
965
975
|
}
|
|
966
976
|
function dedupeTargets(targets) {
|
|
967
977
|
const deduped = /* @__PURE__ */ new Map();
|
|
@@ -985,9 +995,7 @@ function getGlobalSkillTargets() {
|
|
|
985
995
|
{ agent: "opencode", dir: getGlobalSkillDir() },
|
|
986
996
|
{ agent: "codex", dir: path3.join(getCodexHomeDir(), SKILLS_DIR_NAME) },
|
|
987
997
|
{ agent: "claudecode", dir: claudeSkillsDir },
|
|
988
|
-
{ agent: "
|
|
989
|
-
{ agent: "ampcli", dir: ampSkillsDir },
|
|
990
|
-
{ agent: "amp", dir: ampSkillsDir }
|
|
998
|
+
{ agent: "ampcli", dir: ampSkillsDir }
|
|
991
999
|
]);
|
|
992
1000
|
}
|
|
993
1001
|
function getLocalSkillTargets() {
|
|
@@ -997,9 +1005,7 @@ function getLocalSkillTargets() {
|
|
|
997
1005
|
{ agent: "opencode", dir: getLocalSkillDir() },
|
|
998
1006
|
{ agent: "codex", dir: path3.join(process.cwd(), ".codex", SKILLS_DIR_NAME) },
|
|
999
1007
|
{ agent: "claudecode", dir: localClaudeSkillsDir },
|
|
1000
|
-
{ agent: "
|
|
1001
|
-
{ agent: "ampcli", dir: localAmpSkillsDir },
|
|
1002
|
-
{ agent: "amp", dir: localAmpSkillsDir }
|
|
1008
|
+
{ agent: "ampcli", dir: localAmpSkillsDir }
|
|
1003
1009
|
]);
|
|
1004
1010
|
}
|
|
1005
1011
|
|
|
@@ -1505,6 +1511,29 @@ function parseStringArrayFlag(rawArgs, flag) {
|
|
|
1505
1511
|
}
|
|
1506
1512
|
return items;
|
|
1507
1513
|
}
|
|
1514
|
+
function parseRepeatedStringFlag(rawArgs, flag) {
|
|
1515
|
+
const values = [];
|
|
1516
|
+
for (let index = 0; index < rawArgs.length; index += 1) {
|
|
1517
|
+
const arg = rawArgs[index];
|
|
1518
|
+
if (arg === flag) {
|
|
1519
|
+
const value = rawArgs[index + 1];
|
|
1520
|
+
if (!value) {
|
|
1521
|
+
throw createUsageError(`Missing value for ${flag}`);
|
|
1522
|
+
}
|
|
1523
|
+
values.push(value);
|
|
1524
|
+
index += 1;
|
|
1525
|
+
continue;
|
|
1526
|
+
}
|
|
1527
|
+
if (arg?.startsWith(`${flag}=`)) {
|
|
1528
|
+
const value = arg.split("=", 2)[1];
|
|
1529
|
+
if (!value) {
|
|
1530
|
+
throw createUsageError(`Missing value for ${flag}`);
|
|
1531
|
+
}
|
|
1532
|
+
values.push(value);
|
|
1533
|
+
}
|
|
1534
|
+
}
|
|
1535
|
+
return values.length > 0 ? values : void 0;
|
|
1536
|
+
}
|
|
1508
1537
|
|
|
1509
1538
|
// src/cli/commands/native.ts
|
|
1510
1539
|
import * as fs8 from "fs";
|
|
@@ -1913,6 +1942,32 @@ async function resolveExistingDaemon(port, tokens) {
|
|
|
1913
1942
|
}
|
|
1914
1943
|
return null;
|
|
1915
1944
|
}
|
|
1945
|
+
function isPositivePid(value) {
|
|
1946
|
+
return typeof value === "number" && Number.isInteger(value) && value > 0;
|
|
1947
|
+
}
|
|
1948
|
+
function rememberStalePid(staleDaemonPids, pid) {
|
|
1949
|
+
if (isPositivePid(pid)) {
|
|
1950
|
+
staleDaemonPids.add(pid);
|
|
1951
|
+
}
|
|
1952
|
+
}
|
|
1953
|
+
async function stopDaemonOnPort(port, token) {
|
|
1954
|
+
try {
|
|
1955
|
+
const response = await fetchWithTimeout(`http://127.0.0.1:${port}/stop`, {
|
|
1956
|
+
method: "POST",
|
|
1957
|
+
headers: { Authorization: `Bearer ${token}` }
|
|
1958
|
+
});
|
|
1959
|
+
return response.ok;
|
|
1960
|
+
} catch {
|
|
1961
|
+
return false;
|
|
1962
|
+
}
|
|
1963
|
+
}
|
|
1964
|
+
async function stopStaleDaemon(port, daemon, staleDaemonPids) {
|
|
1965
|
+
rememberStalePid(staleDaemonPids, daemon.status.pid);
|
|
1966
|
+
const stopped = await stopDaemonOnPort(port, daemon.token);
|
|
1967
|
+
if (!stopped && isPositivePid(daemon.status.pid)) {
|
|
1968
|
+
terminateProcess(daemon.status.pid);
|
|
1969
|
+
}
|
|
1970
|
+
}
|
|
1916
1971
|
function parseServeArgs(rawArgs) {
|
|
1917
1972
|
const parsed = { stop: false };
|
|
1918
1973
|
for (let i = 0; i < rawArgs.length; i += 1) {
|
|
@@ -2075,27 +2130,34 @@ async function runServe(args) {
|
|
|
2075
2130
|
const metadata = readDaemonMetadata();
|
|
2076
2131
|
const metadataToken = metadata?.port === requestedPort ? metadata.token : void 0;
|
|
2077
2132
|
const tokenCandidates = resolveTokenCandidates(serveArgs.token, metadataToken, config.daemonToken);
|
|
2133
|
+
const currentFingerprint = getCurrentDaemonFingerprint();
|
|
2078
2134
|
const existingDaemon = await resolveExistingDaemon(requestedPort, tokenCandidates);
|
|
2079
2135
|
const staleDaemonPids = new Set(cleanupCompetingServeProcesses(existingDaemon?.status.pid));
|
|
2080
2136
|
const staleCleared = () => staleDaemonPids.size;
|
|
2137
|
+
let replacedStaleFingerprint = false;
|
|
2081
2138
|
if (existingDaemon) {
|
|
2082
|
-
const
|
|
2083
|
-
|
|
2084
|
-
|
|
2139
|
+
const fingerprintMatches = existingDaemon.status.fingerprint === currentFingerprint;
|
|
2140
|
+
if (fingerprintMatches) {
|
|
2141
|
+
const relayPort = existingDaemon.status.relay.port ?? config.relayPort;
|
|
2142
|
+
const clearedCount2 = staleCleared();
|
|
2143
|
+
const staleNote2 = clearedCount2 > 0 ? `
|
|
2085
2144
|
Cleared ${clearedCount2} stale daemon process${clearedCount2 === 1 ? "" : "es"}.` : "";
|
|
2086
|
-
|
|
2087
|
-
|
|
2088
|
-
|
|
2089
|
-
|
|
2090
|
-
|
|
2091
|
-
|
|
2092
|
-
|
|
2093
|
-
|
|
2094
|
-
|
|
2095
|
-
|
|
2096
|
-
|
|
2097
|
-
|
|
2098
|
-
|
|
2145
|
+
return {
|
|
2146
|
+
success: true,
|
|
2147
|
+
message: `Daemon already running on 127.0.0.1:${requestedPort} (pid=${existingDaemon.status.pid}, relay ${relayPort}).${staleNote2}`,
|
|
2148
|
+
data: {
|
|
2149
|
+
port: requestedPort,
|
|
2150
|
+
pid: existingDaemon.status.pid,
|
|
2151
|
+
relayPort,
|
|
2152
|
+
alreadyRunning: true,
|
|
2153
|
+
staleDaemonsCleared: clearedCount2,
|
|
2154
|
+
relay: existingDaemon.status.relay
|
|
2155
|
+
},
|
|
2156
|
+
exitCode: null
|
|
2157
|
+
};
|
|
2158
|
+
}
|
|
2159
|
+
await stopStaleDaemon(requestedPort, existingDaemon, staleDaemonPids);
|
|
2160
|
+
replacedStaleFingerprint = true;
|
|
2099
2161
|
}
|
|
2100
2162
|
let nativeStatus = getNativeStatusSnapshot();
|
|
2101
2163
|
let nativeMessage = null;
|
|
@@ -2138,23 +2200,31 @@ Cleared ${clearedCount2} stale daemon process${clearedCount2 === 1 ? "" : "es"}.
|
|
|
2138
2200
|
}
|
|
2139
2201
|
const runningDaemon = await resolveExistingDaemon(requestedPort, tokenCandidates);
|
|
2140
2202
|
if (runningDaemon) {
|
|
2141
|
-
const
|
|
2142
|
-
|
|
2143
|
-
|
|
2203
|
+
const fingerprintMatches = runningDaemon.status.fingerprint === currentFingerprint;
|
|
2204
|
+
if (fingerprintMatches) {
|
|
2205
|
+
const relayPort = runningDaemon.status.relay.port ?? config.relayPort;
|
|
2206
|
+
const clearedCount2 = staleCleared();
|
|
2207
|
+
const staleNote2 = clearedCount2 > 0 ? `
|
|
2144
2208
|
Cleared ${clearedCount2} stale daemon process${clearedCount2 === 1 ? "" : "es"}.` : "";
|
|
2145
|
-
|
|
2146
|
-
|
|
2147
|
-
|
|
2148
|
-
|
|
2149
|
-
|
|
2150
|
-
|
|
2151
|
-
|
|
2152
|
-
|
|
2153
|
-
|
|
2154
|
-
|
|
2155
|
-
|
|
2156
|
-
|
|
2157
|
-
|
|
2209
|
+
return {
|
|
2210
|
+
success: true,
|
|
2211
|
+
message: `Daemon already running on 127.0.0.1:${requestedPort} (pid=${runningDaemon.status.pid}, relay ${relayPort}).${staleNote2}`,
|
|
2212
|
+
data: {
|
|
2213
|
+
port: requestedPort,
|
|
2214
|
+
pid: runningDaemon.status.pid,
|
|
2215
|
+
relayPort,
|
|
2216
|
+
alreadyRunning: true,
|
|
2217
|
+
staleDaemonsCleared: clearedCount2,
|
|
2218
|
+
relay: runningDaemon.status.relay
|
|
2219
|
+
},
|
|
2220
|
+
exitCode: null
|
|
2221
|
+
};
|
|
2222
|
+
}
|
|
2223
|
+
await stopStaleDaemon(requestedPort, runningDaemon, staleDaemonPids);
|
|
2224
|
+
replacedStaleFingerprint = true;
|
|
2225
|
+
if (attempt === 0) {
|
|
2226
|
+
continue;
|
|
2227
|
+
}
|
|
2158
2228
|
}
|
|
2159
2229
|
if (attempt === 0) {
|
|
2160
2230
|
let clearedNewPid = false;
|
|
@@ -2193,8 +2263,9 @@ Cleared ${clearedCount2} stale daemon process${clearedCount2 === 1 ? "" : "es"}.
|
|
|
2193
2263
|
const clearedCount = staleCleared();
|
|
2194
2264
|
const staleNote = clearedCount > 0 ? `
|
|
2195
2265
|
Cleared ${clearedCount} stale daemon process${clearedCount === 1 ? "" : "es"}.` : "";
|
|
2266
|
+
const fingerprintNote = replacedStaleFingerprint ? "\nReplaced stale daemon fingerprint." : "";
|
|
2196
2267
|
const message = nativeMessage ? `${baseMessage}
|
|
2197
|
-
${nativeMessage}${staleNote}` : `${baseMessage}${staleNote}`;
|
|
2268
|
+
${nativeMessage}${fingerprintNote}${staleNote}` : `${baseMessage}${fingerprintNote}${staleNote}`;
|
|
2198
2269
|
return {
|
|
2199
2270
|
success: true,
|
|
2200
2271
|
message,
|
|
@@ -3594,94 +3665,138 @@ async function runSessionDisconnect(args) {
|
|
|
3594
3665
|
return { success: true, message: `Session disconnected: ${sessionId}` };
|
|
3595
3666
|
}
|
|
3596
3667
|
|
|
3597
|
-
// src/cli/
|
|
3668
|
+
// src/cli/utils/workflow-message.ts
|
|
3669
|
+
var asRecord = (value) => value && typeof value === "object" && !Array.isArray(value) ? value : null;
|
|
3670
|
+
var readNonEmptyString = (value) => typeof value === "string" && value.trim().length > 0 ? value.trim() : null;
|
|
3671
|
+
var readMeta = (data) => {
|
|
3672
|
+
return asRecord(asRecord(data)?.meta);
|
|
3673
|
+
};
|
|
3674
|
+
var readPrimaryConstraint = (data) => {
|
|
3675
|
+
const meta = readMeta(data);
|
|
3676
|
+
if (!meta) return null;
|
|
3677
|
+
return asRecord(meta.primaryConstraint);
|
|
3678
|
+
};
|
|
3679
|
+
var readPrimarySummary = (data) => {
|
|
3680
|
+
const meta = readMeta(data);
|
|
3681
|
+
return readNonEmptyString(meta?.primaryConstraintSummary);
|
|
3682
|
+
};
|
|
3683
|
+
var readPrimaryNextStep = (data) => {
|
|
3684
|
+
const constraint = readPrimaryConstraint(data);
|
|
3685
|
+
if (!constraint) return null;
|
|
3686
|
+
const guidance = asRecord(constraint.guidance);
|
|
3687
|
+
if (!guidance) return null;
|
|
3688
|
+
const commands = guidance.recommendedNextCommands;
|
|
3689
|
+
if (!Array.isArray(commands)) return null;
|
|
3690
|
+
const nextStep = commands.find((entry) => typeof entry === "string" && entry.trim().length > 0);
|
|
3691
|
+
return nextStep?.trim() ?? null;
|
|
3692
|
+
};
|
|
3693
|
+
var readFailures = (data) => {
|
|
3694
|
+
const meta = readMeta(data);
|
|
3695
|
+
if (!meta) return [];
|
|
3696
|
+
const failures = meta.failures;
|
|
3697
|
+
return Array.isArray(failures) ? failures.filter((entry) => Boolean(entry) && typeof entry === "object") : [];
|
|
3698
|
+
};
|
|
3699
|
+
var readSuggestedSteps = (data) => {
|
|
3700
|
+
const steps = asRecord(data)?.suggestedSteps;
|
|
3701
|
+
return Array.isArray(steps) ? steps.flatMap((step) => {
|
|
3702
|
+
const record = asRecord(step);
|
|
3703
|
+
return record ? [record] : [];
|
|
3704
|
+
}) : [];
|
|
3705
|
+
};
|
|
3706
|
+
var buildNextStepMessage = (message, nextStep) => {
|
|
3707
|
+
return nextStep ? `${message} Next step: ${nextStep}` : message;
|
|
3708
|
+
};
|
|
3709
|
+
var readSuggestedNextAction = (data) => {
|
|
3710
|
+
const record = asRecord(data);
|
|
3711
|
+
if (!record) return null;
|
|
3712
|
+
return readNonEmptyString(record.suggestedNextAction) ?? readNonEmptyString(asRecord(record.sessionInspector)?.suggestedNextAction);
|
|
3713
|
+
};
|
|
3714
|
+
var readSuggestedStepReason = (data) => {
|
|
3715
|
+
let current = asRecord(data);
|
|
3716
|
+
while (current) {
|
|
3717
|
+
const [firstStep] = readSuggestedSteps(current);
|
|
3718
|
+
if (firstStep) {
|
|
3719
|
+
return readNonEmptyString(firstStep.reason);
|
|
3720
|
+
}
|
|
3721
|
+
current = asRecord(current.challengePlan);
|
|
3722
|
+
}
|
|
3723
|
+
return null;
|
|
3724
|
+
};
|
|
3725
|
+
var buildWorkflowCompletionMessage = (workflowLabel, data) => {
|
|
3726
|
+
const explicitSummary = readPrimarySummary(data);
|
|
3727
|
+
if (explicitSummary) {
|
|
3728
|
+
return buildNextStepMessage(
|
|
3729
|
+
`${workflowLabel} completed with provider follow-up required: ${explicitSummary}`,
|
|
3730
|
+
readPrimaryNextStep(data)
|
|
3731
|
+
);
|
|
3732
|
+
}
|
|
3733
|
+
const inferred = summarizePrimaryProviderIssue(readFailures(data));
|
|
3734
|
+
if (inferred) {
|
|
3735
|
+
return buildNextStepMessage(
|
|
3736
|
+
`${workflowLabel} completed with provider follow-up required: ${inferred.summary}`,
|
|
3737
|
+
inferred.guidance?.recommendedNextCommands[0] ?? null
|
|
3738
|
+
);
|
|
3739
|
+
}
|
|
3740
|
+
return `${workflowLabel} completed.`;
|
|
3741
|
+
};
|
|
3742
|
+
|
|
3743
|
+
// src/cli/commands/session/inspector-shared.ts
|
|
3598
3744
|
function parseSessionInspectorArgs(rawArgs) {
|
|
3599
3745
|
const parsed = {};
|
|
3600
3746
|
for (let index = 0; index < rawArgs.length; index += 1) {
|
|
3601
3747
|
const arg = rawArgs[index];
|
|
3602
|
-
if (arg === "--session-id") {
|
|
3603
|
-
const value = rawArgs[index + 1];
|
|
3604
|
-
if (!value) throw createUsageError("Missing value for --session-id");
|
|
3605
|
-
parsed.sessionId = value;
|
|
3606
|
-
index += 1;
|
|
3607
|
-
continue;
|
|
3608
|
-
}
|
|
3609
|
-
if (arg?.startsWith("--session-id=")) {
|
|
3610
|
-
parsed.sessionId = arg.split("=", 2)[1];
|
|
3611
|
-
continue;
|
|
3612
|
-
}
|
|
3613
3748
|
if (arg === "--include-urls") {
|
|
3614
3749
|
parsed.includeUrls = true;
|
|
3615
3750
|
continue;
|
|
3616
3751
|
}
|
|
3617
|
-
if (arg === "--
|
|
3618
|
-
|
|
3619
|
-
|
|
3620
|
-
parsed.sinceConsoleSeq = parseNumberFlag(value, "--since-console-seq", { min: 0 });
|
|
3621
|
-
index += 1;
|
|
3752
|
+
if (arg === "--session-id" || arg?.startsWith("--session-id=")) {
|
|
3753
|
+
parsed.sessionId = readStringFlag(rawArgs, index, "--session-id");
|
|
3754
|
+
index += stepForValue(arg);
|
|
3622
3755
|
continue;
|
|
3623
3756
|
}
|
|
3624
|
-
if (arg?.startsWith("--since-console-seq=")) {
|
|
3625
|
-
|
|
3626
|
-
|
|
3627
|
-
parsed.sinceConsoleSeq = parseNumberFlag(value, "--since-console-seq", { min: 0 });
|
|
3757
|
+
if (arg === "--since-console-seq" || arg?.startsWith("--since-console-seq=")) {
|
|
3758
|
+
parsed.sinceConsoleSeq = readNumberFlag(rawArgs, index, "--since-console-seq", { min: 0 });
|
|
3759
|
+
index += stepForValue(arg);
|
|
3628
3760
|
continue;
|
|
3629
3761
|
}
|
|
3630
|
-
if (arg === "--since-network-seq") {
|
|
3631
|
-
|
|
3632
|
-
|
|
3633
|
-
parsed.sinceNetworkSeq = parseNumberFlag(value, "--since-network-seq", { min: 0 });
|
|
3634
|
-
index += 1;
|
|
3762
|
+
if (arg === "--since-network-seq" || arg?.startsWith("--since-network-seq=")) {
|
|
3763
|
+
parsed.sinceNetworkSeq = readNumberFlag(rawArgs, index, "--since-network-seq", { min: 0 });
|
|
3764
|
+
index += stepForValue(arg);
|
|
3635
3765
|
continue;
|
|
3636
3766
|
}
|
|
3637
|
-
if (arg?.startsWith("--since-
|
|
3638
|
-
|
|
3639
|
-
|
|
3640
|
-
parsed.sinceNetworkSeq = parseNumberFlag(value, "--since-network-seq", { min: 0 });
|
|
3767
|
+
if (arg === "--since-exception-seq" || arg?.startsWith("--since-exception-seq=")) {
|
|
3768
|
+
parsed.sinceExceptionSeq = readNumberFlag(rawArgs, index, "--since-exception-seq", { min: 0 });
|
|
3769
|
+
index += stepForValue(arg);
|
|
3641
3770
|
continue;
|
|
3642
3771
|
}
|
|
3643
|
-
if (arg === "--
|
|
3644
|
-
|
|
3645
|
-
|
|
3646
|
-
parsed.sinceExceptionSeq = parseNumberFlag(value, "--since-exception-seq", { min: 0 });
|
|
3647
|
-
index += 1;
|
|
3772
|
+
if (arg === "--max" || arg?.startsWith("--max=")) {
|
|
3773
|
+
parsed.max = readNumberFlag(rawArgs, index, "--max", { min: 1 });
|
|
3774
|
+
index += stepForValue(arg);
|
|
3648
3775
|
continue;
|
|
3649
3776
|
}
|
|
3650
|
-
if (arg?.startsWith("--
|
|
3651
|
-
|
|
3652
|
-
|
|
3653
|
-
parsed.sinceExceptionSeq = parseNumberFlag(value, "--since-exception-seq", { min: 0 });
|
|
3654
|
-
continue;
|
|
3655
|
-
}
|
|
3656
|
-
if (arg === "--max") {
|
|
3657
|
-
const value = rawArgs[index + 1];
|
|
3658
|
-
if (!value) throw createUsageError("Missing value for --max");
|
|
3659
|
-
parsed.max = parseNumberFlag(value, "--max", { min: 1 });
|
|
3660
|
-
index += 1;
|
|
3661
|
-
continue;
|
|
3662
|
-
}
|
|
3663
|
-
if (arg?.startsWith("--max=")) {
|
|
3664
|
-
const value = arg.split("=", 2)[1];
|
|
3665
|
-
if (!value) throw createUsageError("Missing value for --max");
|
|
3666
|
-
parsed.max = parseNumberFlag(value, "--max", { min: 1 });
|
|
3667
|
-
continue;
|
|
3668
|
-
}
|
|
3669
|
-
if (arg === "--request-id") {
|
|
3670
|
-
const value = rawArgs[index + 1];
|
|
3671
|
-
if (!value) throw createUsageError("Missing value for --request-id");
|
|
3672
|
-
parsed.requestId = value;
|
|
3673
|
-
index += 1;
|
|
3674
|
-
continue;
|
|
3675
|
-
}
|
|
3676
|
-
if (arg?.startsWith("--request-id=")) {
|
|
3677
|
-
const value = arg.split("=", 2)[1];
|
|
3678
|
-
if (!value) throw createUsageError("Missing value for --request-id");
|
|
3679
|
-
parsed.requestId = value;
|
|
3680
|
-
continue;
|
|
3777
|
+
if (arg === "--request-id" || arg?.startsWith("--request-id=")) {
|
|
3778
|
+
parsed.requestId = readStringFlag(rawArgs, index, "--request-id");
|
|
3779
|
+
index += stepForValue(arg);
|
|
3681
3780
|
}
|
|
3682
3781
|
}
|
|
3683
3782
|
return parsed;
|
|
3684
3783
|
}
|
|
3784
|
+
function stepForValue(flag) {
|
|
3785
|
+
return flag.includes("=") ? 0 : 1;
|
|
3786
|
+
}
|
|
3787
|
+
function readNumberFlag(rawArgs, index, flag, options) {
|
|
3788
|
+
return parseNumberFlag(readStringFlag(rawArgs, index, flag), flag, options);
|
|
3789
|
+
}
|
|
3790
|
+
function readStringFlag(rawArgs, index, flag) {
|
|
3791
|
+
const arg = rawArgs[index];
|
|
3792
|
+
const value = arg?.includes("=") ? arg.split("=", 2)[1] : rawArgs[index + 1];
|
|
3793
|
+
if (!value) {
|
|
3794
|
+
throw createUsageError(`Missing value for ${flag}`);
|
|
3795
|
+
}
|
|
3796
|
+
return value;
|
|
3797
|
+
}
|
|
3798
|
+
|
|
3799
|
+
// src/cli/commands/session/inspector.ts
|
|
3685
3800
|
async function runSessionInspector(args) {
|
|
3686
3801
|
const parsed = parseSessionInspectorArgs(args.rawArgs);
|
|
3687
3802
|
if (!parsed.sessionId) {
|
|
@@ -3698,7 +3813,115 @@ async function runSessionInspector(args) {
|
|
|
3698
3813
|
});
|
|
3699
3814
|
return {
|
|
3700
3815
|
success: true,
|
|
3701
|
-
message:
|
|
3816
|
+
message: buildNextStepMessage(
|
|
3817
|
+
"Session inspector snapshot captured.",
|
|
3818
|
+
readSuggestedNextAction(result)
|
|
3819
|
+
),
|
|
3820
|
+
data: result
|
|
3821
|
+
};
|
|
3822
|
+
}
|
|
3823
|
+
|
|
3824
|
+
// src/cli/transport-timeouts.ts
|
|
3825
|
+
var DEFAULT_CLICK_TRANSPORT_TIMEOUT_MS = 6e4;
|
|
3826
|
+
var DEFAULT_DIALOG_TRANSPORT_TIMEOUT_MS = 3e4;
|
|
3827
|
+
var DEFAULT_TARGET_CREATION_TRANSPORT_TIMEOUT_MS = 3e4;
|
|
3828
|
+
var DEFAULT_SNAPSHOT_TRANSPORT_TIMEOUT_MS = 3e4;
|
|
3829
|
+
var DEFAULT_REVIEW_TRANSPORT_TIMEOUT_MS = 3e4;
|
|
3830
|
+
var DEFAULT_SCREENSHOT_TRANSPORT_TIMEOUT_MS = 3e4;
|
|
3831
|
+
var DEFAULT_WORKFLOW_TRANSPORT_TIMEOUT_MS = 12e4;
|
|
3832
|
+
|
|
3833
|
+
// src/cli/commands/challenge-automation-mode.ts
|
|
3834
|
+
function parseOptionalChallengeAutomationMode(rawArgs) {
|
|
3835
|
+
const value = parseOptionalStringFlag(rawArgs, "--challenge-automation-mode");
|
|
3836
|
+
if (typeof value === "undefined") {
|
|
3837
|
+
return void 0;
|
|
3838
|
+
}
|
|
3839
|
+
if (!isChallengeAutomationMode(value)) {
|
|
3840
|
+
throw createUsageError(`Invalid --challenge-automation-mode: ${value}`);
|
|
3841
|
+
}
|
|
3842
|
+
return value;
|
|
3843
|
+
}
|
|
3844
|
+
|
|
3845
|
+
// src/cli/commands/nav/review-shared.ts
|
|
3846
|
+
function parseOptionalNumberFlag(rawArgs, flag, options) {
|
|
3847
|
+
const value = parseOptionalStringFlag(rawArgs, flag);
|
|
3848
|
+
return typeof value === "string" ? parseNumberFlag(value, flag, options) : void 0;
|
|
3849
|
+
}
|
|
3850
|
+
function parseReviewCommandArgs(rawArgs) {
|
|
3851
|
+
return {
|
|
3852
|
+
sessionId: parseOptionalStringFlag(rawArgs, "--session-id"),
|
|
3853
|
+
targetId: parseOptionalStringFlag(rawArgs, "--target-id"),
|
|
3854
|
+
reason: parseOptionalStringFlag(rawArgs, "--reason"),
|
|
3855
|
+
maxChars: parseOptionalNumberFlag(rawArgs, "--max-chars", { min: 1 }),
|
|
3856
|
+
cursor: parseOptionalStringFlag(rawArgs, "--cursor"),
|
|
3857
|
+
timeoutMs: parseOptionalNumberFlag(rawArgs, "--timeout-ms", { min: 1 })
|
|
3858
|
+
};
|
|
3859
|
+
}
|
|
3860
|
+
|
|
3861
|
+
// src/cli/commands/session/inspector-audit.ts
|
|
3862
|
+
function parseOptionalTimeoutMs(rawArgs) {
|
|
3863
|
+
const value = parseOptionalStringFlag(rawArgs, "--timeout-ms");
|
|
3864
|
+
return typeof value === "string" ? parseNumberFlag(value, "--timeout-ms", { min: 1 }) : void 0;
|
|
3865
|
+
}
|
|
3866
|
+
async function runSessionInspectorAudit(args) {
|
|
3867
|
+
const reviewArgs = parseReviewCommandArgs(args.rawArgs);
|
|
3868
|
+
const inspectorArgs = parseSessionInspectorArgs(args.rawArgs);
|
|
3869
|
+
const challengeAutomationMode = parseOptionalChallengeAutomationMode(args.rawArgs);
|
|
3870
|
+
const timeoutMs = parseOptionalTimeoutMs(args.rawArgs);
|
|
3871
|
+
const sessionId = reviewArgs.sessionId ?? inspectorArgs.sessionId;
|
|
3872
|
+
if (!sessionId) {
|
|
3873
|
+
throw createUsageError("Missing --session-id");
|
|
3874
|
+
}
|
|
3875
|
+
const result = await callDaemon("session.inspectAudit", {
|
|
3876
|
+
sessionId,
|
|
3877
|
+
...typeof reviewArgs.targetId === "string" ? { targetId: reviewArgs.targetId } : {},
|
|
3878
|
+
...typeof reviewArgs.reason === "string" ? { reason: reviewArgs.reason } : {},
|
|
3879
|
+
...typeof reviewArgs.maxChars === "number" ? { maxChars: reviewArgs.maxChars } : {},
|
|
3880
|
+
...typeof reviewArgs.cursor === "string" ? { cursor: reviewArgs.cursor } : {},
|
|
3881
|
+
...typeof inspectorArgs.includeUrls === "boolean" ? { includeUrls: inspectorArgs.includeUrls } : {},
|
|
3882
|
+
...typeof inspectorArgs.sinceConsoleSeq === "number" ? { sinceConsoleSeq: inspectorArgs.sinceConsoleSeq } : {},
|
|
3883
|
+
...typeof inspectorArgs.sinceNetworkSeq === "number" ? { sinceNetworkSeq: inspectorArgs.sinceNetworkSeq } : {},
|
|
3884
|
+
...typeof inspectorArgs.sinceExceptionSeq === "number" ? { sinceExceptionSeq: inspectorArgs.sinceExceptionSeq } : {},
|
|
3885
|
+
...typeof inspectorArgs.max === "number" ? { max: inspectorArgs.max } : {},
|
|
3886
|
+
...typeof inspectorArgs.requestId === "string" ? { requestId: inspectorArgs.requestId } : {},
|
|
3887
|
+
...challengeAutomationMode ? { challengeAutomationMode } : {}
|
|
3888
|
+
}, {
|
|
3889
|
+
timeoutMs: timeoutMs ?? DEFAULT_REVIEW_TRANSPORT_TIMEOUT_MS
|
|
3890
|
+
});
|
|
3891
|
+
const nextStep = readSuggestedNextAction(result) ?? readSuggestedStepReason(result);
|
|
3892
|
+
return {
|
|
3893
|
+
success: true,
|
|
3894
|
+
message: buildNextStepMessage("Correlated audit bundle captured.", nextStep),
|
|
3895
|
+
data: result
|
|
3896
|
+
};
|
|
3897
|
+
}
|
|
3898
|
+
|
|
3899
|
+
// src/cli/commands/session/inspector-plan.ts
|
|
3900
|
+
function parseOptionalTimeoutMs2(rawArgs) {
|
|
3901
|
+
const value = parseOptionalStringFlag(rawArgs, "--timeout-ms");
|
|
3902
|
+
return typeof value === "string" ? parseNumberFlag(value, "--timeout-ms", { min: 1 }) : void 0;
|
|
3903
|
+
}
|
|
3904
|
+
async function runSessionInspectorPlan(args) {
|
|
3905
|
+
const sessionId = parseOptionalStringFlag(args.rawArgs, "--session-id");
|
|
3906
|
+
const targetId = parseOptionalStringFlag(args.rawArgs, "--target-id");
|
|
3907
|
+
const challengeAutomationMode = parseOptionalChallengeAutomationMode(args.rawArgs);
|
|
3908
|
+
const timeoutMs = parseOptionalTimeoutMs2(args.rawArgs);
|
|
3909
|
+
if (!sessionId) {
|
|
3910
|
+
throw createUsageError("Missing --session-id");
|
|
3911
|
+
}
|
|
3912
|
+
const result = await callDaemon("session.inspectPlan", {
|
|
3913
|
+
sessionId,
|
|
3914
|
+
...typeof targetId === "string" ? { targetId } : {},
|
|
3915
|
+
...challengeAutomationMode ? { challengeAutomationMode } : {}
|
|
3916
|
+
}, {
|
|
3917
|
+
timeoutMs: timeoutMs ?? DEFAULT_REVIEW_TRANSPORT_TIMEOUT_MS
|
|
3918
|
+
});
|
|
3919
|
+
return {
|
|
3920
|
+
success: true,
|
|
3921
|
+
message: buildNextStepMessage(
|
|
3922
|
+
"Challenge inspect plan captured.",
|
|
3923
|
+
readSuggestedStepReason(result)
|
|
3924
|
+
),
|
|
3702
3925
|
data: result
|
|
3703
3926
|
};
|
|
3704
3927
|
}
|
|
@@ -3805,6 +4028,30 @@ async function runStatus(args) {
|
|
|
3805
4028
|
};
|
|
3806
4029
|
}
|
|
3807
4030
|
|
|
4031
|
+
// src/cli/commands/status-capabilities.ts
|
|
4032
|
+
function parseOptionalTimeoutMs3(rawArgs) {
|
|
4033
|
+
const value = parseOptionalStringFlag(rawArgs, "--timeout-ms");
|
|
4034
|
+
return typeof value === "string" ? parseNumberFlag(value, "--timeout-ms", { min: 1 }) : void 0;
|
|
4035
|
+
}
|
|
4036
|
+
async function runStatusCapabilities(args) {
|
|
4037
|
+
const sessionId = parseOptionalStringFlag(args.rawArgs, "--session-id");
|
|
4038
|
+
const targetId = parseOptionalStringFlag(args.rawArgs, "--target-id");
|
|
4039
|
+
const challengeAutomationMode = parseOptionalChallengeAutomationMode(args.rawArgs);
|
|
4040
|
+
const timeoutMs = parseOptionalTimeoutMs3(args.rawArgs);
|
|
4041
|
+
const result = await callDaemon("status.capabilities", {
|
|
4042
|
+
...typeof sessionId === "string" ? { sessionId } : {},
|
|
4043
|
+
...typeof targetId === "string" ? { targetId } : {},
|
|
4044
|
+
...challengeAutomationMode ? { challengeAutomationMode } : {}
|
|
4045
|
+
}, {
|
|
4046
|
+
timeoutMs: timeoutMs ?? DEFAULT_REVIEW_TRANSPORT_TIMEOUT_MS
|
|
4047
|
+
});
|
|
4048
|
+
return {
|
|
4049
|
+
success: true,
|
|
4050
|
+
message: "Capability discovery captured.",
|
|
4051
|
+
data: result
|
|
4052
|
+
};
|
|
4053
|
+
}
|
|
4054
|
+
|
|
3808
4055
|
// src/cli/commands/nav/goto.ts
|
|
3809
4056
|
function parseGotoArgs(rawArgs) {
|
|
3810
4057
|
const parsed = {};
|
|
@@ -3954,15 +4201,6 @@ async function runWait(args) {
|
|
|
3954
4201
|
return { success: true, message: "Wait complete.", data: result };
|
|
3955
4202
|
}
|
|
3956
4203
|
|
|
3957
|
-
// src/cli/transport-timeouts.ts
|
|
3958
|
-
var DEFAULT_CLICK_TRANSPORT_TIMEOUT_MS = 6e4;
|
|
3959
|
-
var DEFAULT_DIALOG_TRANSPORT_TIMEOUT_MS = 3e4;
|
|
3960
|
-
var DEFAULT_TARGET_CREATION_TRANSPORT_TIMEOUT_MS = 3e4;
|
|
3961
|
-
var DEFAULT_SNAPSHOT_TRANSPORT_TIMEOUT_MS = 3e4;
|
|
3962
|
-
var DEFAULT_REVIEW_TRANSPORT_TIMEOUT_MS = 3e4;
|
|
3963
|
-
var DEFAULT_SCREENSHOT_TRANSPORT_TIMEOUT_MS = 3e4;
|
|
3964
|
-
var DEFAULT_WORKFLOW_TRANSPORT_TIMEOUT_MS = 12e4;
|
|
3965
|
-
|
|
3966
4204
|
// src/cli/commands/nav/snapshot.ts
|
|
3967
4205
|
function parseSnapshotArgs(rawArgs) {
|
|
3968
4206
|
const parsed = {};
|
|
@@ -4045,61 +4283,8 @@ async function runSnapshot(args) {
|
|
|
4045
4283
|
}
|
|
4046
4284
|
|
|
4047
4285
|
// src/cli/commands/nav/review.ts
|
|
4048
|
-
function parseReviewArgs(rawArgs) {
|
|
4049
|
-
const parsed = {};
|
|
4050
|
-
for (let i = 0; i < rawArgs.length; i += 1) {
|
|
4051
|
-
const arg = rawArgs[i];
|
|
4052
|
-
if (arg === "--session-id") {
|
|
4053
|
-
const value = rawArgs[i + 1];
|
|
4054
|
-
if (!value) throw createUsageError("Missing value for --session-id");
|
|
4055
|
-
parsed.sessionId = value;
|
|
4056
|
-
i += 1;
|
|
4057
|
-
continue;
|
|
4058
|
-
}
|
|
4059
|
-
if (arg?.startsWith("--session-id=")) {
|
|
4060
|
-
parsed.sessionId = arg.split("=", 2)[1];
|
|
4061
|
-
continue;
|
|
4062
|
-
}
|
|
4063
|
-
if (arg === "--max-chars") {
|
|
4064
|
-
const value = rawArgs[i + 1];
|
|
4065
|
-
if (!value) throw createUsageError("Missing value for --max-chars");
|
|
4066
|
-
parsed.maxChars = Number(value);
|
|
4067
|
-
i += 1;
|
|
4068
|
-
continue;
|
|
4069
|
-
}
|
|
4070
|
-
if (arg?.startsWith("--max-chars=")) {
|
|
4071
|
-
parsed.maxChars = Number(arg.split("=", 2)[1]);
|
|
4072
|
-
continue;
|
|
4073
|
-
}
|
|
4074
|
-
if (arg === "--cursor") {
|
|
4075
|
-
const value = rawArgs[i + 1];
|
|
4076
|
-
if (!value) throw createUsageError("Missing value for --cursor");
|
|
4077
|
-
parsed.cursor = value;
|
|
4078
|
-
i += 1;
|
|
4079
|
-
continue;
|
|
4080
|
-
}
|
|
4081
|
-
if (arg?.startsWith("--cursor=")) {
|
|
4082
|
-
parsed.cursor = arg.split("=", 2)[1];
|
|
4083
|
-
continue;
|
|
4084
|
-
}
|
|
4085
|
-
if (arg === "--timeout-ms") {
|
|
4086
|
-
const value = rawArgs[i + 1];
|
|
4087
|
-
if (!value) throw createUsageError("Missing value for --timeout-ms");
|
|
4088
|
-
parsed.timeoutMs = parseNumberFlag(value, "--timeout-ms", { min: 1 });
|
|
4089
|
-
i += 1;
|
|
4090
|
-
continue;
|
|
4091
|
-
}
|
|
4092
|
-
if (arg?.startsWith("--timeout-ms=")) {
|
|
4093
|
-
const value = arg.split("=", 2)[1];
|
|
4094
|
-
if (!value) throw createUsageError("Missing value for --timeout-ms");
|
|
4095
|
-
parsed.timeoutMs = parseNumberFlag(value, "--timeout-ms", { min: 1 });
|
|
4096
|
-
}
|
|
4097
|
-
}
|
|
4098
|
-
return parsed;
|
|
4099
|
-
}
|
|
4100
4286
|
async function runReview(args) {
|
|
4101
|
-
const { sessionId, maxChars, cursor, timeoutMs } =
|
|
4102
|
-
const targetId = parseOptionalStringFlag(args.rawArgs, "--target-id");
|
|
4287
|
+
const { sessionId, targetId, maxChars, cursor, timeoutMs } = parseReviewCommandArgs(args.rawArgs);
|
|
4103
4288
|
if (!sessionId) throw createUsageError("Missing --session-id");
|
|
4104
4289
|
const payload = {
|
|
4105
4290
|
sessionId,
|
|
@@ -4113,6 +4298,28 @@ async function runReview(args) {
|
|
|
4113
4298
|
return { success: true, message: "Review captured.", data: result };
|
|
4114
4299
|
}
|
|
4115
4300
|
|
|
4301
|
+
// src/cli/commands/nav/review-desktop.ts
|
|
4302
|
+
async function runReviewDesktop(args) {
|
|
4303
|
+
const { sessionId, targetId, reason, maxChars, cursor, timeoutMs } = parseReviewCommandArgs(args.rawArgs);
|
|
4304
|
+
if (!sessionId) {
|
|
4305
|
+
throw createUsageError("Missing --session-id");
|
|
4306
|
+
}
|
|
4307
|
+
const result = await callDaemon("nav.reviewDesktop", {
|
|
4308
|
+
sessionId,
|
|
4309
|
+
...typeof targetId === "string" ? { targetId } : {},
|
|
4310
|
+
...typeof reason === "string" ? { reason } : {},
|
|
4311
|
+
...typeof maxChars === "number" ? { maxChars } : {},
|
|
4312
|
+
...typeof cursor === "string" ? { cursor } : {}
|
|
4313
|
+
}, {
|
|
4314
|
+
timeoutMs: timeoutMs ?? DEFAULT_REVIEW_TRANSPORT_TIMEOUT_MS
|
|
4315
|
+
});
|
|
4316
|
+
return {
|
|
4317
|
+
success: true,
|
|
4318
|
+
message: "Desktop-assisted review captured.",
|
|
4319
|
+
data: result
|
|
4320
|
+
};
|
|
4321
|
+
}
|
|
4322
|
+
|
|
4116
4323
|
// src/cli/commands/annotate.ts
|
|
4117
4324
|
var requireValue2 = (value, flag) => {
|
|
4118
4325
|
if (!value) throw createUsageError(`Missing value for ${flag}`);
|
|
@@ -6654,6 +6861,13 @@ async function runCookieList(args) {
|
|
|
6654
6861
|
}
|
|
6655
6862
|
|
|
6656
6863
|
// src/cli/commands/macro-resolve.ts
|
|
6864
|
+
var MACRO_TRANSPORT_TIMEOUT_BUFFER_MS = 6e4;
|
|
6865
|
+
var deriveMacroTransportTimeoutMs = (timeoutMs) => {
|
|
6866
|
+
return Math.max(
|
|
6867
|
+
DEFAULT_WORKFLOW_TRANSPORT_TIMEOUT_MS,
|
|
6868
|
+
timeoutMs + MACRO_TRANSPORT_TIMEOUT_BUFFER_MS
|
|
6869
|
+
);
|
|
6870
|
+
};
|
|
6657
6871
|
var requireValue7 = (value, flag) => {
|
|
6658
6872
|
if (!value) {
|
|
6659
6873
|
throw createUsageError(`Missing value for ${flag}`);
|
|
@@ -6733,7 +6947,9 @@ async function runMacroResolve(args) {
|
|
|
6733
6947
|
...typeof parsed.timeoutMs === "number" ? { timeoutMs: parsed.timeoutMs } : {},
|
|
6734
6948
|
...parsed.challengeAutomationMode ? { challengeAutomationMode: parsed.challengeAutomationMode } : {}
|
|
6735
6949
|
};
|
|
6736
|
-
const result = typeof parsed.timeoutMs === "number" ? await callDaemon("macro.resolve", params, {
|
|
6950
|
+
const result = typeof parsed.timeoutMs === "number" ? await callDaemon("macro.resolve", params, {
|
|
6951
|
+
timeoutMs: deriveMacroTransportTimeoutMs(parsed.timeoutMs)
|
|
6952
|
+
}) : await callDaemon("macro.resolve", params);
|
|
6737
6953
|
return {
|
|
6738
6954
|
success: true,
|
|
6739
6955
|
message: parsed.execute ? "Macro resolved and executed." : "Macro resolved.",
|
|
@@ -6741,36 +6957,6 @@ async function runMacroResolve(args) {
|
|
|
6741
6957
|
};
|
|
6742
6958
|
}
|
|
6743
6959
|
|
|
6744
|
-
// src/cli/utils/workflow-message.ts
|
|
6745
|
-
var readMeta = (data) => {
|
|
6746
|
-
if (!data || typeof data !== "object" || Array.isArray(data)) return null;
|
|
6747
|
-
const meta = data.meta;
|
|
6748
|
-
return meta && typeof meta === "object" && !Array.isArray(meta) ? meta : null;
|
|
6749
|
-
};
|
|
6750
|
-
var readPrimarySummary = (data) => {
|
|
6751
|
-
const meta = readMeta(data);
|
|
6752
|
-
if (!meta) return null;
|
|
6753
|
-
const summary = meta.primaryConstraintSummary;
|
|
6754
|
-
return typeof summary === "string" && summary.trim().length > 0 ? summary.trim() : null;
|
|
6755
|
-
};
|
|
6756
|
-
var readFailures = (data) => {
|
|
6757
|
-
const meta = readMeta(data);
|
|
6758
|
-
if (!meta) return [];
|
|
6759
|
-
const failures = meta.failures;
|
|
6760
|
-
return Array.isArray(failures) ? failures.filter((entry) => Boolean(entry) && typeof entry === "object") : [];
|
|
6761
|
-
};
|
|
6762
|
-
var buildWorkflowCompletionMessage = (workflowLabel, data) => {
|
|
6763
|
-
const explicitSummary = readPrimarySummary(data);
|
|
6764
|
-
if (explicitSummary) {
|
|
6765
|
-
return `${workflowLabel} completed with provider follow-up required: ${explicitSummary}`;
|
|
6766
|
-
}
|
|
6767
|
-
const inferred = summarizePrimaryProviderIssue(readFailures(data));
|
|
6768
|
-
if (inferred) {
|
|
6769
|
-
return `${workflowLabel} completed with provider follow-up required: ${inferred.summary}`;
|
|
6770
|
-
}
|
|
6771
|
-
return `${workflowLabel} completed.`;
|
|
6772
|
-
};
|
|
6773
|
-
|
|
6774
6960
|
// src/cli/commands/research.ts
|
|
6775
6961
|
var SOURCE_VALUES = /* @__PURE__ */ new Set(["web", "community", "social", "shopping"]);
|
|
6776
6962
|
var SOURCE_SELECTION_VALUES = /* @__PURE__ */ new Set(["auto", "web", "community", "social", "shopping", "all"]);
|
|
@@ -7403,10 +7589,177 @@ async function runProductVideoCommand(args) {
|
|
|
7403
7589
|
};
|
|
7404
7590
|
}
|
|
7405
7591
|
|
|
7592
|
+
// src/cli/commands/inspiredesign.ts
|
|
7593
|
+
var MODE_VALUES3 = /* @__PURE__ */ new Set(["compact", "json", "md", "context", "path"]);
|
|
7594
|
+
var CAPTURE_MODE_VALUES = /* @__PURE__ */ new Set(["off", "deep"]);
|
|
7595
|
+
var COOKIE_POLICY_VALUES4 = /* @__PURE__ */ new Set(["off", "auto", "required"]);
|
|
7596
|
+
var requireValue11 = (rawArgs, index, flag) => {
|
|
7597
|
+
const value = rawArgs[index + 1];
|
|
7598
|
+
if (!value) {
|
|
7599
|
+
throw createUsageError(`Missing value for ${flag}`);
|
|
7600
|
+
}
|
|
7601
|
+
return value;
|
|
7602
|
+
};
|
|
7603
|
+
var parseInspiredesignRunArgs = (rawArgs) => {
|
|
7604
|
+
const parsed = {
|
|
7605
|
+
brief: parseOptionalStringFlag(rawArgs, "--brief"),
|
|
7606
|
+
urls: parseRepeatedStringFlag(rawArgs, "--url")
|
|
7607
|
+
};
|
|
7608
|
+
for (let index = 0; index < rawArgs.length; index += 1) {
|
|
7609
|
+
const arg = rawArgs[index];
|
|
7610
|
+
if (arg === "--brief" || arg === "--url") {
|
|
7611
|
+
index += 1;
|
|
7612
|
+
continue;
|
|
7613
|
+
}
|
|
7614
|
+
if (arg?.startsWith("--brief=") || arg?.startsWith("--url=")) {
|
|
7615
|
+
continue;
|
|
7616
|
+
}
|
|
7617
|
+
if (arg === "--capture-mode") {
|
|
7618
|
+
const value = requireValue11(rawArgs, index, "--capture-mode").toLowerCase();
|
|
7619
|
+
if (!CAPTURE_MODE_VALUES.has(value)) {
|
|
7620
|
+
throw createUsageError(`Invalid --capture-mode: ${value}`);
|
|
7621
|
+
}
|
|
7622
|
+
parsed.captureMode = value;
|
|
7623
|
+
index += 1;
|
|
7624
|
+
continue;
|
|
7625
|
+
}
|
|
7626
|
+
if (arg?.startsWith("--capture-mode=")) {
|
|
7627
|
+
const value = (arg.split("=", 2)[1] ?? "").toLowerCase();
|
|
7628
|
+
if (!CAPTURE_MODE_VALUES.has(value)) {
|
|
7629
|
+
throw createUsageError(`Invalid --capture-mode: ${value}`);
|
|
7630
|
+
}
|
|
7631
|
+
parsed.captureMode = value;
|
|
7632
|
+
continue;
|
|
7633
|
+
}
|
|
7634
|
+
if (arg === "--include-prototype-guidance") {
|
|
7635
|
+
parsed.includePrototypeGuidance = true;
|
|
7636
|
+
continue;
|
|
7637
|
+
}
|
|
7638
|
+
if (arg?.startsWith("--include-prototype-guidance=")) {
|
|
7639
|
+
parsed.includePrototypeGuidance = parseBooleanFlag(arg.split("=", 2)[1] ?? "", "--include-prototype-guidance");
|
|
7640
|
+
continue;
|
|
7641
|
+
}
|
|
7642
|
+
if (arg === "--mode") {
|
|
7643
|
+
const value = requireValue11(rawArgs, index, "--mode").toLowerCase();
|
|
7644
|
+
if (!MODE_VALUES3.has(value)) {
|
|
7645
|
+
throw createUsageError(`Invalid --mode: ${value}`);
|
|
7646
|
+
}
|
|
7647
|
+
parsed.mode = value;
|
|
7648
|
+
index += 1;
|
|
7649
|
+
continue;
|
|
7650
|
+
}
|
|
7651
|
+
if (arg?.startsWith("--mode=")) {
|
|
7652
|
+
const value = (arg.split("=", 2)[1] ?? "").toLowerCase();
|
|
7653
|
+
if (!MODE_VALUES3.has(value)) {
|
|
7654
|
+
throw createUsageError(`Invalid --mode: ${value}`);
|
|
7655
|
+
}
|
|
7656
|
+
parsed.mode = value;
|
|
7657
|
+
continue;
|
|
7658
|
+
}
|
|
7659
|
+
if (arg === "--timeout-ms") {
|
|
7660
|
+
parsed.timeoutMs = parseNumberFlag(requireValue11(rawArgs, index, "--timeout-ms"), "--timeout-ms", { min: 1 });
|
|
7661
|
+
index += 1;
|
|
7662
|
+
continue;
|
|
7663
|
+
}
|
|
7664
|
+
if (arg?.startsWith("--timeout-ms=")) {
|
|
7665
|
+
parsed.timeoutMs = parseNumberFlag(arg.split("=", 2)[1] ?? "", "--timeout-ms", { min: 1 });
|
|
7666
|
+
continue;
|
|
7667
|
+
}
|
|
7668
|
+
if (arg === "--output-dir") {
|
|
7669
|
+
parsed.outputDir = requireValue11(rawArgs, index, "--output-dir");
|
|
7670
|
+
index += 1;
|
|
7671
|
+
continue;
|
|
7672
|
+
}
|
|
7673
|
+
if (arg?.startsWith("--output-dir=")) {
|
|
7674
|
+
parsed.outputDir = arg.split("=", 2)[1];
|
|
7675
|
+
continue;
|
|
7676
|
+
}
|
|
7677
|
+
if (arg === "--ttl-hours") {
|
|
7678
|
+
parsed.ttlHours = parseNumberFlag(requireValue11(rawArgs, index, "--ttl-hours"), "--ttl-hours", { min: 1, max: 168 });
|
|
7679
|
+
index += 1;
|
|
7680
|
+
continue;
|
|
7681
|
+
}
|
|
7682
|
+
if (arg?.startsWith("--ttl-hours=")) {
|
|
7683
|
+
parsed.ttlHours = parseNumberFlag(arg.split("=", 2)[1] ?? "", "--ttl-hours", { min: 1, max: 168 });
|
|
7684
|
+
continue;
|
|
7685
|
+
}
|
|
7686
|
+
if (arg === "--use-cookies") {
|
|
7687
|
+
parsed.useCookies = true;
|
|
7688
|
+
continue;
|
|
7689
|
+
}
|
|
7690
|
+
if (arg?.startsWith("--use-cookies=")) {
|
|
7691
|
+
parsed.useCookies = parseBooleanFlag(arg.split("=", 2)[1] ?? "", "--use-cookies");
|
|
7692
|
+
continue;
|
|
7693
|
+
}
|
|
7694
|
+
if (arg === "--challenge-automation-mode") {
|
|
7695
|
+
const value = requireValue11(rawArgs, index, "--challenge-automation-mode");
|
|
7696
|
+
if (!isChallengeAutomationMode(value)) {
|
|
7697
|
+
throw createUsageError(`Invalid --challenge-automation-mode: ${value}`);
|
|
7698
|
+
}
|
|
7699
|
+
parsed.challengeAutomationMode = value;
|
|
7700
|
+
index += 1;
|
|
7701
|
+
continue;
|
|
7702
|
+
}
|
|
7703
|
+
if (arg?.startsWith("--challenge-automation-mode=")) {
|
|
7704
|
+
const value = arg.split("=", 2)[1] ?? "";
|
|
7705
|
+
if (!isChallengeAutomationMode(value)) {
|
|
7706
|
+
throw createUsageError(`Invalid --challenge-automation-mode: ${value}`);
|
|
7707
|
+
}
|
|
7708
|
+
parsed.challengeAutomationMode = value;
|
|
7709
|
+
continue;
|
|
7710
|
+
}
|
|
7711
|
+
if (arg === "--cookie-policy-override" || arg === "--cookie-policy") {
|
|
7712
|
+
const value = requireValue11(rawArgs, index, arg).toLowerCase();
|
|
7713
|
+
if (!COOKIE_POLICY_VALUES4.has(value)) {
|
|
7714
|
+
throw createUsageError(`Invalid ${arg}: ${value}`);
|
|
7715
|
+
}
|
|
7716
|
+
parsed.cookiePolicyOverride = value;
|
|
7717
|
+
index += 1;
|
|
7718
|
+
continue;
|
|
7719
|
+
}
|
|
7720
|
+
if (arg?.startsWith("--cookie-policy-override=") || arg?.startsWith("--cookie-policy=")) {
|
|
7721
|
+
const value = (arg.split("=", 2)[1] ?? "").toLowerCase();
|
|
7722
|
+
if (!COOKIE_POLICY_VALUES4.has(value)) {
|
|
7723
|
+
throw createUsageError(`Invalid --cookie-policy-override: ${value}`);
|
|
7724
|
+
}
|
|
7725
|
+
parsed.cookiePolicyOverride = value;
|
|
7726
|
+
}
|
|
7727
|
+
}
|
|
7728
|
+
return parsed;
|
|
7729
|
+
};
|
|
7730
|
+
async function runInspiredesignCommand(args) {
|
|
7731
|
+
const [subcommand, ...rest] = args.rawArgs;
|
|
7732
|
+
if (subcommand !== "run") {
|
|
7733
|
+
throw createUsageError("Usage: opendevbrowser inspiredesign run --brief <value> [--url <url>] [options]");
|
|
7734
|
+
}
|
|
7735
|
+
const parsed = parseInspiredesignRunArgs(rest);
|
|
7736
|
+
if (!parsed.brief?.trim()) {
|
|
7737
|
+
throw createUsageError("Missing --brief");
|
|
7738
|
+
}
|
|
7739
|
+
const data = await callDaemon("inspiredesign.run", {
|
|
7740
|
+
brief: parsed.brief,
|
|
7741
|
+
urls: parsed.urls,
|
|
7742
|
+
captureMode: parsed.captureMode ?? "off",
|
|
7743
|
+
includePrototypeGuidance: parsed.includePrototypeGuidance,
|
|
7744
|
+
mode: parsed.mode ?? "compact",
|
|
7745
|
+
timeoutMs: parsed.timeoutMs ?? DEFAULT_WORKFLOW_TRANSPORT_TIMEOUT_MS,
|
|
7746
|
+
outputDir: parsed.outputDir,
|
|
7747
|
+
ttlHours: parsed.ttlHours,
|
|
7748
|
+
useCookies: parsed.useCookies,
|
|
7749
|
+
challengeAutomationMode: parsed.challengeAutomationMode,
|
|
7750
|
+
cookiePolicyOverride: parsed.cookiePolicyOverride
|
|
7751
|
+
});
|
|
7752
|
+
return {
|
|
7753
|
+
success: true,
|
|
7754
|
+
message: buildWorkflowCompletionMessage("Inspiredesign workflow", data),
|
|
7755
|
+
data
|
|
7756
|
+
};
|
|
7757
|
+
}
|
|
7758
|
+
|
|
7406
7759
|
// package.json
|
|
7407
7760
|
var package_default = {
|
|
7408
7761
|
name: "opendevbrowser",
|
|
7409
|
-
version: "0.0.
|
|
7762
|
+
version: "0.0.20",
|
|
7410
7763
|
description: "Browser automation runtime with snapshot-refs-actions, browser replay screencasts, public read-only desktop observation, and browser-scoped computer-use orchestration",
|
|
7411
7764
|
type: "module",
|
|
7412
7765
|
main: "dist/index.js",
|
|
@@ -7451,10 +7804,10 @@ var package_default = {
|
|
|
7451
7804
|
node: ">=18"
|
|
7452
7805
|
},
|
|
7453
7806
|
scripts: {
|
|
7454
|
-
build: "tsup src/index.ts src/cli/index.ts src/skills/skill-loader.ts --format esm --clean --sourcemap && tsc --emitDeclarationOnly --declaration --declarationMap -p tsconfig.json && node scripts/postbuild-dist.mjs",
|
|
7807
|
+
build: "node scripts/run-package-tool.mjs tsup src/index.ts src/cli/index.ts src/skills/skill-loader.ts --format esm --clean --sourcemap && node scripts/run-package-tool.mjs tsc --emitDeclarationOnly --declaration --declarationMap -p tsconfig.json && node scripts/postbuild-dist.mjs",
|
|
7455
7808
|
dev: "tsup src/index.ts src/cli/index.ts src/skills/skill-loader.ts --format esm --dts --watch",
|
|
7456
|
-
lint: 'eslint "src/**/*.ts" "tests/**/*.ts"',
|
|
7457
|
-
typecheck: "tsc --noEmit -p tsconfig.json",
|
|
7809
|
+
lint: 'node scripts/run-package-tool.mjs eslint "src/**/*.ts" "tests/**/*.ts"',
|
|
7810
|
+
typecheck: "node scripts/run-package-tool.mjs tsc --noEmit -p tsconfig.json",
|
|
7458
7811
|
test: "node scripts/run-vitest-coverage.mjs",
|
|
7459
7812
|
"test:release-gate": "node scripts/release-gate-test-groups.mjs",
|
|
7460
7813
|
"test:release-gate:g1": "node scripts/release-gate-test-groups.mjs --group 1",
|
|
@@ -7463,7 +7816,7 @@ var package_default = {
|
|
|
7463
7816
|
"test:release-gate:g4": "node scripts/release-gate-test-groups.mjs --group 4",
|
|
7464
7817
|
"test:release-gate:g5": "node scripts/release-gate-test-groups.mjs --group 5",
|
|
7465
7818
|
"extension:sync": "node scripts/sync-extension-version.mjs",
|
|
7466
|
-
"extension:build": "npm run extension:sync && tsc -p extension/tsconfig.json && node scripts/copy-extension-assets.mjs",
|
|
7819
|
+
"extension:build": "npm run extension:sync && node scripts/run-package-tool.mjs tsc -p extension/tsconfig.json && node scripts/copy-extension-assets.mjs",
|
|
7467
7820
|
"extension:pack": "cd extension && zip -r ../opendevbrowser-extension.zip manifest.json popup.html canvas.html dist/ icons/",
|
|
7468
7821
|
"extension:store": "node scripts/chrome-store-publish.mjs",
|
|
7469
7822
|
"version:check": "node scripts/verify-versions.mjs",
|
|
@@ -7827,11 +8180,26 @@ async function main() {
|
|
|
7827
8180
|
description: "Get daemon or session status",
|
|
7828
8181
|
run: async () => runStatus(args)
|
|
7829
8182
|
});
|
|
8183
|
+
registerCommand({
|
|
8184
|
+
name: "status-capabilities",
|
|
8185
|
+
description: "Inspect runtime capability discovery for the host and an optional session",
|
|
8186
|
+
run: async () => runStatusCapabilities(args)
|
|
8187
|
+
});
|
|
7830
8188
|
registerCommand({
|
|
7831
8189
|
name: "session-inspector",
|
|
7832
8190
|
description: "Capture a session-first diagnostic summary with relay health and trace proof",
|
|
7833
8191
|
run: async () => runSessionInspector(args)
|
|
7834
8192
|
});
|
|
8193
|
+
registerCommand({
|
|
8194
|
+
name: "session-inspector-plan",
|
|
8195
|
+
description: "Inspect browser-scoped computer-use policy and safe suggested steps",
|
|
8196
|
+
run: async () => runSessionInspectorPlan(args)
|
|
8197
|
+
});
|
|
8198
|
+
registerCommand({
|
|
8199
|
+
name: "session-inspector-audit",
|
|
8200
|
+
description: "Capture a correlated audit bundle across desktop evidence, browser review, and policy state",
|
|
8201
|
+
run: async () => runSessionInspectorAudit(args)
|
|
8202
|
+
});
|
|
7835
8203
|
registerCommand({
|
|
7836
8204
|
name: "goto",
|
|
7837
8205
|
description: "Navigate current session to a URL",
|
|
@@ -7852,6 +8220,11 @@ async function main() {
|
|
|
7852
8220
|
description: "Capture a first-class review payload for the active page",
|
|
7853
8221
|
run: async () => runReview(args)
|
|
7854
8222
|
});
|
|
8223
|
+
registerCommand({
|
|
8224
|
+
name: "review-desktop",
|
|
8225
|
+
description: "Capture desktop-assisted browser review with read-only desktop evidence",
|
|
8226
|
+
run: async () => runReviewDesktop(args)
|
|
8227
|
+
});
|
|
7855
8228
|
registerCommand({
|
|
7856
8229
|
name: "annotate",
|
|
7857
8230
|
description: "Request interactive annotations via direct or relay transport",
|
|
@@ -8117,6 +8490,11 @@ async function main() {
|
|
|
8117
8490
|
description: "Run product presentation asset workflows",
|
|
8118
8491
|
run: async () => runProductVideoCommand(args)
|
|
8119
8492
|
});
|
|
8493
|
+
registerCommand({
|
|
8494
|
+
name: "inspiredesign",
|
|
8495
|
+
description: "Run inspiredesign workflows",
|
|
8496
|
+
run: async () => runInspiredesignCommand(args)
|
|
8497
|
+
});
|
|
8120
8498
|
registerCommand({
|
|
8121
8499
|
name: "artifacts",
|
|
8122
8500
|
description: "Manage workflow artifact lifecycle",
|