agent-nuvira 3.3.8 → 3.3.9
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 +57 -50
- package/dist/agents/agents/planner.d.ts.map +1 -1
- package/dist/agents/agents/planner.js +41 -0
- package/dist/agents/agents/planner.js.map +1 -1
- package/dist/agents/agents/reasoner.d.ts.map +1 -1
- package/dist/agents/agents/reasoner.js +6 -0
- package/dist/agents/agents/reasoner.js.map +1 -1
- package/dist/agents/agents/runner.d.ts +6 -0
- package/dist/agents/agents/runner.d.ts.map +1 -1
- package/dist/agents/agents/runner.js +82 -5
- package/dist/agents/agents/runner.js.map +1 -1
- package/dist/agents/agents/writer-tool-calling.d.ts.map +1 -1
- package/dist/agents/agents/writer-tool-calling.js +5 -2
- package/dist/agents/agents/writer-tool-calling.js.map +1 -1
- package/dist/agents/agents/writer.d.ts.map +1 -1
- package/dist/agents/agents/writer.js +8 -4
- package/dist/agents/agents/writer.js.map +1 -1
- package/dist/agents/fanout-scheduler.d.ts +72 -0
- package/dist/agents/fanout-scheduler.d.ts.map +1 -0
- package/dist/agents/fanout-scheduler.js +100 -0
- package/dist/agents/fanout-scheduler.js.map +1 -0
- package/dist/agents/orchestrator.d.ts.map +1 -1
- package/dist/agents/orchestrator.js +30 -1
- package/dist/agents/orchestrator.js.map +1 -1
- package/dist/agents/plan-quality.d.ts +58 -0
- package/dist/agents/plan-quality.d.ts.map +1 -0
- package/dist/agents/plan-quality.js +152 -0
- package/dist/agents/plan-quality.js.map +1 -0
- package/dist/agents/prompt-assembly.d.ts +8 -0
- package/dist/agents/prompt-assembly.d.ts.map +1 -1
- package/dist/agents/prompt-assembly.js +18 -0
- package/dist/agents/prompt-assembly.js.map +1 -1
- package/dist/agents/step-handoff.d.ts +12 -2
- package/dist/agents/step-handoff.d.ts.map +1 -1
- package/dist/agents/step-handoff.js +65 -8
- package/dist/agents/step-handoff.js.map +1 -1
- package/dist/agents/tool-calling-agent.d.ts.map +1 -1
- package/dist/agents/tool-calling-agent.js +18 -0
- package/dist/agents/tool-calling-agent.js.map +1 -1
- package/dist/cli/cache.d.ts.map +1 -1
- package/dist/cli/cache.js +34 -4
- package/dist/cli/cache.js.map +1 -1
- package/dist/cli/chat.d.ts +6 -0
- package/dist/cli/chat.d.ts.map +1 -1
- package/dist/cli/chat.js +79 -18
- package/dist/cli/chat.js.map +1 -1
- package/dist/cli/cli-program.d.ts.map +1 -1
- package/dist/cli/cli-program.js +6 -0
- package/dist/cli/cli-program.js.map +1 -1
- package/dist/cli/config.d.ts +10 -0
- package/dist/cli/config.d.ts.map +1 -1
- package/dist/cli/config.js +179 -1
- package/dist/cli/config.js.map +1 -1
- package/dist/cli/continuity.d.ts +61 -0
- package/dist/cli/continuity.d.ts.map +1 -0
- package/dist/cli/continuity.js +112 -0
- package/dist/cli/continuity.js.map +1 -0
- package/dist/cli/dashboard.d.ts +3 -1
- package/dist/cli/dashboard.d.ts.map +1 -1
- package/dist/cli/dashboard.js +5 -16
- package/dist/cli/dashboard.js.map +1 -1
- package/dist/cli/doctor.d.ts.map +1 -1
- package/dist/cli/doctor.js +48 -1
- package/dist/cli/doctor.js.map +1 -1
- package/dist/cli/execute.d.ts +8 -0
- package/dist/cli/execute.d.ts.map +1 -1
- package/dist/cli/execute.js +34 -1
- package/dist/cli/execute.js.map +1 -1
- package/dist/cli/loop-executor.d.ts +24 -0
- package/dist/cli/loop-executor.d.ts.map +1 -1
- package/dist/cli/loop-executor.js +134 -13
- package/dist/cli/loop-executor.js.map +1 -1
- package/dist/cli/website.d.ts +25 -0
- package/dist/cli/website.d.ts.map +1 -0
- package/dist/cli/website.js +58 -0
- package/dist/cli/website.js.map +1 -0
- package/dist/config/manager.d.ts.map +1 -1
- package/dist/config/manager.js +35 -0
- package/dist/config/manager.js.map +1 -1
- package/dist/config/process-env.d.ts.map +1 -1
- package/dist/config/process-env.js +20 -0
- package/dist/config/process-env.js.map +1 -1
- package/dist/config/provider-env.d.ts +2 -1
- package/dist/config/provider-env.d.ts.map +1 -1
- package/dist/config/provider-env.js +19 -2
- package/dist/config/provider-env.js.map +1 -1
- package/dist/config/service-catalog.d.ts +81 -0
- package/dist/config/service-catalog.d.ts.map +1 -0
- package/dist/config/service-catalog.js +286 -0
- package/dist/config/service-catalog.js.map +1 -0
- package/dist/config/service-probe.d.ts +27 -0
- package/dist/config/service-probe.d.ts.map +1 -0
- package/dist/config/service-probe.js +104 -0
- package/dist/config/service-probe.js.map +1 -0
- package/dist/config/types.d.ts +63 -0
- package/dist/config/types.d.ts.map +1 -1
- package/dist/context/cache.d.ts +46 -2
- package/dist/context/cache.d.ts.map +1 -1
- package/dist/context/cache.js +85 -7
- package/dist/context/cache.js.map +1 -1
- package/dist/findings/verdicts.d.ts +59 -0
- package/dist/findings/verdicts.d.ts.map +1 -1
- package/dist/findings/verdicts.js +117 -0
- package/dist/findings/verdicts.js.map +1 -1
- package/dist/forwarded.d.ts +2 -0
- package/dist/forwarded.d.ts.map +1 -0
- package/dist/forwarded.js +2 -0
- package/dist/forwarded.js.map +1 -0
- package/dist/gateway/registry.d.ts.map +1 -1
- package/dist/gateway/registry.js +9 -0
- package/dist/gateway/registry.js.map +1 -1
- package/dist/learning/auto-router.d.ts +30 -0
- package/dist/learning/auto-router.d.ts.map +1 -1
- package/dist/learning/auto-router.js +69 -12
- package/dist/learning/auto-router.js.map +1 -1
- package/dist/learning/context-assembly.d.ts +37 -0
- package/dist/learning/context-assembly.d.ts.map +1 -0
- package/dist/learning/context-assembly.js +63 -0
- package/dist/learning/context-assembly.js.map +1 -0
- package/dist/learning/reasoning-trace.d.ts +26 -5
- package/dist/learning/reasoning-trace.d.ts.map +1 -1
- package/dist/learning/reasoning-trace.js +21 -1
- package/dist/learning/reasoning-trace.js.map +1 -1
- package/dist/learning/session-digest.d.ts +78 -0
- package/dist/learning/session-digest.d.ts.map +1 -0
- package/dist/learning/session-digest.js +185 -0
- package/dist/learning/session-digest.js.map +1 -0
- package/dist/learning/session-recall.d.ts +135 -0
- package/dist/learning/session-recall.d.ts.map +1 -0
- package/dist/learning/session-recall.js +305 -0
- package/dist/learning/session-recall.js.map +1 -0
- package/dist/learning/session-store.d.ts +172 -0
- package/dist/learning/session-store.d.ts.map +1 -0
- package/dist/learning/session-store.js +424 -0
- package/dist/learning/session-store.js.map +1 -0
- package/dist/learning/step-checkpoint.d.ts +28 -0
- package/dist/learning/step-checkpoint.d.ts.map +1 -1
- package/dist/learning/step-checkpoint.js +90 -6
- package/dist/learning/step-checkpoint.js.map +1 -1
- package/dist/learning/working-state.d.ts +19 -0
- package/dist/learning/working-state.d.ts.map +1 -1
- package/dist/learning/working-state.js +34 -1
- package/dist/learning/working-state.js.map +1 -1
- package/dist/parity/drivers.d.ts.map +1 -1
- package/dist/parity/drivers.js +29 -0
- package/dist/parity/drivers.js.map +1 -1
- package/dist/parity/wire-fixtures.d.ts +88 -0
- package/dist/parity/wire-fixtures.d.ts.map +1 -0
- package/dist/parity/wire-fixtures.js +405 -0
- package/dist/parity/wire-fixtures.js.map +1 -0
- package/dist/tools/artifact-append.d.ts +23 -0
- package/dist/tools/artifact-append.d.ts.map +1 -1
- package/dist/tools/artifact-append.js +28 -0
- package/dist/tools/artifact-append.js.map +1 -1
- package/dist/tools/ask-user.d.ts +5 -0
- package/dist/tools/ask-user.d.ts.map +1 -1
- package/dist/tools/ask-user.js +51 -5
- package/dist/tools/ask-user.js.map +1 -1
- package/dist/tools/child-agent-entry.js +1 -0
- package/dist/tools/child-agent-entry.js.map +1 -1
- package/dist/tools/child-agent-runtime.d.ts +7 -0
- package/dist/tools/child-agent-runtime.d.ts.map +1 -1
- package/dist/tools/child-agent-runtime.js +116 -6
- package/dist/tools/child-agent-runtime.js.map +1 -1
- package/dist/tools/child-agent-worker.d.ts +15 -0
- package/dist/tools/child-agent-worker.d.ts.map +1 -0
- package/dist/tools/child-agent-worker.js.map +1 -0
- package/dist/tools/coding-tools.d.ts.map +1 -1
- package/dist/tools/coding-tools.js +11 -0
- package/dist/tools/coding-tools.js.map +1 -1
- package/dist/tools/finding-tool.d.ts +6 -1
- package/dist/tools/finding-tool.d.ts.map +1 -1
- package/dist/tools/finding-tool.js +15 -2
- package/dist/tools/finding-tool.js.map +1 -1
- package/dist/tools/followup-utils.d.ts +35 -0
- package/dist/tools/followup-utils.d.ts.map +1 -1
- package/dist/tools/followup-utils.js +36 -0
- package/dist/tools/followup-utils.js.map +1 -1
- package/dist/tools/loop-project-context.d.ts +4 -1
- package/dist/tools/loop-project-context.d.ts.map +1 -1
- package/dist/tools/loop-project-context.js +48 -1
- package/dist/tools/loop-project-context.js.map +1 -1
- package/dist/tools/loop-skill-hint.d.ts.map +1 -1
- package/dist/tools/loop-skill-hint.js +7 -0
- package/dist/tools/loop-skill-hint.js.map +1 -1
- package/dist/tools/modality/image-gen.d.ts +25 -6
- package/dist/tools/modality/image-gen.d.ts.map +1 -1
- package/dist/tools/modality/image-gen.js +46 -27
- package/dist/tools/modality/image-gen.js.map +1 -1
- package/dist/tools/modality/image-providers.d.ts +71 -0
- package/dist/tools/modality/image-providers.d.ts.map +1 -0
- package/dist/tools/modality/image-providers.js +277 -0
- package/dist/tools/modality/image-providers.js.map +1 -0
- package/dist/tools/registry.d.ts +10 -1
- package/dist/tools/registry.d.ts.map +1 -1
- package/dist/tools/registry.js +35 -8
- package/dist/tools/registry.js.map +1 -1
- package/dist/tools/run-cli.d.ts.map +1 -1
- package/dist/tools/run-cli.js +39 -1
- package/dist/tools/run-cli.js.map +1 -1
- package/dist/tools/run-terminal.d.ts.map +1 -1
- package/dist/tools/run-terminal.js +50 -6
- package/dist/tools/run-terminal.js.map +1 -1
- package/dist/tools/subagent-spawner.d.ts +8 -0
- package/dist/tools/subagent-spawner.d.ts.map +1 -1
- package/dist/tools/subagent-spawner.js +3 -0
- package/dist/tools/subagent-spawner.js.map +1 -1
- package/dist/tools/tool-loop.d.ts +55 -0
- package/dist/tools/tool-loop.d.ts.map +1 -1
- package/dist/tools/tool-loop.js +136 -0
- package/dist/tools/tool-loop.js.map +1 -1
- package/dist/tools/untrusted-content.d.ts +29 -0
- package/dist/tools/untrusted-content.d.ts.map +1 -0
- package/dist/tools/untrusted-content.js +53 -0
- package/dist/tools/untrusted-content.js.map +1 -0
- package/dist/tools/web-research.d.ts +76 -14
- package/dist/tools/web-research.d.ts.map +1 -1
- package/dist/tools/web-research.js +280 -35
- package/dist/tools/web-research.js.map +1 -1
- package/dist/utils/effect-verification.d.ts +115 -0
- package/dist/utils/effect-verification.d.ts.map +1 -0
- package/dist/utils/effect-verification.js +337 -0
- package/dist/utils/effect-verification.js.map +1 -0
- package/dist/utils/open-url.d.ts +16 -0
- package/dist/utils/open-url.d.ts.map +1 -0
- package/dist/utils/open-url.js +32 -0
- package/dist/utils/open-url.js.map +1 -0
- package/dist/utils/project-env.d.ts +146 -0
- package/dist/utils/project-env.d.ts.map +1 -0
- package/dist/utils/project-env.js +584 -0
- package/dist/utils/project-env.js.map +1 -0
- package/dist/utils/shell.d.ts +7 -0
- package/dist/utils/shell.d.ts.map +1 -1
- package/dist/utils/shell.js +2 -0
- package/dist/utils/shell.js.map +1 -1
- package/dist/web-dashboard/chat-console.d.ts +2 -0
- package/dist/web-dashboard/chat-console.d.ts.map +1 -1
- package/dist/web-dashboard/chat-console.js +7 -0
- package/dist/web-dashboard/chat-console.js.map +1 -1
- package/dist/web-dashboard/server.d.ts +3 -1
- package/dist/web-dashboard/server.d.ts.map +1 -1
- package/dist/web-dashboard/server.js +534 -8
- package/dist/web-dashboard/server.js.map +1 -1
- package/dist/web-dashboard/src/types.d.ts +150 -1
- package/dist/web-dashboard/src/types.d.ts.map +1 -1
- package/dist/web-dashboard/workspace-guard.d.ts +40 -0
- package/dist/web-dashboard/workspace-guard.d.ts.map +1 -0
- package/dist/web-dashboard/workspace-guard.js +92 -0
- package/dist/web-dashboard/workspace-guard.js.map +1 -0
- package/package.json +3 -1
- package/src/web-dashboard/public/assets/index-Beportyl.js +207 -0
- package/src/web-dashboard/public/assets/index-Beportyl.js.map +1 -0
- package/src/web-dashboard/public/assets/index-gtQyg9nm.css +1 -0
- package/src/web-dashboard/public/index.html +2 -2
- package/src/web-dashboard/public/assets/index-J3sGSCLr.js +0 -207
- package/src/web-dashboard/public/assets/index-J3sGSCLr.js.map +0 -1
- package/src/web-dashboard/public/assets/index-u7mu-fxK.css +0 -1
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Build/run EFFECT verification — launch the thing that was built, and refuse
|
|
3
|
+
* to call the build a success if the artifact crashes on launch.
|
|
4
|
+
*
|
|
5
|
+
* WHY THIS EXISTS (the live Aukat_check failure):
|
|
6
|
+
* `nuvira` rebuilt a macOS app, the build command exited 0, and the run reported
|
|
7
|
+
* "The app is now successfully built and functional." It was not: the bundle
|
|
8
|
+
* crashed immediately with `ModuleNotFoundError: No module named 'PyQt6'` /
|
|
9
|
+
* `ImportError: cannot import name 'AXIsProcessTrusted' from 'AppKit'`. The
|
|
10
|
+
* agent's own "verification" was `ps aux | grep`, which cannot tell a running
|
|
11
|
+
* process from a crash-loop.
|
|
12
|
+
*
|
|
13
|
+
* `artifact-verification.ts` already makes FILE deliverables honest (missing,
|
|
14
|
+
* empty, empty-archive). This generalizes the same invariant to a PROCESS
|
|
15
|
+
* deliverable: a build is done when the artifact it produced is OBSERVED to
|
|
16
|
+
* launch — not when a command's exit code said so.
|
|
17
|
+
*
|
|
18
|
+
* Deliberately conservative and LLM-free:
|
|
19
|
+
* - Only BUILD commands that plausibly produce a runnable artifact engage it.
|
|
20
|
+
* - Only a launch that EXITS NON-ZERO with stderr (or dies by signal) is a
|
|
21
|
+
* failure. A process still alive at the timeout is a success (a GUI app),
|
|
22
|
+
* and a clean exit 0 is a success (a CLI that did its job).
|
|
23
|
+
* - No candidate artifact ⇒ `no-artifact`, which is REPORTED, never failures:
|
|
24
|
+
* a library build legitimately produces nothing to launch.
|
|
25
|
+
* - `NUVIRA_EFFECT_VERIFY=off` disables it.
|
|
26
|
+
*/
|
|
27
|
+
/** A launchable artifact a build may have produced. */
|
|
28
|
+
export interface LaunchCandidate {
|
|
29
|
+
/** Absolute path to the artifact (an `.app` bundle or an executable). */
|
|
30
|
+
path: string;
|
|
31
|
+
kind: 'app-bundle' | 'executable';
|
|
32
|
+
}
|
|
33
|
+
/** The outcome of one launch attempt. */
|
|
34
|
+
export interface LaunchResult {
|
|
35
|
+
ok: boolean;
|
|
36
|
+
/** Exit code when the process ended on its own; null when it timed out (killed). */
|
|
37
|
+
exitCode: number | null;
|
|
38
|
+
/** True when the process was still alive at the timeout and had to be killed. */
|
|
39
|
+
timedOut: boolean;
|
|
40
|
+
/** Captured stderr (bounded). */
|
|
41
|
+
stderr: string;
|
|
42
|
+
/** One line naming why it failed (empty when ok). */
|
|
43
|
+
reason: string;
|
|
44
|
+
}
|
|
45
|
+
export type EffectVerdict = {
|
|
46
|
+
status: 'not-applicable';
|
|
47
|
+
} | {
|
|
48
|
+
status: 'no-artifact';
|
|
49
|
+
buildCommand: string;
|
|
50
|
+
} | {
|
|
51
|
+
status: 'verified';
|
|
52
|
+
artifact: LaunchCandidate;
|
|
53
|
+
aliveMs: number;
|
|
54
|
+
} | {
|
|
55
|
+
status: 'failed';
|
|
56
|
+
artifact: LaunchCandidate;
|
|
57
|
+
reason: string;
|
|
58
|
+
stderr: string;
|
|
59
|
+
};
|
|
60
|
+
/** Is the effect check disabled by the deployment? */
|
|
61
|
+
export declare function effectVerifyDisabled(): boolean;
|
|
62
|
+
/** Default launch window: long enough for a crash-on-import, short enough to not stall. */
|
|
63
|
+
export declare const DEFAULT_LAUNCH_TIMEOUT_MS = 8000;
|
|
64
|
+
/** Does this command build a runnable artifact worth launching? */
|
|
65
|
+
export declare function isBuildCommand(command: string): boolean;
|
|
66
|
+
/**
|
|
67
|
+
* The names a build command declares — from `--name=X` and from a PyInstaller
|
|
68
|
+
* `.spec`'s `name='…'` entries. Used to locate the artifact the command produced.
|
|
69
|
+
*/
|
|
70
|
+
export declare function extractBuildNames(command: string, cwd: string): string[];
|
|
71
|
+
/**
|
|
72
|
+
* The artifacts a build command plausibly produced, newest first.
|
|
73
|
+
*
|
|
74
|
+
* Candidates come from the declared build names first (so a `.spec`'s `.app` is
|
|
75
|
+
* found even in a busy `dist/`), then from a bounded scan of the usual output
|
|
76
|
+
* directories. Only entries written at/after `sinceMs` are considered, so a
|
|
77
|
+
* stale artifact from an earlier run is never mistaken for this build's output.
|
|
78
|
+
*/
|
|
79
|
+
export declare function findLaunchCandidates(command: string, cwd: string, sinceMs: number): LaunchCandidate[];
|
|
80
|
+
/** The actual binary to run for a candidate (inner executable of an `.app`). */
|
|
81
|
+
export declare function resolveLaunchBinary(candidate: LaunchCandidate): string | null;
|
|
82
|
+
/** Options for one launch attempt. */
|
|
83
|
+
export interface LaunchOptions {
|
|
84
|
+
timeoutMs: number;
|
|
85
|
+
env?: Record<string, string | undefined>;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Launch an artifact and observe it for a bounded window.
|
|
89
|
+
*
|
|
90
|
+
* The rule that makes this honest AND safe: a process still alive at the timeout
|
|
91
|
+
* is a success (it did not crash), and only a non-zero exit (or death by signal)
|
|
92
|
+
* is a failure — with the captured stderr as the reason.
|
|
93
|
+
*/
|
|
94
|
+
export declare function smokeLaunchArtifact(candidate: LaunchCandidate, options: LaunchOptions): Promise<LaunchResult>;
|
|
95
|
+
/** Injectable launcher (tests never spawn a real artifact). */
|
|
96
|
+
export type ArtifactLauncher = (candidate: LaunchCandidate, options: LaunchOptions) => Promise<LaunchResult>;
|
|
97
|
+
/** Options for {@link verifyBuildEffect}. */
|
|
98
|
+
export interface EffectVerifyOptions {
|
|
99
|
+
/** Only consider artifacts written at/after this epoch ms (the build's start). */
|
|
100
|
+
sinceMs?: number;
|
|
101
|
+
timeoutMs?: number;
|
|
102
|
+
env?: Record<string, string | undefined>;
|
|
103
|
+
launch?: ArtifactLauncher;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Verify that a build command's output actually launches.
|
|
107
|
+
*
|
|
108
|
+
* Ordered by honesty: a successful launch verifies; a crash fails with its
|
|
109
|
+
* stderr; no launchable artifact is reported (not failed), because a library
|
|
110
|
+
* build legitimately has nothing to launch.
|
|
111
|
+
*/
|
|
112
|
+
export declare function verifyBuildEffect(command: string, cwd: string, options?: EffectVerifyOptions): Promise<EffectVerdict>;
|
|
113
|
+
/** A one-line, model-readable description of an effect verdict ('' when nothing to say). */
|
|
114
|
+
export declare function formatEffectVerdict(verdict: EffectVerdict): string;
|
|
115
|
+
//# sourceMappingURL=effect-verification.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"effect-verification.d.ts","sourceRoot":"","sources":["../../src/utils/effect-verification.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAMH,uDAAuD;AACvD,MAAM,WAAW,eAAe;IAC9B,yEAAyE;IACzE,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,YAAY,GAAG,YAAY,CAAC;CACnC;AAED,yCAAyC;AACzC,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,OAAO,CAAC;IACZ,oFAAoF;IACpF,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,iFAAiF;IACjF,QAAQ,EAAE,OAAO,CAAC;IAClB,iCAAiC;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,qDAAqD;IACrD,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,MAAM,aAAa,GACrB;IAAE,MAAM,EAAE,gBAAgB,CAAA;CAAE,GAC5B;IAAE,MAAM,EAAE,aAAa,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,GAC/C;IAAE,MAAM,EAAE,UAAU,CAAC;IAAC,QAAQ,EAAE,eAAe,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAClE;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,QAAQ,EAAE,eAAe,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAEpF,sDAAsD;AACtD,wBAAgB,oBAAoB,IAAI,OAAO,CAK9C;AAED,2FAA2F;AAC3F,eAAO,MAAM,yBAAyB,OAAO,CAAC;AAS9C,mEAAmE;AACnE,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAEvD;AAKD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAiBxE;AA0CD;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,GACd,eAAe,EAAE,CAiDnB;AAED,gFAAgF;AAChF,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,eAAe,GAAG,MAAM,GAAG,IAAI,CAqB7E;AAED,sCAAsC;AACtC,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;CAC1C;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,eAAe,EAC1B,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,YAAY,CAAC,CAkFvB;AAED,+DAA+D;AAC/D,MAAM,MAAM,gBAAgB,GAAG,CAC7B,SAAS,EAAE,eAAe,EAC1B,OAAO,EAAE,aAAa,KACnB,OAAO,CAAC,YAAY,CAAC,CAAC;AAE3B,6CAA6C;AAC7C,MAAM,WAAW,mBAAmB;IAClC,kFAAkF;IAClF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IACzC,MAAM,CAAC,EAAE,gBAAgB,CAAC;CAC3B;AAED;;;;;;GAMG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,aAAa,CAAC,CAgBxB;AAED,4FAA4F;AAC5F,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,aAAa,GAAG,MAAM,CAclE"}
|
|
@@ -0,0 +1,337 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Build/run EFFECT verification — launch the thing that was built, and refuse
|
|
3
|
+
* to call the build a success if the artifact crashes on launch.
|
|
4
|
+
*
|
|
5
|
+
* WHY THIS EXISTS (the live Aukat_check failure):
|
|
6
|
+
* `nuvira` rebuilt a macOS app, the build command exited 0, and the run reported
|
|
7
|
+
* "The app is now successfully built and functional." It was not: the bundle
|
|
8
|
+
* crashed immediately with `ModuleNotFoundError: No module named 'PyQt6'` /
|
|
9
|
+
* `ImportError: cannot import name 'AXIsProcessTrusted' from 'AppKit'`. The
|
|
10
|
+
* agent's own "verification" was `ps aux | grep`, which cannot tell a running
|
|
11
|
+
* process from a crash-loop.
|
|
12
|
+
*
|
|
13
|
+
* `artifact-verification.ts` already makes FILE deliverables honest (missing,
|
|
14
|
+
* empty, empty-archive). This generalizes the same invariant to a PROCESS
|
|
15
|
+
* deliverable: a build is done when the artifact it produced is OBSERVED to
|
|
16
|
+
* launch — not when a command's exit code said so.
|
|
17
|
+
*
|
|
18
|
+
* Deliberately conservative and LLM-free:
|
|
19
|
+
* - Only BUILD commands that plausibly produce a runnable artifact engage it.
|
|
20
|
+
* - Only a launch that EXITS NON-ZERO with stderr (or dies by signal) is a
|
|
21
|
+
* failure. A process still alive at the timeout is a success (a GUI app),
|
|
22
|
+
* and a clean exit 0 is a success (a CLI that did its job).
|
|
23
|
+
* - No candidate artifact ⇒ `no-artifact`, which is REPORTED, never failures:
|
|
24
|
+
* a library build legitimately produces nothing to launch.
|
|
25
|
+
* - `NUVIRA_EFFECT_VERIFY=off` disables it.
|
|
26
|
+
*/
|
|
27
|
+
import { existsSync, readdirSync, readFileSync, statSync } from 'node:fs';
|
|
28
|
+
import { spawn } from 'node:child_process';
|
|
29
|
+
import { basename, join, resolve } from 'node:path';
|
|
30
|
+
/** Is the effect check disabled by the deployment? */
|
|
31
|
+
export function effectVerifyDisabled() {
|
|
32
|
+
const raw = (process.env.NUVIRA_EFFECT_VERIFY ?? process.env.BUFF_EFFECT_VERIFY ?? '')
|
|
33
|
+
.trim()
|
|
34
|
+
.toLowerCase();
|
|
35
|
+
return raw === 'off' || raw === '0' || raw === 'false' || raw === 'no';
|
|
36
|
+
}
|
|
37
|
+
/** Default launch window: long enough for a crash-on-import, short enough to not stall. */
|
|
38
|
+
export const DEFAULT_LAUNCH_TIMEOUT_MS = 8000;
|
|
39
|
+
/**
|
|
40
|
+
* Build commands whose whole purpose is to produce a runnable artifact.
|
|
41
|
+
* Kept to the well-known producers so this never surprises an ordinary command.
|
|
42
|
+
*/
|
|
43
|
+
const BUILD_COMMAND_RE = /(?:^|[\s;&|])(?:npx\s+)?(?:pyinstaller|pyinstaller-?\d*|cargo\s+build|go\s+build|xcodebuild|maturin\s+build|python3?\s+-m\s+(?:PyInstaller|build)|npm\s+run\s+build|pnpm\s+run\s+build|yarn\s+build|bun\s+run\s+build|make)\b/;
|
|
44
|
+
/** Does this command build a runnable artifact worth launching? */
|
|
45
|
+
export function isBuildCommand(command) {
|
|
46
|
+
return BUILD_COMMAND_RE.test(String(command ?? '').toLowerCase());
|
|
47
|
+
}
|
|
48
|
+
/** Directories a build typically writes its artifact into, nearest-first. */
|
|
49
|
+
const ARTIFACT_DIRS = ['dist', 'build', 'target/release', 'target/debug', 'out', 'bin'];
|
|
50
|
+
/**
|
|
51
|
+
* The names a build command declares — from `--name=X` and from a PyInstaller
|
|
52
|
+
* `.spec`'s `name='…'` entries. Used to locate the artifact the command produced.
|
|
53
|
+
*/
|
|
54
|
+
export function extractBuildNames(command, cwd) {
|
|
55
|
+
const names = new Set();
|
|
56
|
+
for (const m of command.matchAll(/--name[= ]([\w.\-]+)/g))
|
|
57
|
+
names.add(m[1]);
|
|
58
|
+
const specMatch = command.match(/([\w.\-/]+\.spec)\b/);
|
|
59
|
+
const specPath = specMatch ? resolve(cwd, specMatch[1]) : findSpecFile(cwd);
|
|
60
|
+
if (specPath && existsSync(specPath)) {
|
|
61
|
+
try {
|
|
62
|
+
const text = readFileSync(specPath, 'utf-8');
|
|
63
|
+
for (const m of text.matchAll(/name\s*=\s*['"]([^'"]+)['"]/g)) {
|
|
64
|
+
names.add(m[1].replace(/\.app$/i, ''));
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
/* best-effort — an unreadable spec is not a verdict */
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return [...names];
|
|
72
|
+
}
|
|
73
|
+
/** The first `*.spec` directly in `cwd`, if any. */
|
|
74
|
+
function findSpecFile(cwd) {
|
|
75
|
+
try {
|
|
76
|
+
const entry = readdirSync(cwd).find((f) => f.endsWith('.spec'));
|
|
77
|
+
return entry ? join(cwd, entry) : null;
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
/** Is this a POSIX-executable file (or a Windows `.exe`)? */
|
|
84
|
+
function isExecutableFile(path) {
|
|
85
|
+
try {
|
|
86
|
+
const st = statSync(path);
|
|
87
|
+
if (!st.isFile())
|
|
88
|
+
return false;
|
|
89
|
+
if (process.platform === 'win32')
|
|
90
|
+
return /\.(exe|com|bat|cmd)$/i.test(path);
|
|
91
|
+
return (st.mode & 0o111) !== 0;
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
return false;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
/** An `.app` bundle is a directory with a runnable inner executable. */
|
|
98
|
+
function isAppBundle(path) {
|
|
99
|
+
if (process.platform !== 'darwin' || !path.endsWith('.app'))
|
|
100
|
+
return false;
|
|
101
|
+
try {
|
|
102
|
+
return statSync(path).isDirectory() && existsSync(join(path, 'Contents', 'MacOS'));
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
return false;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
function mtimeOf(path) {
|
|
109
|
+
try {
|
|
110
|
+
return statSync(path).mtimeMs;
|
|
111
|
+
}
|
|
112
|
+
catch {
|
|
113
|
+
return 0;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* The artifacts a build command plausibly produced, newest first.
|
|
118
|
+
*
|
|
119
|
+
* Candidates come from the declared build names first (so a `.spec`'s `.app` is
|
|
120
|
+
* found even in a busy `dist/`), then from a bounded scan of the usual output
|
|
121
|
+
* directories. Only entries written at/after `sinceMs` are considered, so a
|
|
122
|
+
* stale artifact from an earlier run is never mistaken for this build's output.
|
|
123
|
+
*/
|
|
124
|
+
export function findLaunchCandidates(command, cwd, sinceMs) {
|
|
125
|
+
const roots = ARTIFACT_DIRS.map((d) => join(cwd, d)).filter((d) => existsSync(d));
|
|
126
|
+
const candidates = [];
|
|
127
|
+
const seen = new Set();
|
|
128
|
+
const consider = (path) => {
|
|
129
|
+
if (seen.has(path) || !existsSync(path))
|
|
130
|
+
return;
|
|
131
|
+
if (mtimeOf(path) < sinceMs)
|
|
132
|
+
return;
|
|
133
|
+
if (isAppBundle(path)) {
|
|
134
|
+
seen.add(path);
|
|
135
|
+
candidates.push({ path, kind: 'app-bundle' });
|
|
136
|
+
}
|
|
137
|
+
else if (isExecutableFile(path)) {
|
|
138
|
+
seen.add(path);
|
|
139
|
+
candidates.push({ path, kind: 'executable' });
|
|
140
|
+
}
|
|
141
|
+
};
|
|
142
|
+
// 1. Declared names under the usual dirs (and an onedir `<name>/<name>` layout).
|
|
143
|
+
for (const name of extractBuildNames(command, cwd)) {
|
|
144
|
+
for (const root of roots) {
|
|
145
|
+
consider(join(root, `${name}.app`));
|
|
146
|
+
consider(join(root, name, name));
|
|
147
|
+
consider(join(root, name, `${name}.exe`));
|
|
148
|
+
consider(join(root, name));
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
// 2. Bounded scan of the output dirs (top level + one level deep), newest first.
|
|
152
|
+
for (const root of roots) {
|
|
153
|
+
try {
|
|
154
|
+
for (const entry of readdirSync(root)) {
|
|
155
|
+
const full = join(root, entry);
|
|
156
|
+
consider(full);
|
|
157
|
+
if (isAppBundle(full))
|
|
158
|
+
continue;
|
|
159
|
+
try {
|
|
160
|
+
if (statSync(full).isDirectory()) {
|
|
161
|
+
for (const inner of readdirSync(full))
|
|
162
|
+
consider(join(full, inner));
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
catch {
|
|
166
|
+
/* not a dir */
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
catch {
|
|
171
|
+
/* unreadable dir */
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
candidates.sort((a, b) => mtimeOf(b.path) - mtimeOf(a.path));
|
|
175
|
+
return candidates.slice(0, 5);
|
|
176
|
+
}
|
|
177
|
+
/** The actual binary to run for a candidate (inner executable of an `.app`). */
|
|
178
|
+
export function resolveLaunchBinary(candidate) {
|
|
179
|
+
if (candidate.kind === 'executable')
|
|
180
|
+
return candidate.path;
|
|
181
|
+
const macos = join(candidate.path, 'Contents', 'MacOS');
|
|
182
|
+
try {
|
|
183
|
+
const files = readdirSync(macos).filter((f) => {
|
|
184
|
+
try {
|
|
185
|
+
return statSync(join(macos, f)).isFile();
|
|
186
|
+
}
|
|
187
|
+
catch {
|
|
188
|
+
return false;
|
|
189
|
+
}
|
|
190
|
+
});
|
|
191
|
+
const plist = join(candidate.path, 'Contents', 'Info.plist');
|
|
192
|
+
if (existsSync(plist)) {
|
|
193
|
+
const txt = readFileSync(plist, 'utf-8');
|
|
194
|
+
const m = txt.match(/<key>CFBundleExecutable<\/key>\s*<string>([^<]+)<\/string>/);
|
|
195
|
+
if (m && files.includes(m[1]))
|
|
196
|
+
return join(macos, m[1]);
|
|
197
|
+
}
|
|
198
|
+
return files.length > 0 ? join(macos, files[0]) : null;
|
|
199
|
+
}
|
|
200
|
+
catch {
|
|
201
|
+
return null;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Launch an artifact and observe it for a bounded window.
|
|
206
|
+
*
|
|
207
|
+
* The rule that makes this honest AND safe: a process still alive at the timeout
|
|
208
|
+
* is a success (it did not crash), and only a non-zero exit (or death by signal)
|
|
209
|
+
* is a failure — with the captured stderr as the reason.
|
|
210
|
+
*/
|
|
211
|
+
export function smokeLaunchArtifact(candidate, options) {
|
|
212
|
+
return new Promise((resolve) => {
|
|
213
|
+
const bin = resolveLaunchBinary(candidate);
|
|
214
|
+
if (!bin) {
|
|
215
|
+
resolve({
|
|
216
|
+
ok: false,
|
|
217
|
+
exitCode: null,
|
|
218
|
+
timedOut: false,
|
|
219
|
+
stderr: '',
|
|
220
|
+
reason: 'the artifact exists but has no runnable executable inside it',
|
|
221
|
+
});
|
|
222
|
+
return;
|
|
223
|
+
}
|
|
224
|
+
let err = '';
|
|
225
|
+
let settled = false;
|
|
226
|
+
const finish = (r) => {
|
|
227
|
+
if (settled)
|
|
228
|
+
return;
|
|
229
|
+
settled = true;
|
|
230
|
+
resolve(r);
|
|
231
|
+
};
|
|
232
|
+
let child;
|
|
233
|
+
try {
|
|
234
|
+
child = spawn(bin, [], {
|
|
235
|
+
env: options.env ?? process.env,
|
|
236
|
+
stdio: ['ignore', 'ignore', 'pipe'],
|
|
237
|
+
windowsHide: true,
|
|
238
|
+
});
|
|
239
|
+
}
|
|
240
|
+
catch (e) {
|
|
241
|
+
finish({
|
|
242
|
+
ok: false,
|
|
243
|
+
exitCode: null,
|
|
244
|
+
timedOut: false,
|
|
245
|
+
stderr: '',
|
|
246
|
+
reason: `could not launch: ${e instanceof Error ? e.message : String(e)}`,
|
|
247
|
+
});
|
|
248
|
+
return;
|
|
249
|
+
}
|
|
250
|
+
const timer = setTimeout(() => {
|
|
251
|
+
try {
|
|
252
|
+
child.kill('SIGTERM');
|
|
253
|
+
}
|
|
254
|
+
catch {
|
|
255
|
+
/* best-effort */
|
|
256
|
+
}
|
|
257
|
+
finish({ ok: true, exitCode: null, timedOut: true, stderr: err.trim().slice(-2000), reason: '' });
|
|
258
|
+
}, options.timeoutMs);
|
|
259
|
+
child.stderr?.on('data', (b) => {
|
|
260
|
+
err += b.toString('utf-8');
|
|
261
|
+
if (err.length > 4000)
|
|
262
|
+
err = err.slice(-4000);
|
|
263
|
+
});
|
|
264
|
+
child.on('error', (e) => {
|
|
265
|
+
clearTimeout(timer);
|
|
266
|
+
finish({
|
|
267
|
+
ok: false,
|
|
268
|
+
exitCode: null,
|
|
269
|
+
timedOut: false,
|
|
270
|
+
stderr: e.message,
|
|
271
|
+
reason: `could not launch: ${e.message}`,
|
|
272
|
+
});
|
|
273
|
+
});
|
|
274
|
+
child.on('exit', (code, signal) => {
|
|
275
|
+
clearTimeout(timer);
|
|
276
|
+
const stderr = err.trim();
|
|
277
|
+
if (signal) {
|
|
278
|
+
finish({
|
|
279
|
+
ok: false,
|
|
280
|
+
exitCode: code,
|
|
281
|
+
timedOut: false,
|
|
282
|
+
stderr: stderr.slice(-2000),
|
|
283
|
+
reason: `the artifact crashed on launch (signal ${signal})`,
|
|
284
|
+
});
|
|
285
|
+
return;
|
|
286
|
+
}
|
|
287
|
+
const ok = code === 0;
|
|
288
|
+
finish({
|
|
289
|
+
ok,
|
|
290
|
+
exitCode: code,
|
|
291
|
+
timedOut: false,
|
|
292
|
+
stderr: stderr.slice(-2000),
|
|
293
|
+
reason: ok ? '' : `the artifact exited with code ${code}`,
|
|
294
|
+
});
|
|
295
|
+
});
|
|
296
|
+
});
|
|
297
|
+
}
|
|
298
|
+
/**
|
|
299
|
+
* Verify that a build command's output actually launches.
|
|
300
|
+
*
|
|
301
|
+
* Ordered by honesty: a successful launch verifies; a crash fails with its
|
|
302
|
+
* stderr; no launchable artifact is reported (not failed), because a library
|
|
303
|
+
* build legitimately has nothing to launch.
|
|
304
|
+
*/
|
|
305
|
+
export async function verifyBuildEffect(command, cwd, options = {}) {
|
|
306
|
+
if (effectVerifyDisabled() || !isBuildCommand(command))
|
|
307
|
+
return { status: 'not-applicable' };
|
|
308
|
+
const sinceMs = options.sinceMs ?? 0;
|
|
309
|
+
const candidates = findLaunchCandidates(command, cwd, sinceMs);
|
|
310
|
+
if (candidates.length === 0)
|
|
311
|
+
return { status: 'no-artifact', buildCommand: command };
|
|
312
|
+
const timeoutMs = options.timeoutMs ?? DEFAULT_LAUNCH_TIMEOUT_MS;
|
|
313
|
+
const launch = options.launch ?? smokeLaunchArtifact;
|
|
314
|
+
for (const candidate of candidates) {
|
|
315
|
+
const result = await launch(candidate, { timeoutMs, ...(options.env ? { env: options.env } : {}) });
|
|
316
|
+
if (result.ok) {
|
|
317
|
+
return { status: 'verified', artifact: candidate, aliveMs: result.timedOut ? timeoutMs : 0 };
|
|
318
|
+
}
|
|
319
|
+
return { status: 'failed', artifact: candidate, reason: result.reason, stderr: result.stderr };
|
|
320
|
+
}
|
|
321
|
+
return { status: 'no-artifact', buildCommand: command };
|
|
322
|
+
}
|
|
323
|
+
/** A one-line, model-readable description of an effect verdict ('' when nothing to say). */
|
|
324
|
+
export function formatEffectVerdict(verdict) {
|
|
325
|
+
switch (verdict.status) {
|
|
326
|
+
case 'verified':
|
|
327
|
+
return `🩺 effect verified — launched ${basename(verdict.artifact.path)} and it did not crash`;
|
|
328
|
+
case 'failed':
|
|
329
|
+
return (`the build succeeded but the artifact CRASHES on launch: ${verdict.reason}.` +
|
|
330
|
+
(verdict.stderr ? `\nLaunch stderr:\n${verdict.stderr}` : ''));
|
|
331
|
+
case 'no-artifact':
|
|
332
|
+
return '';
|
|
333
|
+
default:
|
|
334
|
+
return '';
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
//# sourceMappingURL=effect-verification.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"effect-verification.js","sourceRoot":"","sources":["../../src/utils/effect-verification.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Open a URL in the user's default browser — one implementation for every
|
|
3
|
+
* surface that needs it (the dashboard's auto-open, the `website` command).
|
|
4
|
+
*
|
|
5
|
+
* Platform-specific by necessity: macOS uses `open`, Linux uses `xdg-open`, and
|
|
6
|
+
* Windows uses the `start` shell built-in (which is why the Windows branch needs
|
|
7
|
+
* `shell: true` and a throwaway first argument for the window title). A missing
|
|
8
|
+
* launcher is never fatal — the caller prints the URL so the user can open it
|
|
9
|
+
* themselves.
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Best-effort open of `url`. Returns whether a launcher was spawned; a `false`
|
|
13
|
+
* means the caller should show the URL instead. Never throws.
|
|
14
|
+
*/
|
|
15
|
+
export declare function openInBrowser(url: string): boolean;
|
|
16
|
+
//# sourceMappingURL=open-url.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"open-url.d.ts","sourceRoot":"","sources":["../../src/utils/open-url.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH;;;GAGG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAelD"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Open a URL in the user's default browser — one implementation for every
|
|
3
|
+
* surface that needs it (the dashboard's auto-open, the `website` command).
|
|
4
|
+
*
|
|
5
|
+
* Platform-specific by necessity: macOS uses `open`, Linux uses `xdg-open`, and
|
|
6
|
+
* Windows uses the `start` shell built-in (which is why the Windows branch needs
|
|
7
|
+
* `shell: true` and a throwaway first argument for the window title). A missing
|
|
8
|
+
* launcher is never fatal — the caller prints the URL so the user can open it
|
|
9
|
+
* themselves.
|
|
10
|
+
*/
|
|
11
|
+
import { spawn } from 'node:child_process';
|
|
12
|
+
/**
|
|
13
|
+
* Best-effort open of `url`. Returns whether a launcher was spawned; a `false`
|
|
14
|
+
* means the caller should show the URL instead. Never throws.
|
|
15
|
+
*/
|
|
16
|
+
export function openInBrowser(url) {
|
|
17
|
+
const platform = process.platform;
|
|
18
|
+
const isWindows = platform === 'win32';
|
|
19
|
+
const cmd = isWindows ? 'start' : platform === 'darwin' ? 'open' : 'xdg-open';
|
|
20
|
+
try {
|
|
21
|
+
// Windows `start` is a shell built-in, not an executable — needs shell: true.
|
|
22
|
+
// Syntax: start "" "http://…" (the first arg is the window title).
|
|
23
|
+
const args = isWindows ? ['', url] : [url];
|
|
24
|
+
const child = spawn(cmd, args, { stdio: 'ignore', detached: true, shell: isWindows });
|
|
25
|
+
child.unref();
|
|
26
|
+
return true;
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=open-url.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"open-url.js","sourceRoot":"","sources":["../../src/utils/open-url.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAE3C;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,GAAW;IACvC,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAClC,MAAM,SAAS,GAAG,QAAQ,KAAK,OAAO,CAAC;IACvC,MAAM,GAAG,GAAG,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC;IAE9E,IAAI,CAAC;QACH,8EAA8E;QAC9E,mEAAmE;QACnE,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAC3C,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QACtF,KAAK,CAAC,KAAK,EAAE,CAAC;QACd,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|