@phnx-labs/agents-cli 1.20.72 → 1.20.73
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/CHANGELOG.md +299 -0
- package/README.md +40 -4
- package/dist/bin/agents +0 -0
- package/dist/commands/activity.d.ts +12 -0
- package/dist/commands/activity.js +68 -0
- package/dist/commands/apply.d.ts +13 -0
- package/dist/commands/apply.js +28 -3
- package/dist/commands/browser.js +1 -1
- package/dist/commands/cloud.js +21 -11
- package/dist/commands/doctor.js +8 -4
- package/dist/commands/events.d.ts +11 -10
- package/dist/commands/events.js +30 -21
- package/dist/commands/exec.d.ts +34 -0
- package/dist/commands/exec.js +337 -39
- package/dist/commands/feed.d.ts +13 -0
- package/dist/commands/feed.js +130 -29
- package/dist/commands/hq.d.ts +2 -0
- package/dist/commands/hq.js +58 -0
- package/dist/commands/lease.d.ts +19 -0
- package/dist/commands/lease.js +138 -11
- package/dist/commands/login.d.ts +2 -0
- package/dist/commands/login.js +123 -0
- package/dist/commands/logs.js +1 -1
- package/dist/commands/mine.d.ts +27 -0
- package/dist/commands/mine.js +207 -0
- package/dist/commands/monitors.js +79 -49
- package/dist/commands/plugins.js +1 -0
- package/dist/commands/profiles.js +158 -0
- package/dist/commands/repo.js +2 -60
- package/dist/commands/resources.d.ts +5 -0
- package/dist/commands/resources.js +95 -0
- package/dist/commands/routines.d.ts +2 -0
- package/dist/commands/routines.js +139 -37
- package/dist/commands/secrets.js +234 -47
- package/dist/commands/send.d.ts +15 -0
- package/dist/commands/send.js +62 -0
- package/dist/commands/sessions-tail.d.ts +1 -0
- package/dist/commands/sessions-tail.js +20 -9
- package/dist/commands/sessions.js +18 -3
- package/dist/commands/setup-mine.d.ts +18 -0
- package/dist/commands/setup-mine.js +106 -0
- package/dist/commands/setup-share.js +2 -2
- package/dist/commands/setup.js +3 -1
- package/dist/commands/share.d.ts +8 -1
- package/dist/commands/share.js +122 -37
- package/dist/commands/ssh.d.ts +9 -0
- package/dist/commands/ssh.js +196 -26
- package/dist/commands/sync.js +1 -1
- package/dist/commands/teams.js +11 -2
- package/dist/index.js +79 -10
- package/dist/lib/activity.d.ts +124 -0
- package/dist/lib/activity.js +542 -0
- package/dist/lib/agents.js +16 -5
- package/dist/lib/artifact-actions.d.ts +1 -1
- package/dist/lib/artifact-actions.js +1 -1
- package/dist/lib/ask-classifier.d.ts +2 -1
- package/dist/lib/ask-classifier.js +3 -3
- package/dist/lib/auth-health.d.ts +32 -4
- package/dist/lib/auth-health.js +40 -1
- package/dist/lib/auto-pull.js +8 -1
- package/dist/lib/brand.d.ts +40 -0
- package/dist/lib/brand.js +122 -0
- package/dist/lib/browser/drivers/ssh.js +4 -7
- package/dist/lib/browser/service.js +6 -8
- package/dist/lib/channels/providers/index.d.ts +2 -0
- package/dist/lib/channels/providers/index.js +20 -0
- package/dist/lib/channels/providers/mailbox.d.ts +2 -0
- package/dist/lib/channels/providers/mailbox.js +26 -0
- package/dist/lib/channels/providers/openclaw-telegram.d.ts +2 -0
- package/dist/lib/channels/providers/openclaw-telegram.js +34 -0
- package/dist/lib/channels/providers/rush.d.ts +6 -0
- package/dist/lib/channels/providers/rush.js +55 -0
- package/dist/lib/channels/registry.d.ts +42 -0
- package/dist/lib/channels/registry.js +20 -0
- package/dist/lib/channels/resolve.d.ts +11 -0
- package/dist/lib/channels/resolve.js +12 -0
- package/dist/lib/cli-resources.d.ts +18 -0
- package/dist/lib/cli-resources.js +53 -4
- package/dist/lib/cloud/codex.js +6 -3
- package/dist/lib/cloud/factory.d.ts +1 -0
- package/dist/lib/cloud/factory.js +10 -4
- package/dist/lib/cloud/rush.d.ts +3 -1
- package/dist/lib/cloud/rush.js +6 -1
- package/dist/lib/cloud/types.d.ts +2 -0
- package/dist/lib/codex-home.d.ts +35 -0
- package/dist/lib/codex-home.js +136 -0
- package/dist/lib/crabbox/cli.d.ts +44 -0
- package/dist/lib/crabbox/cli.js +120 -20
- package/dist/lib/crabbox/lease.d.ts +52 -1
- package/dist/lib/crabbox/lease.js +117 -16
- package/dist/lib/crabbox/progress.d.ts +31 -0
- package/dist/lib/crabbox/progress.js +76 -0
- package/dist/lib/crabbox/runtimes.d.ts +4 -0
- package/dist/lib/crabbox/runtimes.js +33 -8
- package/dist/lib/crabbox/setup-copy.d.ts +87 -0
- package/dist/lib/crabbox/setup-copy.js +127 -0
- package/dist/lib/daemon.d.ts +5 -5
- package/dist/lib/daemon.js +9 -9
- package/dist/lib/drive-sync.js +6 -3
- package/dist/lib/event-stream.d.ts +36 -0
- package/dist/lib/event-stream.js +68 -0
- package/dist/lib/events.d.ts +1 -1
- package/dist/lib/exec.d.ts +11 -0
- package/dist/lib/exec.js +23 -2
- package/dist/lib/feed-policy.d.ts +1 -1
- package/dist/lib/feed-policy.js +14 -9
- package/dist/lib/feed-ranking.d.ts +32 -0
- package/dist/lib/feed-ranking.js +224 -0
- package/dist/lib/feed.d.ts +35 -2
- package/dist/lib/feed.js +66 -3
- package/dist/lib/fleet/auth-sync.d.ts +53 -0
- package/dist/lib/fleet/auth-sync.js +92 -0
- package/dist/lib/fleet/remote-login.d.ts +187 -0
- package/dist/lib/fleet/remote-login.js +556 -0
- package/dist/lib/format.d.ts +30 -3
- package/dist/lib/format.js +34 -5
- package/dist/lib/fs-atomic.d.ts +7 -2
- package/dist/lib/fs-atomic.js +8 -12
- package/dist/lib/git.d.ts +16 -0
- package/dist/lib/git.js +79 -2
- package/dist/lib/heal.js +11 -3
- package/dist/lib/hosts/progress.d.ts +28 -10
- package/dist/lib/hosts/progress.js +79 -22
- package/dist/lib/hosts/remote-cmd.js +4 -0
- package/dist/lib/hq/floor.d.ts +87 -0
- package/dist/lib/hq/floor.js +226 -0
- package/dist/lib/menubar/install-menubar.js +14 -20
- package/dist/lib/notify.d.ts +1 -0
- package/dist/lib/notify.js +3 -3
- package/dist/lib/open-url.d.ts +2 -0
- package/dist/lib/open-url.js +19 -0
- package/dist/lib/openclaw-keychain.d.ts +56 -0
- package/dist/lib/openclaw-keychain.js +236 -0
- package/dist/lib/overdue.js +10 -0
- package/dist/lib/permissions.d.ts +44 -1
- package/dist/lib/permissions.js +284 -7
- package/dist/lib/project-launch.d.ts +6 -12
- package/dist/lib/project-launch.js +13 -228
- package/dist/lib/project-resources.d.ts +7 -0
- package/dist/lib/project-resources.js +291 -0
- package/dist/lib/pty-client.d.ts +27 -0
- package/dist/lib/pty-client.js +136 -10
- package/dist/lib/refresh.js +14 -10
- package/dist/lib/resource-profiles.d.ts +26 -0
- package/dist/lib/resource-profiles.js +157 -0
- package/dist/lib/resources/permissions.js +7 -1
- package/dist/lib/resources/types.d.ts +1 -1
- package/dist/lib/resources.d.ts +1 -1
- package/dist/lib/resources.js +32 -3
- package/dist/lib/routines.d.ts +11 -0
- package/dist/lib/routines.js +56 -15
- package/dist/lib/runner.d.ts +1 -0
- package/dist/lib/runner.js +66 -5
- package/dist/lib/secrets/bundles.d.ts +16 -3
- package/dist/lib/secrets/bundles.js +206 -37
- package/dist/lib/secrets/icloud-import.d.ts +2 -2
- package/dist/lib/secrets/icloud-import.js +9 -6
- package/dist/lib/secrets/mcp.js +1 -1
- package/dist/lib/secrets/vault-age-helper.d.ts +1 -0
- package/dist/lib/secrets/vault-age-helper.js +34 -0
- package/dist/lib/secrets/vault.d.ts +49 -0
- package/dist/lib/secrets/vault.js +397 -0
- package/dist/lib/self-heal/checks/path.js +3 -1
- package/dist/lib/self-heal/checks/shadowing.js +10 -2
- package/dist/lib/self-heal/checks/shims.js +19 -11
- package/dist/lib/session/cloud.d.ts +2 -2
- package/dist/lib/session/cloud.js +2 -2
- package/dist/lib/session/db.d.ts +4 -0
- package/dist/lib/session/db.js +44 -7
- package/dist/lib/session/discover.d.ts +2 -0
- package/dist/lib/session/discover.js +114 -3
- package/dist/lib/session/stream-render.d.ts +3 -0
- package/dist/lib/session/stream-render.js +130 -0
- package/dist/lib/session/types.d.ts +6 -0
- package/dist/lib/share/analytics.d.ts +13 -0
- package/dist/lib/share/analytics.js +45 -0
- package/dist/lib/share/config.d.ts +19 -5
- package/dist/lib/share/config.js +44 -8
- package/dist/lib/share/provision.d.ts +58 -6
- package/dist/lib/share/provision.js +97 -22
- package/dist/lib/share/publish.d.ts +36 -13
- package/dist/lib/share/publish.js +55 -8
- package/dist/lib/share/worker-template.js +83 -17
- package/dist/lib/shims.d.ts +9 -0
- package/dist/lib/shims.js +91 -13
- package/dist/lib/ssh-exec.d.ts +14 -0
- package/dist/lib/ssh-exec.js +57 -0
- package/dist/lib/staleness/detectors/hooks.js +25 -1
- package/dist/lib/staleness/detectors/permissions.js +66 -0
- package/dist/lib/staleness/detectors/workflows.js +20 -0
- package/dist/lib/staleness/writers/hooks.js +58 -4
- package/dist/lib/staleness/writers/permissions.js +2 -2
- package/dist/lib/staleness/writers/skills.js +1 -1
- package/dist/lib/staleness/writers/sources.d.ts +10 -1
- package/dist/lib/staleness/writers/sources.js +68 -1
- package/dist/lib/star-nudge.d.ts +45 -0
- package/dist/lib/star-nudge.js +91 -0
- package/dist/lib/startup/command-registry.d.ts +6 -1
- package/dist/lib/startup/command-registry.js +17 -3
- package/dist/lib/state.d.ts +2 -0
- package/dist/lib/state.js +3 -0
- package/dist/lib/subagents-registry.d.ts +2 -0
- package/dist/lib/subagents-registry.js +3 -0
- package/dist/lib/teams/parsers.js +214 -6
- package/dist/lib/teams/supervisor.d.ts +7 -0
- package/dist/lib/teams/supervisor.js +2 -1
- package/dist/lib/template.d.ts +1 -1
- package/dist/lib/template.js +1 -1
- package/dist/lib/triggers/webhook.js +36 -3
- package/dist/lib/types.d.ts +73 -0
- package/dist/lib/version.d.ts +40 -0
- package/dist/lib/version.js +94 -16
- package/dist/lib/versions.d.ts +11 -0
- package/dist/lib/versions.js +208 -76
- package/dist/lib/workflows.d.ts +2 -0
- package/dist/lib/workflows.js +88 -0
- package/package.json +2 -1
- package/dist/commands/daemon.d.ts +0 -10
- package/dist/commands/daemon.js +0 -121
package/dist/lib/types.d.ts
CHANGED
|
@@ -508,6 +508,29 @@ export interface VersionResources {
|
|
|
508
508
|
permissions?: ResourcePattern[];
|
|
509
509
|
mcp?: ResourcePattern[];
|
|
510
510
|
}
|
|
511
|
+
/** Resource-kind selectors controlled by top-level resource profiles. */
|
|
512
|
+
export interface ResourceProfilePreset {
|
|
513
|
+
description?: string;
|
|
514
|
+
commands?: ResourcePattern[];
|
|
515
|
+
skills?: ResourcePattern[];
|
|
516
|
+
hooks?: ResourcePattern[];
|
|
517
|
+
subagents?: ResourcePattern[];
|
|
518
|
+
plugins?: ResourcePattern[];
|
|
519
|
+
workflows?: ResourcePattern[];
|
|
520
|
+
permissions?: ResourcePattern[];
|
|
521
|
+
mcp?: ResourcePattern[];
|
|
522
|
+
/** Rule preset name to compose while this profile is active. */
|
|
523
|
+
rules?: string;
|
|
524
|
+
/** Alias for rules, accepted so YAML can mirror VersionResources naming. */
|
|
525
|
+
rulesPreset?: string;
|
|
526
|
+
/** Secrets bundle names, or "*" for every bundle. */
|
|
527
|
+
secrets?: string[];
|
|
528
|
+
}
|
|
529
|
+
/** Top-level profiles/presets that switch the resolved resource view. */
|
|
530
|
+
export interface ResourceProfilesConfig {
|
|
531
|
+
active?: string;
|
|
532
|
+
presets?: Record<string, ResourceProfilePreset>;
|
|
533
|
+
}
|
|
511
534
|
/** A userConfig field declared in a plugin manifest. */
|
|
512
535
|
export interface PluginUserConfigField {
|
|
513
536
|
key: string;
|
|
@@ -644,6 +667,28 @@ export interface ExtraRepoConfig {
|
|
|
644
667
|
path?: string;
|
|
645
668
|
enabled: boolean;
|
|
646
669
|
}
|
|
670
|
+
/**
|
|
671
|
+
* A white-label brand — a personally-named CLI (e.g. `jack`) that IS agents-cli,
|
|
672
|
+
* minted by `agents setup mine` / `agents mine`. The brand's shim exports
|
|
673
|
+
* `AGENTS_BRAND=<name>`; the entrypoint reads it to present under this name and
|
|
674
|
+
* apply the customization below. Portable user config — rides `agents repo
|
|
675
|
+
* push/pull`. See lib/brand.ts.
|
|
676
|
+
*/
|
|
677
|
+
export interface BrandConfig {
|
|
678
|
+
/** The brand name; also the binary name on PATH. */
|
|
679
|
+
name: string;
|
|
680
|
+
/** Built-in top-level commands this brand hides/disables (e.g. `["teams"]`). */
|
|
681
|
+
disabledCommands?: string[];
|
|
682
|
+
/**
|
|
683
|
+
* Resource-profile preset this brand pins (a key in `profiles.presets`). When
|
|
684
|
+
* the CLI runs under this brand, that preset becomes the active profile, so
|
|
685
|
+
* skills/plugins/mcp/hooks/etc. filter to the brand's curated set. Defaults to
|
|
686
|
+
* `mine-<name>`.
|
|
687
|
+
*/
|
|
688
|
+
profile?: string;
|
|
689
|
+
/** False to keep the config but stop minting/using the brand. */
|
|
690
|
+
enabled: boolean;
|
|
691
|
+
}
|
|
647
692
|
/** Top-level structure of ~/.agents/.system/agents.yaml -- the CLI's persistent state. */
|
|
648
693
|
export interface Meta {
|
|
649
694
|
agents?: Partial<Record<AgentId, string>>;
|
|
@@ -682,6 +727,12 @@ export interface Meta {
|
|
|
682
727
|
enabled?: BetaFeatureName[];
|
|
683
728
|
};
|
|
684
729
|
registries?: Record<RegistryType, Record<string, RegistryConfig>>;
|
|
730
|
+
/**
|
|
731
|
+
* Top-level resource profiles. Activating one filters the resolved resource
|
|
732
|
+
* set across commands, skills, hooks, rules, MCP, permissions, and secrets.
|
|
733
|
+
* Model-provider run profiles are separate YAML files under profiles/.
|
|
734
|
+
*/
|
|
735
|
+
profiles?: ResourceProfilesConfig;
|
|
685
736
|
versions?: Partial<Record<AgentId, Record<string, VersionResources>>>;
|
|
686
737
|
source?: string;
|
|
687
738
|
/**
|
|
@@ -696,6 +747,12 @@ export interface Meta {
|
|
|
696
747
|
* via the `path` field.
|
|
697
748
|
*/
|
|
698
749
|
extraRepos?: Record<string, ExtraRepoConfig>;
|
|
750
|
+
/**
|
|
751
|
+
* White-label brands keyed by name. Each mints a personally-named binary
|
|
752
|
+
* (e.g. `jack`) that runs agents-cli under that name with its own disabled
|
|
753
|
+
* commands + curated resource profile. See lib/brand.ts.
|
|
754
|
+
*/
|
|
755
|
+
brands?: Record<string, BrandConfig>;
|
|
699
756
|
/**
|
|
700
757
|
* Keys like `skill.hermes` — registries seeded from SEEDED_REGISTRIES exactly
|
|
701
758
|
* once. Tracked so a user `registry remove` won't silently re-seed.
|
|
@@ -746,6 +803,22 @@ export interface Meta {
|
|
|
746
803
|
workerName?: string;
|
|
747
804
|
bucketName?: string;
|
|
748
805
|
domain?: string;
|
|
806
|
+
/** Cloudflare Web Analytics token injected into published HTML pages. */
|
|
807
|
+
analyticsToken?: string;
|
|
808
|
+
};
|
|
809
|
+
/**
|
|
810
|
+
* Owner/channel notification config for `agents send` / `agents notify`.
|
|
811
|
+
* `owner` is the default recipient for `agents notify` (channel + target).
|
|
812
|
+
* `transports` maps a user-facing channel name to the provider that actually
|
|
813
|
+
* delivers it — explicit, one provider per channel, no fallback. Omitted keys
|
|
814
|
+
* default to name-identity (channel `slack` -> provider `slack`).
|
|
815
|
+
*/
|
|
816
|
+
notify?: {
|
|
817
|
+
owner?: {
|
|
818
|
+
channel: string;
|
|
819
|
+
to: string;
|
|
820
|
+
};
|
|
821
|
+
transports?: Record<string, string>;
|
|
749
822
|
};
|
|
750
823
|
}
|
|
751
824
|
/** Persisted agent-host entry in agents.yaml (overlay or inline). */
|
package/dist/lib/version.d.ts
CHANGED
|
@@ -1,8 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Well-known locations of the `agents` launcher for PATH-less GUI/launchd
|
|
3
|
+
* processes (the menu-bar helper inherits no login PATH). Also the anchor for
|
|
4
|
+
* recovering the on-disk install layout when the CLI runs as a Bun single-file
|
|
5
|
+
* binary — see {@link resolveInstalledLayout}.
|
|
6
|
+
*/
|
|
7
|
+
export declare function resolveAgentsBin(): string | null;
|
|
8
|
+
export interface InstallLayout {
|
|
9
|
+
/** The install's `dist/` directory (holds `index.js` + `lib/`). */
|
|
10
|
+
distDir: string;
|
|
11
|
+
/** The compiled CLI entry, `dist/index.js`. */
|
|
12
|
+
entryPath: string;
|
|
13
|
+
/** The shipping `package.json`, `dist/../package.json`. */
|
|
14
|
+
pkgJsonPath: string;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Pure derivation (no I/O) of an install's on-disk layout from the realpath of
|
|
18
|
+
* its `agents` launcher. A launcher lives at `<pkg>/dist/bin/agents`, so two
|
|
19
|
+
* levels up is `<pkg>/dist`. Exported for unit testing so the dirname chain the
|
|
20
|
+
* Bun-binary fallback depends on stays locked.
|
|
21
|
+
*/
|
|
22
|
+
export declare function installLayoutFromBin(realBin: string): InstallLayout;
|
|
23
|
+
/**
|
|
24
|
+
* Resolve the on-disk install layout of the running CLI by following the
|
|
25
|
+
* `agents` launcher symlink.
|
|
26
|
+
*
|
|
27
|
+
* When the CLI runs as a Bun single-file executable, `import.meta.url` points
|
|
28
|
+
* inside the virtual bundle (`/$bunfs/…`), so sibling-relative resolution can't
|
|
29
|
+
* see the shipped `package.json`, `dist/index.js`, or `MenubarHelper.app` on
|
|
30
|
+
* disk. The launcher symlink points at the real files; walk up from it. Returns
|
|
31
|
+
* null when no launcher is found (dev/tsx runs, or a box without the helper) —
|
|
32
|
+
* callers keep their in-bundle resolution as the primary path and use this only
|
|
33
|
+
* as the fallback.
|
|
34
|
+
*/
|
|
35
|
+
export declare function resolveInstalledLayout(): InstallLayout | null;
|
|
1
36
|
/**
|
|
2
37
|
* Resolve the CLI version from the shipping package.json. Used by the daemon
|
|
3
38
|
* to answer `IPCAction: 'version'` and by the client to detect daemon drift —
|
|
4
39
|
* a dev-build CLI talking to a launchd-managed registry daemon would silently
|
|
5
40
|
* get stale behavior without this check.
|
|
41
|
+
*
|
|
42
|
+
* Primary read is relative to this module; when that fails (the Bun single-file
|
|
43
|
+
* binary can't read its own bundled package.json), fall back to the on-disk
|
|
44
|
+
* install found via the launcher symlink so callers like the menu bar don't see
|
|
45
|
+
* a bogus `unknown`.
|
|
6
46
|
*/
|
|
7
47
|
export declare function getCliVersion(): string;
|
|
8
48
|
/**
|
package/dist/lib/version.js
CHANGED
|
@@ -1,28 +1,111 @@
|
|
|
1
1
|
import * as fs from 'fs';
|
|
2
|
+
import * as os from 'os';
|
|
2
3
|
import * as path from 'path';
|
|
3
4
|
import { fileURLToPath } from 'url';
|
|
4
5
|
const __filename = fileURLToPath(import.meta.url);
|
|
5
6
|
const __dirname = path.dirname(__filename);
|
|
6
7
|
let cached = null;
|
|
8
|
+
/** Read a `version` string from a package.json, or null if unreadable. */
|
|
9
|
+
function readVersionAt(pkgPath) {
|
|
10
|
+
try {
|
|
11
|
+
const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));
|
|
12
|
+
return String(pkg.version || '') || null;
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
return null;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Well-known locations of the `agents` launcher for PATH-less GUI/launchd
|
|
20
|
+
* processes (the menu-bar helper inherits no login PATH). Also the anchor for
|
|
21
|
+
* recovering the on-disk install layout when the CLI runs as a Bun single-file
|
|
22
|
+
* binary — see {@link resolveInstalledLayout}.
|
|
23
|
+
*/
|
|
24
|
+
export function resolveAgentsBin() {
|
|
25
|
+
const home = os.homedir();
|
|
26
|
+
const candidates = [
|
|
27
|
+
path.join(home, '.local', 'bin', 'agents'),
|
|
28
|
+
'/opt/homebrew/bin/agents',
|
|
29
|
+
'/usr/local/bin/agents',
|
|
30
|
+
path.join(home, '.npm-global', 'bin', 'agents'),
|
|
31
|
+
];
|
|
32
|
+
for (const c of candidates) {
|
|
33
|
+
try {
|
|
34
|
+
fs.accessSync(c, fs.constants.X_OK);
|
|
35
|
+
return c;
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
/* try next */
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Pure derivation (no I/O) of an install's on-disk layout from the realpath of
|
|
45
|
+
* its `agents` launcher. A launcher lives at `<pkg>/dist/bin/agents`, so two
|
|
46
|
+
* levels up is `<pkg>/dist`. Exported for unit testing so the dirname chain the
|
|
47
|
+
* Bun-binary fallback depends on stays locked.
|
|
48
|
+
*/
|
|
49
|
+
export function installLayoutFromBin(realBin) {
|
|
50
|
+
const distDir = path.dirname(path.dirname(realBin)); // <pkg>/dist/bin/agents -> <pkg>/dist
|
|
51
|
+
return {
|
|
52
|
+
distDir,
|
|
53
|
+
entryPath: path.join(distDir, 'index.js'),
|
|
54
|
+
pkgJsonPath: path.join(distDir, '..', 'package.json'),
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Resolve the on-disk install layout of the running CLI by following the
|
|
59
|
+
* `agents` launcher symlink.
|
|
60
|
+
*
|
|
61
|
+
* When the CLI runs as a Bun single-file executable, `import.meta.url` points
|
|
62
|
+
* inside the virtual bundle (`/$bunfs/…`), so sibling-relative resolution can't
|
|
63
|
+
* see the shipped `package.json`, `dist/index.js`, or `MenubarHelper.app` on
|
|
64
|
+
* disk. The launcher symlink points at the real files; walk up from it. Returns
|
|
65
|
+
* null when no launcher is found (dev/tsx runs, or a box without the helper) —
|
|
66
|
+
* callers keep their in-bundle resolution as the primary path and use this only
|
|
67
|
+
* as the fallback.
|
|
68
|
+
*/
|
|
69
|
+
export function resolveInstalledLayout() {
|
|
70
|
+
const bin = resolveAgentsBin();
|
|
71
|
+
if (!bin)
|
|
72
|
+
return null;
|
|
73
|
+
try {
|
|
74
|
+
const layout = installLayoutFromBin(fs.realpathSync(bin));
|
|
75
|
+
// Validate we landed on a real dist (guards an unexpected launcher layout).
|
|
76
|
+
if (fs.existsSync(layout.entryPath))
|
|
77
|
+
return layout;
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
/* ignore */
|
|
81
|
+
}
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
7
84
|
/**
|
|
8
85
|
* Resolve the CLI version from the shipping package.json. Used by the daemon
|
|
9
86
|
* to answer `IPCAction: 'version'` and by the client to detect daemon drift —
|
|
10
87
|
* a dev-build CLI talking to a launchd-managed registry daemon would silently
|
|
11
88
|
* get stale behavior without this check.
|
|
89
|
+
*
|
|
90
|
+
* Primary read is relative to this module; when that fails (the Bun single-file
|
|
91
|
+
* binary can't read its own bundled package.json), fall back to the on-disk
|
|
92
|
+
* install found via the launcher symlink so callers like the menu bar don't see
|
|
93
|
+
* a bogus `unknown`.
|
|
12
94
|
*/
|
|
13
95
|
export function getCliVersion() {
|
|
14
96
|
if (cached)
|
|
15
97
|
return cached;
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
}
|
|
21
|
-
catch {
|
|
22
|
-
cached = 'unknown';
|
|
23
|
-
}
|
|
98
|
+
cached =
|
|
99
|
+
readVersionAt(path.join(__dirname, '..', '..', 'package.json')) ??
|
|
100
|
+
readInstalledPackageVersion() ??
|
|
101
|
+
'unknown';
|
|
24
102
|
return cached;
|
|
25
103
|
}
|
|
104
|
+
/** Version from the on-disk install (Bun-binary fallback). */
|
|
105
|
+
function readInstalledPackageVersion() {
|
|
106
|
+
const layout = resolveInstalledLayout();
|
|
107
|
+
return layout ? readVersionAt(layout.pkgJsonPath) : null;
|
|
108
|
+
}
|
|
26
109
|
/**
|
|
27
110
|
* Read the version from package.json on disk every call, bypassing the cache.
|
|
28
111
|
*
|
|
@@ -34,12 +117,7 @@ export function getCliVersion() {
|
|
|
34
117
|
* 'unknown' on any error.
|
|
35
118
|
*/
|
|
36
119
|
export function getCliVersionFresh() {
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
return String(pkg.version || 'unknown');
|
|
41
|
-
}
|
|
42
|
-
catch {
|
|
43
|
-
return 'unknown';
|
|
44
|
-
}
|
|
120
|
+
return (readVersionAt(path.join(__dirname, '..', '..', 'package.json')) ??
|
|
121
|
+
readInstalledPackageVersion() ??
|
|
122
|
+
'unknown');
|
|
45
123
|
}
|
package/dist/lib/versions.d.ts
CHANGED
|
@@ -415,6 +415,17 @@ export declare function verifyInstalledBinaryLaunches(agent: AgentId, version: s
|
|
|
415
415
|
* 4. Nothing runnable installed → install `latest`, pin it, return it.
|
|
416
416
|
* 5. Give up → return null (caller surfaces a clear error).
|
|
417
417
|
*
|
|
418
|
+
* Isolation boundary (both directions — steps 3/4 are the only mutating ones):
|
|
419
|
+
* - An ISOLATED target gets step 2 and nothing else. Falling back would let
|
|
420
|
+
* `agents run <agent>@<isolated>` silently repoint the user's NORMAL default,
|
|
421
|
+
* and installing `latest` would materialize a version they never asked for.
|
|
422
|
+
* A failed repair returns null so the caller says so plainly.
|
|
423
|
+
* - An isolated version is never a fallback CANDIDATE either, whatever the
|
|
424
|
+
* target is: promoting one to the global default is exactly what `agents use`
|
|
425
|
+
* refuses and what removeVersion's promotion filter excludes, so it must not
|
|
426
|
+
* happen here by the back door (the daemon's launch-health pass calls this
|
|
427
|
+
* unattended every ~6h).
|
|
428
|
+
*
|
|
418
429
|
* Gated to npm-package agents: their native binary ships as an optional per-arch
|
|
419
430
|
* dependency whose tarball can extract partially (interrupted/raced install) —
|
|
420
431
|
* the exact failure this repairs. Agents with a global/native binary (grok,
|