open-overlord 0.2606161230.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (100) hide show
  1. package/README.md +148 -0
  2. package/bin/ovld.mjs +8 -0
  3. package/dist/agent-binaries.d.ts +3 -0
  4. package/dist/agent-binaries.d.ts.map +1 -0
  5. package/dist/agent-binaries.js +11 -0
  6. package/dist/agent-binaries.js.map +1 -0
  7. package/dist/agent-catalog-defaults.d.ts +15 -0
  8. package/dist/agent-catalog-defaults.d.ts.map +1 -0
  9. package/dist/agent-catalog-defaults.js +58 -0
  10. package/dist/agent-catalog-defaults.js.map +1 -0
  11. package/dist/agent-catalog.d.ts +7 -0
  12. package/dist/agent-catalog.d.ts.map +1 -0
  13. package/dist/agent-catalog.js +65 -0
  14. package/dist/agent-catalog.js.map +1 -0
  15. package/dist/args.d.ts +17 -0
  16. package/dist/args.d.ts.map +1 -0
  17. package/dist/args.js +80 -0
  18. package/dist/args.js.map +1 -0
  19. package/dist/backend-client.d.ts +19 -0
  20. package/dist/backend-client.d.ts.map +1 -0
  21. package/dist/backend-client.js +72 -0
  22. package/dist/backend-client.js.map +1 -0
  23. package/dist/commands.d.ts +13 -0
  24. package/dist/commands.d.ts.map +1 -0
  25. package/dist/commands.js +452 -0
  26. package/dist/commands.js.map +1 -0
  27. package/dist/config.d.ts +62 -0
  28. package/dist/config.d.ts.map +1 -0
  29. package/dist/config.js +213 -0
  30. package/dist/config.js.map +1 -0
  31. package/dist/connectors.d.ts +87 -0
  32. package/dist/connectors.d.ts.map +1 -0
  33. package/dist/connectors.js +640 -0
  34. package/dist/connectors.js.map +1 -0
  35. package/dist/errors.d.ts +9 -0
  36. package/dist/errors.d.ts.map +1 -0
  37. package/dist/errors.js +18 -0
  38. package/dist/errors.js.map +1 -0
  39. package/dist/help.d.ts +4 -0
  40. package/dist/help.d.ts.map +1 -0
  41. package/dist/help.js +60 -0
  42. package/dist/help.js.map +1 -0
  43. package/dist/index.d.ts +7 -0
  44. package/dist/index.d.ts.map +1 -0
  45. package/dist/index.js +125 -0
  46. package/dist/index.js.map +1 -0
  47. package/dist/launch.d.ts +40 -0
  48. package/dist/launch.d.ts.map +1 -0
  49. package/dist/launch.js +122 -0
  50. package/dist/launch.js.map +1 -0
  51. package/dist/management.d.ts +12 -0
  52. package/dist/management.d.ts.map +1 -0
  53. package/dist/management.js +313 -0
  54. package/dist/management.js.map +1 -0
  55. package/dist/mention-prompt.d.ts +26 -0
  56. package/dist/mention-prompt.d.ts.map +1 -0
  57. package/dist/mention-prompt.js +172 -0
  58. package/dist/mention-prompt.js.map +1 -0
  59. package/dist/mentions.d.ts +34 -0
  60. package/dist/mentions.d.ts.map +1 -0
  61. package/dist/mentions.js +85 -0
  62. package/dist/mentions.js.map +1 -0
  63. package/dist/native-session.d.ts +8 -0
  64. package/dist/native-session.d.ts.map +1 -0
  65. package/dist/native-session.js +103 -0
  66. package/dist/native-session.js.map +1 -0
  67. package/dist/output.d.ts +4 -0
  68. package/dist/output.d.ts.map +1 -0
  69. package/dist/output.js +14 -0
  70. package/dist/output.js.map +1 -0
  71. package/dist/repository-files.d.ts +7 -0
  72. package/dist/repository-files.d.ts.map +1 -0
  73. package/dist/repository-files.js +34 -0
  74. package/dist/repository-files.js.map +1 -0
  75. package/dist/runtime.d.ts +7 -0
  76. package/dist/runtime.d.ts.map +1 -0
  77. package/dist/runtime.js +9 -0
  78. package/dist/runtime.js.map +1 -0
  79. package/dist/select-prompt.d.ts +29 -0
  80. package/dist/select-prompt.d.ts.map +1 -0
  81. package/dist/select-prompt.js +52 -0
  82. package/dist/select-prompt.js.map +1 -0
  83. package/dist/serve.d.ts +25 -0
  84. package/dist/serve.d.ts.map +1 -0
  85. package/dist/serve.js +121 -0
  86. package/dist/serve.js.map +1 -0
  87. package/dist/setup.d.ts +5 -0
  88. package/dist/setup.d.ts.map +1 -0
  89. package/dist/setup.js +47 -0
  90. package/dist/setup.js.map +1 -0
  91. package/dist/terminal-launcher.d.ts +34 -0
  92. package/dist/terminal-launcher.d.ts.map +1 -0
  93. package/dist/terminal-launcher.js +104 -0
  94. package/dist/terminal-launcher.js.map +1 -0
  95. package/dist/version.d.ts +5 -0
  96. package/dist/version.d.ts.map +1 -0
  97. package/dist/version.js +34 -0
  98. package/dist/version.js.map +1 -0
  99. package/package.json +40 -0
  100. package/scripts/postinstall.mjs +1 -0
