@hilbras/omninode 0.0.0-stage → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Hilbras
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,3 +1,110 @@
1
- # Temporary Holding Version
1
+ # OmniNode
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ **OmniNode** is a provider-agnostic multi-AI orchestration platform. It coordinates
4
+ CLI-based AI agents, AI providers, persistent memory, roles, reports and planning
5
+ into a unified execution system — so multiple AI systems can collaborate on complex
6
+ software engineering and knowledge-work tasks.
7
+
8
+ OmniNode is **not an AI provider** and is **not dependent on OmniHilbras** (or on
9
+ OpenAI, Gemini, DeepSeek, Qwen, or any other specific vendor). It orchestrates
10
+ existing intelligence; it does not try to become another model.
11
+
12
+ ## Status
13
+
14
+ **v0.1.0 — Phase 0: Foundation** (see [docs/DEVELOPMENT_PLAN.md](docs/DEVELOPMENT_PLAN.md)
15
+ for the full plan and roadmap).
16
+
17
+ What exists today:
18
+
19
+ - Core type contracts: provider, model, agent, role, task, report, pipeline,
20
+ protocol, memory (`src/types/`)
21
+ - Typed error hierarchy (`src/errors/`)
22
+ - Leveled logger with pluggable sink (`src/logger/`)
23
+ - Configuration system: `omninode.yaml` with `${ENV_VAR}` expansion and strict
24
+ validation (`src/config/`)
25
+ - CLI with `init`, `provider list`, `agent list`, `role list`, and honest
26
+ stubs for the phase-dependent commands (`src/cli/`)
27
+ - Test infrastructure (Vitest) and CI (GitHub Actions)
28
+
29
+ Nothing here depends on any provider or agent — that is the point of Phase 0.
30
+
31
+ ## Requirements
32
+
33
+ - Node.js >= 20
34
+
35
+ ## Quick start (from source)
36
+
37
+ ```bash
38
+ npm install
39
+ npm run build
40
+ node dist/cli/index.js --help
41
+
42
+ # Or run from source:
43
+ npm run omninode -- --help
44
+ ```
45
+
46
+ Start a project:
47
+
48
+ ```bash
49
+ omninode init # writes omninode.yaml in the current directory
50
+ omninode provider list # validates and lists configured providers
51
+ omninode agent list
52
+ omninode role list
53
+ ```
54
+
55
+ See [omninode.yaml.example](omninode.yaml.example) for a full configuration.
56
+
57
+ ### Configuration
58
+
59
+ OmniNode reads `omninode.yaml` (or `.yml` / `.json`) from the working directory.
60
+ Two rules matter:
61
+
62
+ 1. **Credentials never live in the file.** Reference environment variables with
63
+ `api_key_env_var: MY_API_KEY`; `${VAR}` / `${VAR:-fallback}` references anywhere
64
+ in the file are expanded at load time and unset variables abort loading.
65
+ 2. **Unknown keys are rejected.** Typos fail loudly instead of being ignored.
66
+
67
+ ## Development
68
+
69
+ ```bash
70
+ npm run build # bundle with tsup (library + CLI)
71
+ npm test # run tests once
72
+ npm run test:watch # watch mode
73
+ npm run lint # eslint
74
+ npm run typecheck # tsc --noEmit
75
+ npm run format # prettier
76
+ ```
77
+
78
+ ## Roadmap
79
+
80
+ Phases 0–11 are laid out in [docs/DEVELOPMENT_PLAN.md](docs/DEVELOPMENT_PLAN.md):
81
+
82
+ | Version | Milestone |
83
+ | --- | --- |
84
+ | v0.1.0 | Foundation (this release) |
85
+ | v0.2.0 | Provider System |
86
+ | v0.3.0 | OmniHilbras Integration (optional, like every provider) |
87
+ | v0.4.0 | Agent System |
88
+ | v0.5.0 | Roles & Tasks |
89
+ | v0.6.0 | Pipeline Engine |
90
+ | v0.7.0 | Multi-AI Reports |
91
+ | v0.8.0 | Remembera (optional memory integration) |
92
+ | v0.9.0 | Planner |
93
+ | v0.10.0 | End-to-End Runtime |
94
+ | v1.0.0 | Production Release |
95
+
96
+ Core architectural rule: OmniNode must run successfully with **zero Hilbras
97
+ dependencies**. OmniHilbras and Remembera make it more powerful, but neither is
98
+ required for the core engine.
99
+
100
+ ## Install
101
+
102
+ ```bash
103
+ npm install -g @hilbras/omninode
104
+ ```
105
+
106
+ Or use it as a library: `npm install @hilbras/omninode`.
107
+
108
+ ## License
109
+
110
+ [MIT](LICENSE)
@@ -0,0 +1,378 @@
1
+ #!/usr/bin/env node
2
+
3
+ // src/cli/index.ts
4
+ import { pathToFileURL } from "url";
5
+ import { realpathSync } from "fs";
6
+ import { Command } from "commander";
7
+
8
+ // src/version.ts
9
+ var OMNINODE_VERSION = "0.1.0";
10
+
11
+ // src/errors/index.ts
12
+ var OmniNodeError = class extends Error {
13
+ code;
14
+ details;
15
+ constructor(code, message, options = {}) {
16
+ super(message, { cause: options.cause });
17
+ this.name = new.target.name;
18
+ this.code = code;
19
+ this.details = options.details;
20
+ }
21
+ };
22
+ var ConfigError = class extends OmniNodeError {
23
+ constructor(code, message, options = {}) {
24
+ super(code, message, options);
25
+ }
26
+ };
27
+ function isOmniNodeError(value) {
28
+ return value instanceof OmniNodeError;
29
+ }
30
+
31
+ // src/cli/commands/init.ts
32
+ import { existsSync as existsSync2, writeFileSync } from "fs";
33
+
34
+ // src/config/schema.ts
35
+ import { z } from "zod";
36
+ var providerConfigSchema = z.object({
37
+ name: z.string().min(1),
38
+ type: z.enum(["openai-compatible", "omnihilbras", "openrouter", "local", "custom"]),
39
+ base_url: z.string().url(),
40
+ api_key_env_var: z.string().min(1).optional(),
41
+ headers: z.record(z.string()).optional(),
42
+ enabled: z.boolean().optional(),
43
+ metadata: z.record(z.unknown()).optional()
44
+ }).strict();
45
+ var agentConfigSchema = z.object({
46
+ name: z.string().min(1),
47
+ /** "cli" agents communicate over stdin/stdout (process adapter). */
48
+ type: z.enum(["cli", "native", "process"]).default("cli"),
49
+ command: z.string().min(1).optional(),
50
+ args: z.array(z.string()).optional(),
51
+ cwd: z.string().optional(),
52
+ env: z.record(z.string()).optional(),
53
+ metadata: z.record(z.unknown()).optional()
54
+ }).strict();
55
+ var roleConfigSchema = z.object({
56
+ id: z.string().min(1).regex(/^[a-z0-9][a-z0-9-]*$/, "role id must be kebab-case"),
57
+ name: z.string().min(1),
58
+ description: z.string().optional(),
59
+ responsibilities: z.array(z.string()).default([]),
60
+ expected_outputs: z.array(z.string()).default([]),
61
+ preferred_agents: z.array(z.string()).optional(),
62
+ system_prompt: z.string().optional(),
63
+ metadata: z.record(z.unknown()).optional()
64
+ }).strict();
65
+ var projectConfigSchema = z.object({
66
+ name: z.string().min(1),
67
+ providers: z.array(providerConfigSchema).default([]),
68
+ agents: z.array(agentConfigSchema).default([]),
69
+ roles: z.array(roleConfigSchema).default([]),
70
+ memory: z.object({ provider: z.string().min(1) }).strict().optional()
71
+ }).strict();
72
+ var appConfigSchema = z.object({
73
+ project: projectConfigSchema,
74
+ logging: z.object({ level: z.enum(["debug", "info", "warn", "error"]) }).strict().optional()
75
+ }).strict();
76
+
77
+ // src/config/loader.ts
78
+ import { existsSync, readFileSync } from "fs";
79
+ import { parse as parseYaml } from "yaml";
80
+ var CONFIG_FILENAMES = ["omninode.yaml", "omninode.yml", "omninode.json"];
81
+ function findConfigFile(directory = process.cwd()) {
82
+ for (const filename of CONFIG_FILENAMES) {
83
+ const candidate = `${directory}/${filename}`;
84
+ if (existsSync(candidate)) return candidate;
85
+ }
86
+ return void 0;
87
+ }
88
+ function expandEnvRefs(text, env, source = "config") {
89
+ return text.replace(
90
+ /\$\{([A-Za-z_][A-Za-z0-9_]*)(?::-([^}]*))?\}/g,
91
+ (_match, name, fallback) => {
92
+ const value = env[name] ?? fallback;
93
+ if (value === void 0) {
94
+ throw new ConfigError(
95
+ "CONFIG_INVALID",
96
+ `Environment variable "${name}" is referenced in ${source} but is not set and has no default.`
97
+ );
98
+ }
99
+ return value;
100
+ }
101
+ );
102
+ }
103
+ function loadConfig(options = {}) {
104
+ const env = options.env ?? process.env;
105
+ const path = options.path ?? (options.directory ? findConfigFile(options.directory) : findConfigFile());
106
+ if (!path) {
107
+ throw new ConfigError(
108
+ "CONFIG_NOT_FOUND",
109
+ "No omninode.yaml found. Run `omninode init` to create one, or pass an explicit path."
110
+ );
111
+ }
112
+ const raw = readFileSync(path, "utf8");
113
+ const expanded = expandEnvRefs(raw, env, path);
114
+ let data;
115
+ try {
116
+ data = parseYaml(expanded);
117
+ } catch (error) {
118
+ throw new ConfigError("CONFIG_INVALID", `Failed to parse ${path}.`, { cause: error });
119
+ }
120
+ const parsed = appConfigSchema.safeParse(data);
121
+ if (!parsed.success) {
122
+ const issues = parsed.error.issues.map((issue) => {
123
+ const location = issue.path.length > 0 ? issue.path.join(".") : "(root)";
124
+ return `${location}: ${issue.message}`;
125
+ });
126
+ throw new ConfigError("CONFIG_INVALID", `Invalid configuration in ${path}.`, {
127
+ details: { issues }
128
+ });
129
+ }
130
+ return toAppConfig(parsed.data);
131
+ }
132
+ function toAppConfig(yaml) {
133
+ return {
134
+ project: {
135
+ name: yaml.project.name,
136
+ providers: yaml.project.providers.map(toProviderConfig),
137
+ agents: yaml.project.agents.map(toAgentConfig),
138
+ roles: yaml.project.roles.map(toRoleDefinition),
139
+ ...yaml.project.memory !== void 0 ? { memory: yaml.project.memory } : {}
140
+ },
141
+ ...yaml.logging !== void 0 ? { logging: yaml.logging } : {}
142
+ };
143
+ }
144
+ function toProviderConfig(raw) {
145
+ return {
146
+ name: raw.name,
147
+ type: raw.type,
148
+ baseUrl: raw.base_url,
149
+ apiKeyEnvVar: raw.api_key_env_var,
150
+ headers: raw.headers,
151
+ enabled: raw.enabled,
152
+ metadata: raw.metadata
153
+ };
154
+ }
155
+ function toAgentConfig(raw) {
156
+ const integration = raw.type === "native" ? "native" : "process";
157
+ return {
158
+ name: raw.name,
159
+ integration,
160
+ command: raw.command,
161
+ args: raw.args,
162
+ cwd: raw.cwd,
163
+ env: raw.env,
164
+ metadata: raw.metadata
165
+ };
166
+ }
167
+ function toRoleDefinition(raw) {
168
+ return {
169
+ id: raw.id,
170
+ name: raw.name,
171
+ description: raw.description,
172
+ responsibilities: raw.responsibilities,
173
+ expectedOutputs: raw.expected_outputs,
174
+ preferredAgents: raw.preferred_agents,
175
+ systemPrompt: raw.system_prompt,
176
+ metadata: raw.metadata
177
+ };
178
+ }
179
+
180
+ // src/config/default.ts
181
+ function defaultProjectConfigYaml(projectName = "My Project") {
182
+ return `project:
183
+ name: ${projectName}
184
+
185
+ # Providers connect OmniNode to AI model gateways (Phase 1+).
186
+ # Credentials are referenced by environment variable, never stored in this file.
187
+ providers: []
188
+ # - name: my-gateway
189
+ # type: openai-compatible
190
+ # base_url: https://example.com/v1
191
+ # api_key_env_var: MY_API_KEY
192
+
193
+ # CLI agents registered with OmniNode (Phase 3 wires them up).
194
+ agents: []
195
+ # - name: opencode
196
+ # type: cli
197
+ # command: opencode
198
+
199
+ # Roles describe what an AI is supposed to do (Phase 4).
200
+ roles: []
201
+ # - id: architecture-reviewer
202
+ # name: Architecture Reviewer
203
+ # responsibilities:
204
+ # - architecture analysis
205
+ # expected_outputs:
206
+ # - findings
207
+ # - recommendations
208
+
209
+ # Memory is optional; Remembera is the preferred integration (Phase 7).
210
+ # memory:
211
+ # provider: remembera
212
+ `;
213
+ }
214
+
215
+ // src/cli/commands/init.ts
216
+ async function runInit(options) {
217
+ const target = `${process.cwd()}/omninode.yaml`;
218
+ if (!options.force && existsSync2(target)) {
219
+ throw new OmniNodeError(
220
+ "CLI_USAGE",
221
+ `${target} already exists. Use --force to overwrite it.`
222
+ );
223
+ }
224
+ writeFileSync(target, defaultProjectConfigYaml(options.name), "utf8");
225
+ console.log(`Created ${target}`);
226
+ console.log("\nNext steps:");
227
+ console.log(" 1. Add a provider under `project.providers` (see omninode.yaml.example).");
228
+ console.log(" 2. Register CLI agents under `project.agents`.");
229
+ console.log(" 3. Run `omninode provider list` to validate the configuration.");
230
+ }
231
+ function registerInitCommand(program) {
232
+ program.command("init").description("Create an omninode.yaml project configuration in the current directory.").option("-f, --force", "Overwrite an existing omninode.yaml.").option("-n, --name <name>", "Project name to write into the configuration.", "My Project").action(async (options) => runInit(options));
233
+ }
234
+
235
+ // src/cli/commands/project.ts
236
+ function registerProjectCommands(program) {
237
+ const project = program.command("project").description("Project-level operations.");
238
+ project.command("init").description("Alias of `omninode init`.").option("-f, --force", "Overwrite an existing omninode.yaml.").option("-n, --name <name>", "Project name to write into the configuration.", "My Project").action(async (options) => runInit(options));
239
+ }
240
+
241
+ // src/cli/commands/providers.ts
242
+ function registerProviderCommands(program) {
243
+ const provider = program.command("provider").description("Manage AI providers configured in omninode.yaml.");
244
+ provider.command("list").description("List configured providers.").action(async () => {
245
+ const config = loadConfig();
246
+ const providers = config.project.providers;
247
+ if (providers.length === 0) {
248
+ console.log(
249
+ "No providers configured. Add one under `project.providers` in omninode.yaml."
250
+ );
251
+ return;
252
+ }
253
+ for (const provider2 of providers) {
254
+ const key = provider2.apiKeyEnvVar ? `$${provider2.apiKeyEnvVar}` : "none";
255
+ const enabled = provider2.enabled === false ? " (disabled)" : "";
256
+ console.log(
257
+ `${provider2.name} type=${provider2.type} base_url=${provider2.baseUrl} key=${key}${enabled}`
258
+ );
259
+ }
260
+ });
261
+ provider.command("add").description("Add a provider (planned for Phase 1 \u2014 Provider Infrastructure).").action(() => {
262
+ throw notImplemented("omninode provider add", "Phase 1 (Provider Infrastructure)");
263
+ });
264
+ }
265
+ function notImplemented(command, phase) {
266
+ return new OmniNodeError(
267
+ "NOT_IMPLEMENTED",
268
+ `${command} is planned for ${phase}. Edit omninode.yaml directly for now.`
269
+ );
270
+ }
271
+
272
+ // src/cli/commands/agents.ts
273
+ function registerAgentCommands(program) {
274
+ const agent = program.command("agent").description("Manage CLI agents registered with OmniNode.");
275
+ agent.command("list").description("List configured agents.").action(async () => {
276
+ const config = loadConfig();
277
+ const agents = config.project.agents;
278
+ if (agents.length === 0) {
279
+ console.log("No agents configured. Add one under `project.agents` in omninode.yaml.");
280
+ return;
281
+ }
282
+ for (const agent2 of agents) {
283
+ const command = agent2.command ?? "(no command)";
284
+ console.log(
285
+ `${agent2.name} integration=${agent2.integration} command=${command}`
286
+ );
287
+ }
288
+ });
289
+ agent.command("add").description("Register an agent (planned for Phase 3 \u2014 CLI Agent System).").action(() => {
290
+ throw notImplemented("omninode agent add", "Phase 3 (CLI Agent System)");
291
+ });
292
+ }
293
+
294
+ // src/cli/commands/roles.ts
295
+ function registerRoleCommands(program) {
296
+ const role = program.command("role").description("Inspect roles defined in omninode.yaml.");
297
+ role.command("list").description("List configured roles.").action(async () => {
298
+ const config = loadConfig();
299
+ const roles = config.project.roles;
300
+ if (roles.length === 0) {
301
+ console.log("No roles configured. Add one under `project.roles` in omninode.yaml.");
302
+ return;
303
+ }
304
+ for (const role2 of roles) {
305
+ console.log(`${role2.id} ${role2.name}`);
306
+ for (const responsibility of role2.responsibilities) {
307
+ console.log(` - ${responsibility}`);
308
+ }
309
+ }
310
+ });
311
+ }
312
+
313
+ // src/cli/commands/tasks.ts
314
+ function registerTaskCommands(program) {
315
+ const task = program.command("task").description("Create, run and inspect tasks (Phase 4+).");
316
+ task.command("create").description("Create a task (planned for Phase 4 \u2014 Roles & Tasks).").action(() => {
317
+ throw notImplemented("omninode task create", "Phase 4 (Roles & Tasks)");
318
+ });
319
+ task.command("run <objective>").description("Run a task or pipeline (planned for Phase 5 \u2014 Pipeline Engine).").action(() => {
320
+ throw notImplemented("omninode task run", "Phase 5 (Pipeline Engine)");
321
+ });
322
+ task.command("status <task-id>").description("Show task status (planned for Phase 4 \u2014 Roles & Tasks).").action(() => {
323
+ throw notImplemented("omninode task status", "Phase 4 (Roles & Tasks)");
324
+ });
325
+ }
326
+
327
+ // src/cli/commands/reports.ts
328
+ function registerReportCommands(program) {
329
+ const report = program.command("report").description("Inspect AI reports (Phase 6+).");
330
+ report.command("list").description("List collected reports (planned for Phase 6 \u2014 Multi-AI Report System).").action(() => {
331
+ throw notImplemented("omninode report list", "Phase 6 (Multi-AI Report System)");
332
+ });
333
+ }
334
+
335
+ // src/cli/index.ts
336
+ function createProgram() {
337
+ const program = new Command();
338
+ program.name("omninode").description(
339
+ "Provider-agnostic multi-AI orchestration platform: coordinate CLI agents, AI providers, memory, roles, reports and planning in one execution system."
340
+ ).version(OMNINODE_VERSION, "-v, --version", "Print the OmniNode version.");
341
+ registerInitCommand(program);
342
+ registerProjectCommands(program);
343
+ registerProviderCommands(program);
344
+ registerAgentCommands(program);
345
+ registerRoleCommands(program);
346
+ registerTaskCommands(program);
347
+ registerReportCommands(program);
348
+ return program;
349
+ }
350
+ async function run(argv) {
351
+ const program = createProgram();
352
+ try {
353
+ await program.parseAsync(argv);
354
+ } catch (error) {
355
+ handleError(error);
356
+ }
357
+ }
358
+ function handleError(error) {
359
+ if (isOmniNodeError(error)) {
360
+ console.error(`error: [${error.code}] ${error.message}`);
361
+ if (error.details !== void 0) {
362
+ console.error(JSON.stringify(error.details, null, 2));
363
+ }
364
+ process.exit(1);
365
+ }
366
+ console.error(error instanceof Error ? error.message : String(error));
367
+ process.exit(1);
368
+ }
369
+ var entry = process.argv[1] ? pathToFileURL(realpathSync(process.argv[1])).href : "";
370
+ if (import.meta.url === entry) {
371
+ run(process.argv).catch((error) => handleError(error));
372
+ }
373
+ export {
374
+ createProgram,
375
+ handleError,
376
+ run
377
+ };
378
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/cli/index.ts","../../src/version.ts","../../src/errors/index.ts","../../src/cli/commands/init.ts","../../src/config/schema.ts","../../src/config/loader.ts","../../src/config/default.ts","../../src/cli/commands/project.ts","../../src/cli/commands/providers.ts","../../src/cli/commands/agents.ts","../../src/cli/commands/roles.ts","../../src/cli/commands/tasks.ts","../../src/cli/commands/reports.ts"],"sourcesContent":["import { pathToFileURL } from \"node:url\";\nimport { realpathSync } from \"node:fs\";\nimport { Command } from \"commander\";\nimport { OMNINODE_VERSION } from \"../version.js\";\nimport { isOmniNodeError } from \"../errors/index.js\";\nimport { registerInitCommand } from \"./commands/init.js\";\nimport { registerProjectCommands } from \"./commands/project.js\";\nimport { registerProviderCommands } from \"./commands/providers.js\";\nimport { registerAgentCommands } from \"./commands/agents.js\";\nimport { registerRoleCommands } from \"./commands/roles.js\";\nimport { registerTaskCommands } from \"./commands/tasks.js\";\nimport { registerReportCommands } from \"./commands/reports.js\";\n\nexport function createProgram(): Command {\n const program = new Command();\n\n program\n .name(\"omninode\")\n .description(\n \"Provider-agnostic multi-AI orchestration platform: coordinate CLI agents, \" +\n \"AI providers, memory, roles, reports and planning in one execution system.\",\n )\n .version(OMNINODE_VERSION, \"-v, --version\", \"Print the OmniNode version.\");\n\n registerInitCommand(program);\n registerProjectCommands(program);\n registerProviderCommands(program);\n registerAgentCommands(program);\n registerRoleCommands(program);\n registerTaskCommands(program);\n registerReportCommands(program);\n\n return program;\n}\n\nexport async function run(argv: string[]): Promise<void> {\n const program = createProgram();\n try {\n await program.parseAsync(argv);\n } catch (error) {\n handleError(error);\n }\n}\n\nexport function handleError(error: unknown): never {\n if (isOmniNodeError(error)) {\n console.error(`error: [${error.code}] ${error.message}`);\n if (error.details !== undefined) {\n console.error(JSON.stringify(error.details, null, 2));\n }\n process.exit(1);\n }\n console.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n}\n\nconst entry = process.argv[1]\n ? pathToFileURL(realpathSync(process.argv[1])).href\n : \"\";\nif (import.meta.url === entry) {\n run(process.argv).catch((error) => handleError(error));\n}\n","export const OMNINODE_VERSION = \"0.1.0\";\n","/** Typed error hierarchy shared across the whole codebase (§4.1 — error model). */\n\nexport type OmniNodeErrorCode =\n | \"CONFIG_NOT_FOUND\"\n | \"CONFIG_INVALID\"\n | \"PROVIDER_UNAVAILABLE\"\n | \"PROVIDER_AUTH_FAILED\"\n | \"MODEL_NOT_FOUND\"\n | \"AGENT_NOT_FOUND\"\n | \"AGENT_FAILED\"\n | \"AGENT_TIMEOUT\"\n | \"TASK_INVALID\"\n | \"TASK_FAILED\"\n | \"PIPELINE_INVALID\"\n | \"PIPELINE_FAILED\"\n | \"PROTOCOL_VIOLATION\"\n | \"MEMORY_UNAVAILABLE\"\n | \"NOT_IMPLEMENTED\"\n | \"CLI_USAGE\"\n | \"INTERNAL\";\n\nexport interface OmniNodeErrorOptions {\n cause?: unknown;\n details?: Record<string, unknown>;\n}\n\nexport class OmniNodeError extends Error {\n readonly code: OmniNodeErrorCode;\n readonly details?: Record<string, unknown>;\n\n constructor(code: OmniNodeErrorCode, message: string, options: OmniNodeErrorOptions = {}) {\n super(message, { cause: options.cause });\n this.name = new.target.name;\n this.code = code;\n this.details = options.details;\n }\n}\n\nexport class ConfigError extends OmniNodeError {\n constructor(\n code: \"CONFIG_NOT_FOUND\" | \"CONFIG_INVALID\",\n message: string,\n options: OmniNodeErrorOptions = {},\n ) {\n super(code, message, options);\n }\n}\n\nexport class ProviderError extends OmniNodeError {\n constructor(\n code: \"PROVIDER_UNAVAILABLE\" | \"PROVIDER_AUTH_FAILED\" | \"MODEL_NOT_FOUND\",\n message: string,\n options: OmniNodeErrorOptions = {},\n ) {\n super(code, message, options);\n }\n}\n\nexport class AgentError extends OmniNodeError {\n constructor(\n code: \"AGENT_NOT_FOUND\" | \"AGENT_FAILED\" | \"AGENT_TIMEOUT\",\n message: string,\n options: OmniNodeErrorOptions = {},\n ) {\n super(code, message, options);\n }\n}\n\nexport class TaskError extends OmniNodeError {\n constructor(\n code: \"TASK_INVALID\" | \"TASK_FAILED\",\n message: string,\n options: OmniNodeErrorOptions = {},\n ) {\n super(code, message, options);\n }\n}\n\nexport class PipelineError extends OmniNodeError {\n constructor(\n code: \"PIPELINE_INVALID\" | \"PIPELINE_FAILED\",\n message: string,\n options: OmniNodeErrorOptions = {},\n ) {\n super(code, message, options);\n }\n}\n\nexport class ProtocolError extends OmniNodeError {\n constructor(message: string, options: OmniNodeErrorOptions = {}) {\n super(\"PROTOCOL_VIOLATION\", message, options);\n }\n}\n\nexport class MemoryError extends OmniNodeError {\n constructor(message: string, options: OmniNodeErrorOptions = {}) {\n super(\"MEMORY_UNAVAILABLE\", message, options);\n }\n}\n\nexport function isOmniNodeError(value: unknown): value is OmniNodeError {\n return value instanceof OmniNodeError;\n}\n","import { existsSync, writeFileSync } from \"node:fs\";\nimport type { Command } from \"commander\";\nimport { OmniNodeError } from \"../../errors/index.js\";\nimport { defaultProjectConfigYaml } from \"../../config/index.js\";\n\nexport async function runInit(options: { force?: boolean; name?: string }): Promise<void> {\n const target = `${process.cwd()}/omninode.yaml`;\n if (!options.force && existsSync(target)) {\n throw new OmniNodeError(\n \"CLI_USAGE\",\n `${target} already exists. Use --force to overwrite it.`,\n );\n }\n writeFileSync(target, defaultProjectConfigYaml(options.name), \"utf8\");\n console.log(`Created ${target}`);\n console.log(\"\\nNext steps:\");\n console.log(\" 1. Add a provider under `project.providers` (see omninode.yaml.example).\");\n console.log(\" 2. Register CLI agents under `project.agents`.\");\n console.log(\" 3. Run `omninode provider list` to validate the configuration.\");\n}\n\nexport function registerInitCommand(program: Command): void {\n program\n .command(\"init\")\n .description(\"Create an omninode.yaml project configuration in the current directory.\")\n .option(\"-f, --force\", \"Overwrite an existing omninode.yaml.\")\n .option(\"-n, --name <name>\", \"Project name to write into the configuration.\", \"My Project\")\n .action(async (options: { force?: boolean; name: string }) => runInit(options));\n}\n","/**\n * Configuration schema. The project file (omninode.yaml) uses snake_case keys\n * as shown in DEVELOPMENT_PLAN.md §7 and §23; the loader maps them onto the\n * camelCase TypeScript contracts in src/types.\n */\nimport { z } from \"zod\";\n\nexport const providerConfigSchema = z\n .object({\n name: z.string().min(1),\n type: z.enum([\"openai-compatible\", \"omnihilbras\", \"openrouter\", \"local\", \"custom\"]),\n base_url: z.string().url(),\n api_key_env_var: z.string().min(1).optional(),\n headers: z.record(z.string()).optional(),\n enabled: z.boolean().optional(),\n metadata: z.record(z.unknown()).optional(),\n })\n .strict();\n\nexport const agentConfigSchema = z\n .object({\n name: z.string().min(1),\n /** \"cli\" agents communicate over stdin/stdout (process adapter). */\n type: z.enum([\"cli\", \"native\", \"process\"]).default(\"cli\"),\n command: z.string().min(1).optional(),\n args: z.array(z.string()).optional(),\n cwd: z.string().optional(),\n env: z.record(z.string()).optional(),\n metadata: z.record(z.unknown()).optional(),\n })\n .strict();\n\nexport const roleConfigSchema = z\n .object({\n id: z\n .string()\n .min(1)\n .regex(/^[a-z0-9][a-z0-9-]*$/, \"role id must be kebab-case\"),\n name: z.string().min(1),\n description: z.string().optional(),\n responsibilities: z.array(z.string()).default([]),\n expected_outputs: z.array(z.string()).default([]),\n preferred_agents: z.array(z.string()).optional(),\n system_prompt: z.string().optional(),\n metadata: z.record(z.unknown()).optional(),\n })\n .strict();\n\nexport const projectConfigSchema = z\n .object({\n name: z.string().min(1),\n providers: z.array(providerConfigSchema).default([]),\n agents: z.array(agentConfigSchema).default([]),\n roles: z.array(roleConfigSchema).default([]),\n memory: z\n .object({ provider: z.string().min(1) })\n .strict()\n .optional(),\n })\n .strict();\n\nexport const appConfigSchema = z\n .object({\n project: projectConfigSchema,\n logging: z\n .object({ level: z.enum([\"debug\", \"info\", \"warn\", \"error\"]) })\n .strict()\n .optional(),\n })\n .strict();\n\nexport type ProviderConfigYaml = z.infer<typeof providerConfigSchema>;\nexport type AgentConfigYaml = z.infer<typeof agentConfigSchema>;\nexport type RoleConfigYaml = z.infer<typeof roleConfigSchema>;\nexport type ProjectConfigYaml = z.infer<typeof projectConfigSchema>;\nexport type AppConfigYaml = z.infer<typeof appConfigSchema>;\n","/**\n * Configuration loader: discovers omninode.yaml, expands ${ENV_VAR}\n * references (so credentials never live in project files, §24), validates it\n * and maps it onto the core TypeScript contracts.\n */\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { parse as parseYaml } from \"yaml\";\nimport { ConfigError } from \"../errors/index.js\";\nimport type { AgentConfig, AgentIntegrationType } from \"../types/agent.js\";\nimport type { ProviderConfig } from \"../types/provider.js\";\nimport type { RoleDefinition } from \"../types/role.js\";\nimport type { LogLevel } from \"../logger/index.js\";\nimport { appConfigSchema } from \"./schema.js\";\nimport type { AgentConfigYaml, ProviderConfigYaml, RoleConfigYaml } from \"./schema.js\";\n\nconst CONFIG_FILENAMES = [\"omninode.yaml\", \"omninode.yml\", \"omninode.json\"];\n\nexport interface AppConfig {\n project: {\n name: string;\n providers: ProviderConfig[];\n agents: AgentConfig[];\n roles: RoleDefinition[];\n memory?: {\n provider: string;\n };\n };\n logging?: {\n level: LogLevel;\n };\n}\n\nexport interface LoadConfigOptions {\n /** Explicit path; otherwise omninode.yaml/yml/json is looked up in the given directory. */\n path?: string;\n directory?: string;\n /** Environment used for ${VAR} expansion; defaults to process.env. */\n env?: Record<string, string | undefined>;\n}\n\nexport function findConfigFile(directory = process.cwd()): string | undefined {\n for (const filename of CONFIG_FILENAMES) {\n const candidate = `${directory}/${filename}`;\n if (existsSync(candidate)) return candidate;\n }\n return undefined;\n}\n\n/**\n * Replaces ${VAR} and ${VAR:-fallback} references. Unset variables without a\n * fallback abort loading: a half-resolved config could silently misroute\n * authentication.\n */\nexport function expandEnvRefs(\n text: string,\n env: Record<string, string | undefined>,\n source = \"config\",\n): string {\n return text.replace(\n /\\$\\{([A-Za-z_][A-Za-z0-9_]*)(?::-([^}]*))?\\}/g,\n (_match, name: string, fallback?: string) => {\n const value = env[name] ?? fallback;\n if (value === undefined) {\n throw new ConfigError(\n \"CONFIG_INVALID\",\n `Environment variable \"${name}\" is referenced in ${source} but is not set and has no default.`,\n );\n }\n return value;\n },\n );\n}\n\nexport function loadConfig(options: LoadConfigOptions = {}): AppConfig {\n const env = options.env ?? process.env;\n const path = options.path ?? (options.directory ? findConfigFile(options.directory) : findConfigFile());\n if (!path) {\n throw new ConfigError(\n \"CONFIG_NOT_FOUND\",\n \"No omninode.yaml found. Run `omninode init` to create one, or pass an explicit path.\",\n );\n }\n\n const raw = readFileSync(path, \"utf8\");\n const expanded = expandEnvRefs(raw, env, path);\n\n let data: unknown;\n try {\n data = parseYaml(expanded);\n } catch (error) {\n throw new ConfigError(\"CONFIG_INVALID\", `Failed to parse ${path}.`, { cause: error });\n }\n\n const parsed = appConfigSchema.safeParse(data);\n if (!parsed.success) {\n const issues = parsed.error.issues.map((issue) => {\n const location = issue.path.length > 0 ? issue.path.join(\".\") : \"(root)\";\n return `${location}: ${issue.message}`;\n });\n throw new ConfigError(\"CONFIG_INVALID\", `Invalid configuration in ${path}.`, {\n details: { issues },\n });\n }\n\n return toAppConfig(parsed.data);\n}\n\nfunction toAppConfig(yaml: ReturnType<typeof appConfigSchema.parse>): AppConfig {\n return {\n project: {\n name: yaml.project.name,\n providers: yaml.project.providers.map(toProviderConfig),\n agents: yaml.project.agents.map(toAgentConfig),\n roles: yaml.project.roles.map(toRoleDefinition),\n ...(yaml.project.memory !== undefined ? { memory: yaml.project.memory } : {}),\n },\n ...(yaml.logging !== undefined ? { logging: yaml.logging } : {}),\n };\n}\n\nfunction toProviderConfig(raw: ProviderConfigYaml): ProviderConfig {\n return {\n name: raw.name,\n type: raw.type,\n baseUrl: raw.base_url,\n apiKeyEnvVar: raw.api_key_env_var,\n headers: raw.headers,\n enabled: raw.enabled,\n metadata: raw.metadata,\n };\n}\n\nfunction toAgentConfig(raw: AgentConfigYaml): AgentConfig {\n const integration: AgentIntegrationType =\n raw.type === \"native\" ? \"native\" : \"process\";\n return {\n name: raw.name,\n integration,\n command: raw.command,\n args: raw.args,\n cwd: raw.cwd,\n env: raw.env,\n metadata: raw.metadata,\n };\n}\n\nfunction toRoleDefinition(raw: RoleConfigYaml): RoleDefinition {\n return {\n id: raw.id,\n name: raw.name,\n description: raw.description,\n responsibilities: raw.responsibilities,\n expectedOutputs: raw.expected_outputs,\n preferredAgents: raw.preferred_agents,\n systemPrompt: raw.system_prompt,\n metadata: raw.metadata,\n };\n}\n\n","/** Template written by `omninode init` (§22, §23). */\n\nexport function defaultProjectConfigYaml(projectName = \"My Project\"): string {\n return `project:\n name: ${projectName}\n\n # Providers connect OmniNode to AI model gateways (Phase 1+).\n # Credentials are referenced by environment variable, never stored in this file.\n providers: []\n # - name: my-gateway\n # type: openai-compatible\n # base_url: https://example.com/v1\n # api_key_env_var: MY_API_KEY\n\n # CLI agents registered with OmniNode (Phase 3 wires them up).\n agents: []\n # - name: opencode\n # type: cli\n # command: opencode\n\n # Roles describe what an AI is supposed to do (Phase 4).\n roles: []\n # - id: architecture-reviewer\n # name: Architecture Reviewer\n # responsibilities:\n # - architecture analysis\n # expected_outputs:\n # - findings\n # - recommendations\n\n # Memory is optional; Remembera is the preferred integration (Phase 7).\n # memory:\n # provider: remembera\n`;\n}\n","import type { Command } from \"commander\";\nimport { runInit } from \"./init.js\";\n\nexport function registerProjectCommands(program: Command): void {\n const project = program\n .command(\"project\")\n .description(\"Project-level operations.\");\n\n project\n .command(\"init\")\n .description(\"Alias of `omninode init`.\")\n .option(\"-f, --force\", \"Overwrite an existing omninode.yaml.\")\n .option(\"-n, --name <name>\", \"Project name to write into the configuration.\", \"My Project\")\n .action(async (options: { force?: boolean; name: string }) => runInit(options));\n}\n","import type { Command } from \"commander\";\nimport { loadConfig } from \"../../config/index.js\";\nimport { OmniNodeError } from \"../../errors/index.js\";\n\nexport function registerProviderCommands(program: Command): void {\n const provider = program\n .command(\"provider\")\n .description(\"Manage AI providers configured in omninode.yaml.\");\n\n provider\n .command(\"list\")\n .description(\"List configured providers.\")\n .action(async () => {\n const config = loadConfig();\n const providers = config.project.providers;\n if (providers.length === 0) {\n console.log(\n \"No providers configured. Add one under `project.providers` in omninode.yaml.\",\n );\n return;\n }\n for (const provider of providers) {\n const key = provider.apiKeyEnvVar ? `$${provider.apiKeyEnvVar}` : \"none\";\n const enabled = provider.enabled === false ? \" (disabled)\" : \"\";\n console.log(\n `${provider.name} type=${provider.type} base_url=${provider.baseUrl} key=${key}${enabled}`,\n );\n }\n });\n\n provider\n .command(\"add\")\n .description(\"Add a provider (planned for Phase 1 — Provider Infrastructure).\")\n .action(() => {\n throw notImplemented(\"omninode provider add\", \"Phase 1 (Provider Infrastructure)\");\n });\n}\n\nexport function notImplemented(command: string, phase: string): OmniNodeError {\n return new OmniNodeError(\n \"NOT_IMPLEMENTED\",\n `${command} is planned for ${phase}. Edit omninode.yaml directly for now.`,\n );\n}\n","import type { Command } from \"commander\";\nimport { loadConfig } from \"../../config/index.js\";\nimport { notImplemented } from \"./providers.js\";\n\nexport function registerAgentCommands(program: Command): void {\n const agent = program\n .command(\"agent\")\n .description(\"Manage CLI agents registered with OmniNode.\");\n\n agent\n .command(\"list\")\n .description(\"List configured agents.\")\n .action(async () => {\n const config = loadConfig();\n const agents = config.project.agents;\n if (agents.length === 0) {\n console.log(\"No agents configured. Add one under `project.agents` in omninode.yaml.\");\n return;\n }\n for (const agent of agents) {\n const command = agent.command ?? \"(no command)\";\n console.log(\n `${agent.name} integration=${agent.integration} command=${command}`,\n );\n }\n });\n\n agent\n .command(\"add\")\n .description(\"Register an agent (planned for Phase 3 — CLI Agent System).\")\n .action(() => {\n throw notImplemented(\"omninode agent add\", \"Phase 3 (CLI Agent System)\");\n });\n}\n","import type { Command } from \"commander\";\nimport { loadConfig } from \"../../config/index.js\";\n\nexport function registerRoleCommands(program: Command): void {\n const role = program\n .command(\"role\")\n .description(\"Inspect roles defined in omninode.yaml.\");\n\n role\n .command(\"list\")\n .description(\"List configured roles.\")\n .action(async () => {\n const config = loadConfig();\n const roles = config.project.roles;\n if (roles.length === 0) {\n console.log(\"No roles configured. Add one under `project.roles` in omninode.yaml.\");\n return;\n }\n for (const role of roles) {\n console.log(`${role.id} ${role.name}`);\n for (const responsibility of role.responsibilities) {\n console.log(` - ${responsibility}`);\n }\n }\n });\n}\n","import type { Command } from \"commander\";\nimport { notImplemented } from \"./providers.js\";\n\nexport function registerTaskCommands(program: Command): void {\n const task = program\n .command(\"task\")\n .description(\"Create, run and inspect tasks (Phase 4+).\");\n\n task\n .command(\"create\")\n .description(\"Create a task (planned for Phase 4 — Roles & Tasks).\")\n .action(() => {\n throw notImplemented(\"omninode task create\", \"Phase 4 (Roles & Tasks)\");\n });\n\n task\n .command(\"run <objective>\")\n .description(\"Run a task or pipeline (planned for Phase 5 — Pipeline Engine).\")\n .action(() => {\n throw notImplemented(\"omninode task run\", \"Phase 5 (Pipeline Engine)\");\n });\n\n task\n .command(\"status <task-id>\")\n .description(\"Show task status (planned for Phase 4 — Roles & Tasks).\")\n .action(() => {\n throw notImplemented(\"omninode task status\", \"Phase 4 (Roles & Tasks)\");\n });\n}\n","import type { Command } from \"commander\";\nimport { notImplemented } from \"./providers.js\";\n\nexport function registerReportCommands(program: Command): void {\n const report = program\n .command(\"report\")\n .description(\"Inspect AI reports (Phase 6+).\");\n\n report\n .command(\"list\")\n .description(\"List collected reports (planned for Phase 6 — Multi-AI Report System).\")\n .action(() => {\n throw notImplemented(\"omninode report list\", \"Phase 6 (Multi-AI Report System)\");\n });\n}\n"],"mappings":"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","names":["existsSync","existsSync","provider","agent","role"]}