package/README.md ADDED
@@ -0,0 +1,148 @@
1
+ # CLI Module
2
+
3
+ The `ovld` command-line surface — Overlord's primary, CLI-first product.
4
+ This module is the home for everything a user or agent invokes as `ovld …`.
5
+
6
+ ## Contract Components
7
+
8
+ This module is the developer-facing home for three components defined in
9
+ [`CONTRACT.md`](../CONTRACT.md):
10
+
11
+ | Component | Stable id | What it owns |
12
+ | -------------- | ---------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
13
+ | CLI Layer | `cli` | Management command names/shapes, project linking & discovery, config file locations (`overlord.toml`, `.overlord/project.json`), human-readable output conventions |
14
+ | Protocol Layer | `protocol` | `ovld protocol` subcommands and flags, session lifecycle (`attach → (update\|heartbeat)* → (ask\|deliver)`), context-assembly format, delivery payload + change-rationale recording |
15
+ | Runner Layer | `runner` | `execution_requests` queue claiming and launch, working-directory resolution, `ovld runner` commands, execution-target selection |
16
+
17
+ These stay distinct components in the contract (separate interaction surfaces
18
+ and ownership). They are grouped into one developer module because they are all
19
+ the `ovld` command surface and tend to be worked on together.
20
+
21
+ ## Documentation
22
+
23
+ Requirements and behavior specs are colocated in this module's
24
+ [`docs/`](docs/) folder (see the root [README](../README.md#modules) for the
25
+ colocation convention):
26
+
27
+ - [01 — Core Domain and Lifecycle](docs/01-core-domain-and-lifecycle.md): projects, tickets, objectives, sessions, events, statuses, state transitions.
28
+ - [02 — CLI-First Product Surface](docs/02-cli-first-product-surface.md): management commands, configuration, project linking, output contracts.
29
+ - [03 — Agent Protocol](docs/03-agent-protocol.md): `ovld protocol` lifecycle, context assembly, updates, delivery, attachments.
30
+ - [04 — Runner and Launch Execution](docs/04-runner-and-launch-execution.md): execution requests, local runner, launch command generation, auto-advance.
31
+ - [05 — Review, Artifacts, and Change Tracking](docs/05-review-artifacts-and-change-tracking.md): delivery review records, artifacts, rationale coverage, local diff support.
32
+ - [Test Plan](docs/testing.md): test plan for the `cli`, `protocol`, and `runner` components — management commands, protocol lifecycle/attach-shape/validation conformance, runner queue atomicity, and surface smoke tests. Part of the root [TEST_PLAN.md](../TEST_PLAN.md).
33
+
34
+ ## Setup
35
+
36
+ The CLI is **client-only**. Management commands, protocol sessions, and runner
37
+ queue operations all reach persistence through the backend URL you configure — only
38
+ `help` and `version` work without one. First-time setup is about **pointing
39
+ `ovld` at a backend** and verifying it is reachable.
40
+
41
+ ### How the published CLI works
42
+
43
+ The npm package ships command parsing, config/auth onboarding, connector setup,
44
+ an HTTP backend client, and the local runner/agent launcher. It does **not** ship
45
+ SQLite, `better-sqlite3`, migrations, or the service-layer database runtime.
46
+
47
+ ```mermaid
48
+ flowchart LR
49
+ cli["ovld npm CLI"] -->|"HTTP /api/*"| local["Desktop or local backend"]
50
+ cli -->|"HTTP /api/*"| cloud["Hosted backend"]
51
+ local --> sqlite["SQLite"]
52
+ cloud --> postgres["Postgres"]
53
+ cli -->|"spawn"| agent["Local agent CLI"]
54
+ ```
55
+
56
+ Local mode means `ovld` talks to a backend already running on your machine,
57
+ normally Desktop or a future db-only local backend. Cloud mode means `ovld`
58
+ talks to a hosted Overlord backend. In both modes, the backend owns persistence
59
+ and migrations; the CLI is a client of that backend.
60
+
61
+ ### Point the CLI at a backend
62
+
63
+ Configuration lives in `overlord.toml` (discovered from the current directory
64
+ upward, or in `~/.ovld/overlord.toml` for a global install).
65
+
66
+ | Mode | Config key | How to set it |
67
+ | ---- | ---------- | ------------- |
68
+ | **Local backend** | `backend_url` | `ovld config set local [url]` — defaults to `http://127.0.0.1:4310` |
69
+ | **Hosted backend** | `backend_url` | `ovld config set cloud <url>` |
70
+
71
+ `ovld config set` without arguments opens the interactive backend selector.
72
+ `ovld config list` shows the resolved target; `ovld doctor` checks that the
73
+ backend is reachable.
74
+
75
+ Environment overrides (useful in scripts and CI):
76
+
77
+ - `OVLD_HOME` — relocate the global `~/.ovld` directory
78
+ - `OVERLORD_USER_TOKEN` / `USER_TOKEN` — bearer token sent to hosted backends when set
79
+
80
+ The local backend/Desktop package owns SQLite and migrations. The published npm
81
+ CLI only stores the backend URL and sends HTTP requests.
82
+
83
+ ### What requires the backend
84
+
85
+ These commands work without a backend: `ovld help`, `ovld version`,
86
+ `ovld config ...`, and connector setup/inspection commands that only touch local
87
+ files. Commands that read or mutate Overlord state — projects, tickets,
88
+ protocol calls, runner queue operations, and launch context assembly — call the
89
+ configured backend URL.
90
+
91
+ `ovld runner` is still local in the important sense: it claims work through the
92
+ backend API, then spawns the selected agent process on your machine in the
93
+ resolved project directory. The queue state remains in the backend.
94
+
95
+ ### First run
96
+
97
+ After installing the published package:
98
+
99
+ ```bash
100
+ ovld auth login
101
+ ```
102
+
103
+ Login verifies that a backend is configured. If none is set yet, it walks through
104
+ `ovld config` first — local setup offers `http://127.0.0.1:4310` as the default
105
+ backend URL; cloud setup accepts a hosted backend URL.
106
+
107
+ Then confirm the connection and continue with projects, tickets, and agents:
108
+
109
+ ```bash
110
+ ovld doctor
111
+ ovld config list
112
+ ```
113
+
114
+ See [Getting Started](../docs/getting-started.md) for the full walkthrough from
115
+ install through first delivered ticket.
116
+
117
+ ## Code & Tests
118
+
119
+ The packaged CLI lives in this module as a self-contained Yarn sub-project:
120
+
121
+ ```bash
122
+ yarn build:cli # compile TypeScript to cli/dist/
123
+ yarn test:cli # unit + subprocess smoke tests
124
+ yarn pack:cli # produce an installable tarball
125
+ node cli/bin/ovld.mjs version
126
+ ```
127
+
128
+ Layout:
129
+
130
+ ```
131
+ cli/
132
+ bin/ovld.mjs # published bin entry (imports compiled dist/)
133
+ src/ # TypeScript implementation
134
+ dist/ # build output (gitignored)
135
+ test/ # colocated tests, including cli/test/e2e/
136
+ package.json # bin map, build scripts, pack metadata
137
+ ```
138
+
139
+ The CLI ships command parsing, config/auth onboarding, connector setup, backend
140
+ client calls, and local runner/agent launch logic. Run `yarn build` before using
141
+ the compiled CLI (`node cli/bin/ovld.mjs …`).
142
+
143
+ ## Interaction Boundaries
144
+
145
+ Per the contract, the CLI/protocol/runner surfaces reach persistence only
146
+ through the configured **REST/backend API** — never direct table writes.
147
+ See the Interaction Surfaces section of [`CONTRACT.md`](../CONTRACT.md) before
148
+ making any cross-module change.
package/bin/ovld.mjs ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { runCli } from '../dist/index.js';
4
+
5
+ runCli({ primaryCommand: 'ovld' }).catch(error => {
6
+ console.error(error instanceof Error ? error.message : error);
7
+ process.exit(1);
8
+ });
@@ -0,0 +1,3 @@
1
+ /** Map a connector agent key to the executable invoked at launch time. */
2
+ export declare function resolveAgentBinary(agentKey: string): string;
3
+ //# sourceMappingURL=agent-binaries.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-binaries.d.ts","sourceRoot":"","sources":["../src/agent-binaries.ts"],"names":[],"mappings":"AAOA,0EAA0E;AAC1E,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE3D"}
@@ -0,0 +1,11 @@
1
+ /** Native agent binary names by connector key, for PATH detection and launch. */
2
+ const AGENT_BINARIES = {
3
+ claude: 'claude',
4
+ codex: 'codex',
5
+ cursor: 'agent'
6
+ };
7
+ /** Map a connector agent key to the executable invoked at launch time. */
8
+ export function resolveAgentBinary(agentKey) {
9
+ return AGENT_BINARIES[agentKey] ?? agentKey;
10
+ }
11
+ //# sourceMappingURL=agent-binaries.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-binaries.js","sourceRoot":"","sources":["../src/agent-binaries.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,MAAM,cAAc,GAA2B;IAC7C,MAAM,EAAE,QAAQ;IAChB,KAAK,EAAE,OAAO;IACd,MAAM,EAAE,OAAO;CAChB,CAAC;AAEF,0EAA0E;AAC1E,MAAM,UAAU,kBAAkB,CAAC,QAAgB;IACjD,OAAO,cAAc,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC;AAC9C,CAAC"}
@@ -0,0 +1,15 @@
1
+ /** Bundled workspace agent catalog seeded when overlord.toml has no [agent_catalog]. */
2
+ export type CatalogAgent = {
3
+ label: string;
4
+ availableByDefault: boolean;
5
+ models: Array<{
6
+ id: string;
7
+ displayName: string;
8
+ reasoningOptions: string[];
9
+ }>;
10
+ defaultModel: string | null;
11
+ defaultReasoningEffort: string | null;
12
+ reasoningLabel: string;
13
+ };
14
+ export declare const BUNDLED_AGENT_CATALOG: Record<string, CatalogAgent>;
15
+ //# sourceMappingURL=agent-catalog-defaults.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-catalog-defaults.d.ts","sourceRoot":"","sources":["../src/agent-catalog-defaults.ts"],"names":[],"mappings":"AAAA,wFAAwF;AACxF,MAAM,MAAM,YAAY,GAAG;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,kBAAkB,EAAE,OAAO,CAAC;IAC5B,MAAM,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,gBAAgB,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;IAC/E,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,sBAAsB,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,cAAc,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,eAAO,MAAM,qBAAqB,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAyD9D,CAAC"}
@@ -0,0 +1,58 @@
1
+ export const BUNDLED_AGENT_CATALOG = {
2
+ claude: {
3
+ label: 'Claude Code',
4
+ availableByDefault: true,
5
+ models: [
6
+ {
7
+ id: 'claude-fable-5',
8
+ displayName: 'Fable 5',
9
+ reasoningOptions: ['low', 'medium', 'high', 'xhigh', 'max', 'ultracode']
10
+ },
11
+ {
12
+ id: 'claude-opus-4-8',
13
+ displayName: 'Opus 4.8',
14
+ reasoningOptions: ['low', 'medium', 'high', 'xhigh', 'max', 'ultracode']
15
+ },
16
+ {
17
+ id: 'claude-sonnet-4-6',
18
+ displayName: 'Sonnet 4.6',
19
+ reasoningOptions: ['low', 'medium', 'high']
20
+ },
21
+ { id: 'claude-haiku-4-5', displayName: 'Haiku 4.5', reasoningOptions: [] }
22
+ ],
23
+ defaultModel: null,
24
+ defaultReasoningEffort: null,
25
+ reasoningLabel: 'Thinking'
26
+ },
27
+ codex: {
28
+ label: 'Codex',
29
+ availableByDefault: true,
30
+ models: [
31
+ {
32
+ id: 'gpt-5.4',
33
+ displayName: 'GPT-5.4',
34
+ reasoningOptions: ['low', 'medium', 'high', 'xhigh']
35
+ },
36
+ {
37
+ id: 'gpt-5.5',
38
+ displayName: 'GPT-5.5',
39
+ reasoningOptions: ['low', 'medium', 'high', 'xhigh']
40
+ }
41
+ ],
42
+ defaultModel: 'gpt-5.4',
43
+ defaultReasoningEffort: 'medium',
44
+ reasoningLabel: 'Effort'
45
+ },
46
+ cursor: {
47
+ label: 'Cursor',
48
+ availableByDefault: true,
49
+ models: [
50
+ { id: 'auto', displayName: 'Auto', reasoningOptions: [] },
51
+ { id: 'composer-2.5', displayName: 'Composer 2.5', reasoningOptions: [] }
52
+ ],
53
+ defaultModel: 'auto',
54
+ defaultReasoningEffort: null,
55
+ reasoningLabel: 'Thinking'
56
+ }
57
+ };
58
+ //# sourceMappingURL=agent-catalog-defaults.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-catalog-defaults.js","sourceRoot":"","sources":["../src/agent-catalog-defaults.ts"],"names":[],"mappings":"AAUA,MAAM,CAAC,MAAM,qBAAqB,GAAiC;IACjE,MAAM,EAAE;QACN,KAAK,EAAE,aAAa;QACpB,kBAAkB,EAAE,IAAI;QACxB,MAAM,EAAE;YACN;gBACE,EAAE,EAAE,gBAAgB;gBACpB,WAAW,EAAE,SAAS;gBACtB,gBAAgB,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,CAAC;aACzE;YACD;gBACE,EAAE,EAAE,iBAAiB;gBACrB,WAAW,EAAE,UAAU;gBACvB,gBAAgB,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,CAAC;aACzE;YACD;gBACE,EAAE,EAAE,mBAAmB;gBACvB,WAAW,EAAE,YAAY;gBACzB,gBAAgB,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC;aAC5C;YACD,EAAE,EAAE,EAAE,kBAAkB,EAAE,WAAW,EAAE,WAAW,EAAE,gBAAgB,EAAE,EAAE,EAAE;SAC3E;QACD,YAAY,EAAE,IAAI;QAClB,sBAAsB,EAAE,IAAI;QAC5B,cAAc,EAAE,UAAU;KAC3B;IACD,KAAK,EAAE;QACL,KAAK,EAAE,OAAO;QACd,kBAAkB,EAAE,IAAI;QACxB,MAAM,EAAE;YACN;gBACE,EAAE,EAAE,SAAS;gBACb,WAAW,EAAE,SAAS;gBACtB,gBAAgB,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC;aACrD;YAED;gBACE,EAAE,EAAE,SAAS;gBACb,WAAW,EAAE,SAAS;gBACtB,gBAAgB,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC;aACrD;SACF;QACD,YAAY,EAAE,SAAS;QACvB,sBAAsB,EAAE,QAAQ;QAChC,cAAc,EAAE,QAAQ;KACzB;IACD,MAAM,EAAE;QACN,KAAK,EAAE,QAAQ;QACf,kBAAkB,EAAE,IAAI;QACxB,MAAM,EAAE;YACN,EAAE,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,gBAAgB,EAAE,EAAE,EAAE;YACzD,EAAE,EAAE,EAAE,cAAc,EAAE,WAAW,EAAE,cAAc,EAAE,gBAAgB,EAAE,EAAE,EAAE;SAC1E;QACD,YAAY,EAAE,MAAM;QACpB,sBAAsB,EAAE,IAAI;QAC5B,cAAc,EAAE,UAAU;KAC3B;CACF,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { type CatalogAgent } from './agent-catalog-defaults.ts';
2
+ export declare function parseAgentCatalogFromToml(raw: unknown): Record<string, CatalogAgent> | null;
3
+ /** Instance catalog: bundled defaults merged with optional overlord.toml overrides. */
4
+ export declare function resolveInstanceAgentCatalog({ configCatalog }: {
5
+ configCatalog: Record<string, CatalogAgent> | null;
6
+ }): Record<string, CatalogAgent>;
7
+ //# sourceMappingURL=agent-catalog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-catalog.d.ts","sourceRoot":"","sources":["../src/agent-catalog.ts"],"names":[],"mappings":"AAAA,OAAO,EAAyB,KAAK,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAsBvF,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,GAAG,IAAI,CAgC3F;AAiCD,uFAAuF;AACvF,wBAAgB,2BAA2B,CAAC,EAC1C,aAAa,EACd,EAAE;IACD,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,GAAG,IAAI,CAAC;CACpD,GAAG,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAK/B"}
@@ -0,0 +1,65 @@
1
+ import { BUNDLED_AGENT_CATALOG } from "./agent-catalog-defaults.js";
2
+ function emptyToNull(value) {
3
+ if (value === undefined || value === '')
4
+ return null;
5
+ return value;
6
+ }
7
+ export function parseAgentCatalogFromToml(raw) {
8
+ if (!raw || typeof raw !== 'object' || Array.isArray(raw))
9
+ return null;
10
+ const agents = {};
11
+ for (const [key, entry] of Object.entries(raw)) {
12
+ if (!entry || typeof entry !== 'object' || Array.isArray(entry))
13
+ continue;
14
+ const models = (entry.models ?? [])
15
+ .filter((model) => {
16
+ return Boolean(model && typeof model === 'object' && typeof model.id === 'string');
17
+ })
18
+ .map(model => ({
19
+ id: model.id,
20
+ displayName: model.display_name?.trim() || model.id,
21
+ reasoningOptions: Array.isArray(model.reasoning_options)
22
+ ? model.reasoning_options.filter((option) => typeof option === 'string')
23
+ : []
24
+ }));
25
+ if (!entry.label?.trim() || models.length === 0)
26
+ continue;
27
+ agents[key] = {
28
+ label: entry.label.trim(),
29
+ availableByDefault: entry.available_by_default !== false,
30
+ models,
31
+ defaultModel: emptyToNull(entry.default_model),
32
+ defaultReasoningEffort: emptyToNull(entry.default_reasoning_effort),
33
+ reasoningLabel: entry.reasoning_label?.trim() || 'Thinking'
34
+ };
35
+ }
36
+ return Object.keys(agents).length > 0 ? agents : null;
37
+ }
38
+ function mergeAgentCatalogs({ base, overrides }) {
39
+ const merged = structuredClone(base);
40
+ for (const [key, override] of Object.entries(overrides)) {
41
+ const existing = merged[key];
42
+ if (!existing) {
43
+ merged[key] = structuredClone(override);
44
+ continue;
45
+ }
46
+ const modelsById = new Map(existing.models.map(model => [model.id, model]));
47
+ for (const model of override.models) {
48
+ modelsById.set(model.id, model);
49
+ }
50
+ merged[key] = {
51
+ ...existing,
52
+ ...override,
53
+ models: Array.from(modelsById.values())
54
+ };
55
+ }
56
+ return merged;
57
+ }
58
+ /** Instance catalog: bundled defaults merged with optional overlord.toml overrides. */
59
+ export function resolveInstanceAgentCatalog({ configCatalog }) {
60
+ if (!configCatalog) {
61
+ return structuredClone(BUNDLED_AGENT_CATALOG);
62
+ }
63
+ return mergeAgentCatalogs({ base: BUNDLED_AGENT_CATALOG, overrides: configCatalog });
64
+ }
65
+ //# sourceMappingURL=agent-catalog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-catalog.js","sourceRoot":"","sources":["../src/agent-catalog.ts"],"names":[],"mappings":"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"}
package/dist/args.d.ts ADDED
@@ -0,0 +1,17 @@
1
+ export type ParsedArgs = {
2
+ positional: string[];
3
+ flags: Map<string, string | true>;
4
+ };
5
+ export declare function parseArgs(argv: string[]): ParsedArgs;
6
+ export declare function flagValue(flags: Map<string, string | true>, name: string): string | undefined;
7
+ export declare function flagBoolean(flags: Map<string, string | true>, name: string): boolean;
8
+ export declare function requireFlag(flags: Map<string, string | true>, name: string): string;
9
+ export declare function readFlagOrFile({ flags, flagName, fileFlagName, stdin }: {
10
+ flags: Map<string, string | true>;
11
+ flagName: string;
12
+ fileFlagName: string;
13
+ stdin?: string;
14
+ }): Promise<string | undefined>;
15
+ export declare function parseJsonFlag(flags: Map<string, string | true>, flagName: string): Record<string, unknown> | undefined;
16
+ export declare function parseCsvFlag(value: string | undefined): string[] | undefined;
17
+ //# sourceMappingURL=args.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"args.d.ts","sourceRoot":"","sources":["../src/args.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAAG;IACvB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC;CACnC,CAAC;AAEF,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CAkCpD;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAI7F;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAEpF;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAMnF;AAED,wBAAsB,cAAc,CAAC,EACnC,KAAK,EACL,QAAQ,EACR,YAAY,EACZ,KAAK,EACN,EAAE;IACD,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAkB9B;AAED,wBAAgB,aAAa,CAC3B,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,EACjC,QAAQ,EAAE,MAAM,GACf,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAIrC;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,EAAE,GAAG,SAAS,CAM5E"}
package/dist/args.js ADDED
@@ -0,0 +1,80 @@
1
+ export function parseArgs(argv) {
2
+ const positional = [];
3
+ const flags = new Map();
4
+ for (let index = 0; index < argv.length; index += 1) {
5
+ const token = argv[index];
6
+ if (!token)
7
+ continue;
8
+ if (token === '--') {
9
+ positional.push(...argv.slice(index + 1));
10
+ break;
11
+ }
12
+ if (token.startsWith('--')) {
13
+ const eqIndex = token.indexOf('=');
14
+ if (eqIndex >= 0) {
15
+ flags.set(token.slice(0, eqIndex), token.slice(eqIndex + 1));
16
+ continue;
17
+ }
18
+ const next = argv[index + 1];
19
+ if (next !== undefined && (!next.startsWith('-') || next === '-')) {
20
+ flags.set(token, next);
21
+ index += 1;
22
+ }
23
+ else {
24
+ flags.set(token, true);
25
+ }
26
+ continue;
27
+ }
28
+ positional.push(token);
29
+ }
30
+ return { positional, flags };
31
+ }
32
+ export function flagValue(flags, name) {
33
+ const value = flags.get(name);
34
+ if (value === true || value === undefined)
35
+ return undefined;
36
+ return value;
37
+ }
38
+ export function flagBoolean(flags, name) {
39
+ return flags.has(name);
40
+ }
41
+ export function requireFlag(flags, name) {
42
+ const value = flagValue(flags, name);
43
+ if (!value) {
44
+ throw new Error(`Missing required flag: ${name}`);
45
+ }
46
+ return value;
47
+ }
48
+ export async function readFlagOrFile({ flags, flagName, fileFlagName, stdin }) {
49
+ const direct = flagValue(flags, flagName);
50
+ if (direct)
51
+ return direct;
52
+ const filePath = flagValue(flags, fileFlagName);
53
+ if (filePath === '-') {
54
+ if (stdin !== undefined) {
55
+ return stdin;
56
+ }
57
+ const { readFileSync } = await import('node:fs');
58
+ return readFileSync(0, 'utf8');
59
+ }
60
+ if (filePath) {
61
+ const { readFileSync } = await import('node:fs');
62
+ return readFileSync(filePath, 'utf8');
63
+ }
64
+ return undefined;
65
+ }
66
+ export function parseJsonFlag(flags, flagName) {
67
+ const raw = flagValue(flags, flagName);
68
+ if (!raw)
69
+ return undefined;
70
+ return JSON.parse(raw);
71
+ }
72
+ export function parseCsvFlag(value) {
73
+ if (!value)
74
+ return undefined;
75
+ return value
76
+ .split(',')
77
+ .map(part => part.trim())
78
+ .filter(Boolean);
79
+ }
80
+ //# sourceMappingURL=args.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"args.js","sourceRoot":"","sources":["../src/args.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ export type BackendClient = {
2
+ baseUrl: string;
3
+ health: () => Promise<{
4
+ ok: boolean;
5
+ [key: string]: unknown;
6
+ }>;
7
+ get: <T>(path: string) => Promise<T>;
8
+ post: <T>({ path, body }: {
9
+ path: string;
10
+ body?: unknown;
11
+ }) => Promise<T>;
12
+ patch: <T>({ path, body }: {
13
+ path: string;
14
+ body?: unknown;
15
+ }) => Promise<T>;
16
+ delete: <T>(path: string) => Promise<T>;
17
+ };
18
+ export declare function createBackendClient(): BackendClient;
19
+ //# sourceMappingURL=backend-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backend-client.d.ts","sourceRoot":"","sources":["../src/backend-client.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,aAAa,GAAG;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,OAAO,CAAC;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,CAAC,CAAC;IAC/D,GAAG,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;IACrC,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,OAAO,CAAA;KAAE,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;IAC1E,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,OAAO,CAAA;KAAE,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;IAC3E,MAAM,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;CACzC,CAAC;AA+BF,wBAAgB,mBAAmB,IAAI,aAAa,CAoDnD"}
@@ -0,0 +1,72 @@
1
+ import { loadConfig, resolveBackendUrl } from './config.js';
2
+ import { CliError } from './errors.js';
3
+ function normalizeBaseUrl(value) {
4
+ return value.replace(/\/+$/, '');
5
+ }
6
+ function authHeaders() {
7
+ const token = process.env.OVERLORD_USER_TOKEN ?? process.env.USER_TOKEN;
8
+ return token ? { Authorization: `Bearer ${token}` } : {};
9
+ }
10
+ async function readResponseJson(response) {
11
+ const text = await response.text();
12
+ if (!text)
13
+ return null;
14
+ try {
15
+ return JSON.parse(text);
16
+ }
17
+ catch {
18
+ return text;
19
+ }
20
+ }
21
+ function errorMessageFromJson(value) {
22
+ if (!value || typeof value !== 'object')
23
+ return null;
24
+ const record = value;
25
+ return typeof record.error === 'string'
26
+ ? record.error
27
+ : typeof record.message === 'string'
28
+ ? record.message
29
+ : null;
30
+ }
31
+ export function createBackendClient() {
32
+ const baseUrl = normalizeBaseUrl(resolveBackendUrl(loadConfig()));
33
+ async function request({ method, path, body }) {
34
+ const url = `${baseUrl}${path.startsWith('/') ? path : `/${path}`}`;
35
+ let response;
36
+ try {
37
+ response = await fetch(url, {
38
+ method,
39
+ headers: {
40
+ Accept: 'application/json',
41
+ ...(body === undefined ? {} : { 'Content-Type': 'application/json' }),
42
+ ...authHeaders()
43
+ },
44
+ body: body === undefined ? undefined : JSON.stringify(body)
45
+ });
46
+ }
47
+ catch (error) {
48
+ throw new CliError({
49
+ message: `Could not reach Overlord backend at ${baseUrl}.\n` +
50
+ 'Start the Desktop/local backend or run `ovld config set cloud <url>`.\n' +
51
+ (error instanceof Error ? error.message : String(error))
52
+ });
53
+ }
54
+ const payload = await readResponseJson(response);
55
+ if (!response.ok) {
56
+ throw new CliError({
57
+ message: errorMessageFromJson(payload) ??
58
+ `Backend request failed: ${method} ${path} (${response.status})`
59
+ });
60
+ }
61
+ return payload;
62
+ }
63
+ return {
64
+ baseUrl,
65
+ health: () => request({ method: 'GET', path: '/api/health' }),
66
+ get: path => request({ method: 'GET', path }),
67
+ post: ({ path, body }) => request({ method: 'POST', path, body }),
68
+ patch: ({ path, body }) => request({ method: 'PATCH', path, body }),
69
+ delete: path => request({ method: 'DELETE', path })
70
+ };
71
+ }
72
+ //# sourceMappingURL=backend-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backend-client.js","sourceRoot":"","sources":["../src/backend-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAC5D,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAWvC,SAAS,gBAAgB,CAAC,KAAa;IACrC,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AACnC,CAAC;AAED,SAAS,WAAW;IAClB,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;IACxE,OAAO,KAAK,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,UAAU,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;AAC3D,CAAC;AAED,KAAK,UAAU,gBAAgB,CAAC,QAAkB;IAChD,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IACnC,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACvB,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAY,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAc;IAC1C,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IACrD,MAAM,MAAM,GAAG,KAAgC,CAAC;IAChD,OAAO,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ;QACrC,CAAC,CAAC,MAAM,CAAC,KAAK;QACd,CAAC,CAAC,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ;YAClC,CAAC,CAAC,MAAM,CAAC,OAAO;YAChB,CAAC,CAAC,IAAI,CAAC;AACb,CAAC;AAED,MAAM,UAAU,mBAAmB;IACjC,MAAM,OAAO,GAAG,gBAAgB,CAAC,iBAAiB,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;IAElE,KAAK,UAAU,OAAO,CAAI,EACxB,MAAM,EACN,IAAI,EACJ,IAAI,EAKL;QACC,MAAM,GAAG,GAAG,GAAG,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC;QACpE,IAAI,QAAkB,CAAC;QACvB,IAAI,CAAC;YACH,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;gBAC1B,MAAM;gBACN,OAAO,EAAE;oBACP,MAAM,EAAE,kBAAkB;oBAC1B,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC;oBACrE,GAAG,WAAW,EAAE;iBACjB;gBACD,IAAI,EAAE,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;aAC5D,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,QAAQ,CAAC;gBACjB,OAAO,EACL,uCAAuC,OAAO,KAAK;oBACnD,yEAAyE;oBACzE,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;aAC3D,CAAC,CAAC;QACL,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QACjD,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,QAAQ,CAAC;gBACjB,OAAO,EACL,oBAAoB,CAAC,OAAO,CAAC;oBAC7B,2BAA2B,MAAM,IAAI,IAAI,KAAK,QAAQ,CAAC,MAAM,GAAG;aACnE,CAAC,CAAC;QACL,CAAC;QACD,OAAO,OAAY,CAAC;IACtB,CAAC;IAED,OAAO;QACL,OAAO;QACP,MAAM,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;QAC7D,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;QAC7C,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QACjE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QACnE,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;KACpD,CAAC;AACJ,CAAC"}
@@ -0,0 +1,13 @@
1
+ import type { CliRuntime } from './runtime.js';
2
+ export declare function runProtocolCommand({ runtime, subcommand, args, stdin }: {
3
+ runtime: CliRuntime;
4
+ subcommand: string;
5
+ args: string[];
6
+ stdin?: string;
7
+ }): Promise<void>;
8
+ export declare function runManagementCommand({ runtime, command, rest }: {
9
+ runtime?: CliRuntime;
10
+ command: string;
11
+ rest: string[];
12
+ }): Promise<void>;
13
+ //# sourceMappingURL=commands.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAyD/C,wBAAsB,kBAAkB,CAAC,EACvC,OAAO,EACP,UAAU,EACV,IAAI,EACJ,KAAK,EACN,EAAE;IACD,OAAO,EAAE,UAAU,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GAAG,OAAO,CAAC,IAAI,CAAC,CAoChB;AAED,wBAAsB,oBAAoB,CAAC,EACzC,OAAO,EACP,OAAO,EACP,IAAI,EACL,EAAE;IACD,OAAO,CAAC,EAAE,UAAU,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB,GAAG,OAAO,CAAC,IAAI,CAAC,CAgPhB"}