@gnsx/genesys.agent.cli 1.0.11 → 1.0.13
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/dist/bundle/launcher.js +230 -18
- package/dist/bundle/launcher.js.map +1 -1
- package/dist/src/cli.js +27 -13
- package/dist/src/cli.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +7 -6
package/dist/bundle/launcher.js
CHANGED
|
@@ -4,6 +4,161 @@ var __esm = (fn, res) => function __init() {
|
|
|
4
4
|
return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
|
|
5
5
|
};
|
|
6
6
|
|
|
7
|
+
// ../extensions/dist/internal/providers/dashscope.js
|
|
8
|
+
import { getModel } from "@mariozechner/pi-ai";
|
|
9
|
+
function createDashscopeExtension() {
|
|
10
|
+
return (pi) => {
|
|
11
|
+
const apiKey = process.env.DASHSCOPE_API_KEY;
|
|
12
|
+
if (!apiKey) {
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
const qwen35PlusModel = getModel("openrouter", "qwen/qwen3.5-plus-02-15");
|
|
16
|
+
const qwen3MaxModel = getModel("openrouter", "qwen/qwen3-max");
|
|
17
|
+
const qwen3CoderNextModel = getModel("openrouter", "qwen/qwen3-coder-next");
|
|
18
|
+
const qwen3CoderPlusModel = getModel("openrouter", "qwen/qwen3-coder-plus");
|
|
19
|
+
const glm5Model = getModel("openrouter", "z-ai/glm-5");
|
|
20
|
+
const glm47Model = getModel("openrouter", "z-ai/glm-4.7");
|
|
21
|
+
const kimiK25Model = getModel("openrouter", "moonshotai/kimi-k2.5");
|
|
22
|
+
const minimaxM25Model = getModel("openrouter", "minimax/minimax-m2.5");
|
|
23
|
+
pi.registerProvider("dashscope", {
|
|
24
|
+
baseUrl: DASHSCOPE_BASE_URL_ANTHROPIC,
|
|
25
|
+
apiKey,
|
|
26
|
+
api: "anthropic-messages",
|
|
27
|
+
models: [
|
|
28
|
+
// Qwen models (Alibaba Cloud)
|
|
29
|
+
{
|
|
30
|
+
id: "qwen3.5-plus",
|
|
31
|
+
name: "Qwen 3.5 Plus",
|
|
32
|
+
reasoning: qwen35PlusModel.reasoning,
|
|
33
|
+
input: qwen35PlusModel.input,
|
|
34
|
+
cost: qwen35PlusModel.cost,
|
|
35
|
+
contextWindow: qwen35PlusModel.contextWindow,
|
|
36
|
+
maxTokens: qwen35PlusModel.maxTokens
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
id: "qwen3-max-2026-01-23",
|
|
40
|
+
name: "Qwen 3 Max",
|
|
41
|
+
reasoning: qwen3MaxModel.reasoning,
|
|
42
|
+
input: qwen3MaxModel.input,
|
|
43
|
+
cost: qwen3MaxModel.cost,
|
|
44
|
+
contextWindow: qwen3MaxModel.contextWindow,
|
|
45
|
+
maxTokens: qwen3MaxModel.maxTokens
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
id: "qwen3-coder-next",
|
|
49
|
+
name: "Qwen 3 Coder Next",
|
|
50
|
+
reasoning: qwen3CoderNextModel.reasoning,
|
|
51
|
+
input: qwen3CoderNextModel.input,
|
|
52
|
+
cost: qwen3CoderNextModel.cost,
|
|
53
|
+
contextWindow: qwen3CoderNextModel.contextWindow,
|
|
54
|
+
maxTokens: qwen3CoderNextModel.maxTokens
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
id: "qwen3-coder-plus",
|
|
58
|
+
name: "Qwen 3 Coder Plus",
|
|
59
|
+
reasoning: qwen3CoderPlusModel.reasoning,
|
|
60
|
+
input: qwen3CoderPlusModel.input,
|
|
61
|
+
cost: qwen3CoderPlusModel.cost,
|
|
62
|
+
contextWindow: qwen3CoderPlusModel.contextWindow,
|
|
63
|
+
maxTokens: qwen3CoderPlusModel.maxTokens
|
|
64
|
+
},
|
|
65
|
+
// GLM models (Zhipu AI)
|
|
66
|
+
{
|
|
67
|
+
id: "glm-5",
|
|
68
|
+
name: "GLM 5",
|
|
69
|
+
reasoning: glm5Model.reasoning,
|
|
70
|
+
input: glm5Model.input,
|
|
71
|
+
cost: glm5Model.cost,
|
|
72
|
+
contextWindow: glm5Model.contextWindow,
|
|
73
|
+
maxTokens: glm5Model.maxTokens
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
id: "glm-4.7",
|
|
77
|
+
name: "GLM 4.7",
|
|
78
|
+
reasoning: glm47Model.reasoning,
|
|
79
|
+
input: glm47Model.input,
|
|
80
|
+
cost: glm47Model.cost,
|
|
81
|
+
contextWindow: glm47Model.contextWindow,
|
|
82
|
+
maxTokens: glm47Model.maxTokens
|
|
83
|
+
},
|
|
84
|
+
// Kimi models (Moonshot AI)
|
|
85
|
+
{
|
|
86
|
+
id: "kimi-k2.5",
|
|
87
|
+
name: "Kimi K2.5",
|
|
88
|
+
reasoning: kimiK25Model.reasoning,
|
|
89
|
+
input: kimiK25Model.input,
|
|
90
|
+
cost: kimiK25Model.cost,
|
|
91
|
+
contextWindow: kimiK25Model.contextWindow,
|
|
92
|
+
maxTokens: kimiK25Model.maxTokens
|
|
93
|
+
},
|
|
94
|
+
// MiniMax models
|
|
95
|
+
{
|
|
96
|
+
id: "MiniMax-M2.5",
|
|
97
|
+
name: "MiniMax M2.5",
|
|
98
|
+
reasoning: minimaxM25Model.reasoning,
|
|
99
|
+
input: minimaxM25Model.input,
|
|
100
|
+
cost: minimaxM25Model.cost,
|
|
101
|
+
contextWindow: minimaxM25Model.contextWindow,
|
|
102
|
+
maxTokens: 32768
|
|
103
|
+
}
|
|
104
|
+
]
|
|
105
|
+
});
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
var DASHSCOPE_BASE_URL_ANTHROPIC, dashscopeExtension;
|
|
109
|
+
var init_dashscope = __esm({
|
|
110
|
+
"../extensions/dist/internal/providers/dashscope.js"() {
|
|
111
|
+
"use strict";
|
|
112
|
+
DASHSCOPE_BASE_URL_ANTHROPIC = "https://coding.dashscope.aliyuncs.com/apps/anthropic";
|
|
113
|
+
dashscopeExtension = createDashscopeExtension();
|
|
114
|
+
}
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
// ../extensions/dist/internal/providers/index.js
|
|
118
|
+
var init_providers = __esm({
|
|
119
|
+
"../extensions/dist/internal/providers/index.js"() {
|
|
120
|
+
"use strict";
|
|
121
|
+
init_dashscope();
|
|
122
|
+
}
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
// ../extensions/dist/internal/context-resolver.js
|
|
126
|
+
function resolveExtensionSet(context) {
|
|
127
|
+
const extensions = [];
|
|
128
|
+
switch (context) {
|
|
129
|
+
case "cli": {
|
|
130
|
+
extensions.push(dashscopeExtension);
|
|
131
|
+
break;
|
|
132
|
+
}
|
|
133
|
+
case "embedded": {
|
|
134
|
+
extensions.push(dashscopeExtension);
|
|
135
|
+
break;
|
|
136
|
+
}
|
|
137
|
+
default: {
|
|
138
|
+
const _exhaustive = context;
|
|
139
|
+
throw new Error(`Unknown extension context: ${_exhaustive}`);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
return extensions;
|
|
143
|
+
}
|
|
144
|
+
var init_context_resolver = __esm({
|
|
145
|
+
"../extensions/dist/internal/context-resolver.js"() {
|
|
146
|
+
"use strict";
|
|
147
|
+
init_providers();
|
|
148
|
+
}
|
|
149
|
+
});
|
|
150
|
+
|
|
151
|
+
// ../extensions/dist/index.js
|
|
152
|
+
function getExtensions(context) {
|
|
153
|
+
return resolveExtensionSet(context);
|
|
154
|
+
}
|
|
155
|
+
var init_dist = __esm({
|
|
156
|
+
"../extensions/dist/index.js"() {
|
|
157
|
+
"use strict";
|
|
158
|
+
init_context_resolver();
|
|
159
|
+
}
|
|
160
|
+
});
|
|
161
|
+
|
|
7
162
|
// ../../../cli-utils/dist/self-update.js
|
|
8
163
|
import { execSync } from "child_process";
|
|
9
164
|
import { fileURLToPath } from "url";
|
|
@@ -120,7 +275,7 @@ var init_self_update = __esm({
|
|
|
120
275
|
});
|
|
121
276
|
|
|
122
277
|
// ../../../cli-utils/dist/index.js
|
|
123
|
-
var
|
|
278
|
+
var init_dist2 = __esm({
|
|
124
279
|
"../../../cli-utils/dist/index.js"() {
|
|
125
280
|
"use strict";
|
|
126
281
|
init_self_update();
|
|
@@ -189,7 +344,7 @@ var THINKING_LEVELS;
|
|
|
189
344
|
var init_args = __esm({
|
|
190
345
|
"src/args.ts"() {
|
|
191
346
|
"use strict";
|
|
192
|
-
|
|
347
|
+
init_dist2();
|
|
193
348
|
THINKING_LEVELS = ["off", "minimal", "low", "medium", "high", "xhigh"];
|
|
194
349
|
}
|
|
195
350
|
});
|
|
@@ -220,19 +375,66 @@ var init_package = __esm({
|
|
|
220
375
|
}
|
|
221
376
|
});
|
|
222
377
|
|
|
378
|
+
// src/extensions/version-check.ts
|
|
379
|
+
async function checkForNewVersion() {
|
|
380
|
+
if (process.env.PI_OFFLINE) {
|
|
381
|
+
return void 0;
|
|
382
|
+
}
|
|
383
|
+
try {
|
|
384
|
+
const encodedName = encodeURIComponent(PACKAGE_NAME);
|
|
385
|
+
const response = await fetch(`https://registry.npmjs.org/${encodedName}/latest`, {
|
|
386
|
+
signal: AbortSignal.timeout(1e4)
|
|
387
|
+
});
|
|
388
|
+
if (!response.ok) {
|
|
389
|
+
return void 0;
|
|
390
|
+
}
|
|
391
|
+
const data = await response.json();
|
|
392
|
+
const latestVersion = data.version;
|
|
393
|
+
if (latestVersion && latestVersion !== CURRENT_VERSION) {
|
|
394
|
+
return latestVersion;
|
|
395
|
+
}
|
|
396
|
+
return void 0;
|
|
397
|
+
} catch (err) {
|
|
398
|
+
return void 0;
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
var pkg, PACKAGE_NAME, CURRENT_VERSION, versionCheckExtension, version_check_default;
|
|
402
|
+
var init_version_check = __esm({
|
|
403
|
+
"src/extensions/version-check.ts"() {
|
|
404
|
+
"use strict";
|
|
405
|
+
init_package();
|
|
406
|
+
pkg = getPackageJson();
|
|
407
|
+
PACKAGE_NAME = pkg.name;
|
|
408
|
+
CURRENT_VERSION = pkg.version;
|
|
409
|
+
versionCheckExtension = (pi) => {
|
|
410
|
+
pi.on("session_start", async (_event, ctx) => {
|
|
411
|
+
checkForNewVersion().then((newVersion) => {
|
|
412
|
+
if (newVersion) {
|
|
413
|
+
ctx.ui.notify(
|
|
414
|
+
`Update available: v${newVersion} (current: v${CURRENT_VERSION}). Run: pnpm add -g ${PACKAGE_NAME}`,
|
|
415
|
+
"info"
|
|
416
|
+
);
|
|
417
|
+
}
|
|
418
|
+
});
|
|
419
|
+
});
|
|
420
|
+
};
|
|
421
|
+
version_check_default = versionCheckExtension;
|
|
422
|
+
}
|
|
423
|
+
});
|
|
424
|
+
|
|
223
425
|
// src/cli.ts
|
|
224
426
|
var cli_exports = {};
|
|
225
|
-
import { existsSync as existsSync2 } from "fs";
|
|
226
|
-
import { readdir } from "fs/promises";
|
|
227
427
|
import { dirname as dirname2, join as join2, resolve } from "path";
|
|
228
428
|
import { fileURLToPath as fileURLToPath3 } from "url";
|
|
229
|
-
import { getModel, setBedrockProviderModule } from "@mariozechner/pi-ai";
|
|
429
|
+
import { getModel as getModel2, setBedrockProviderModule } from "@mariozechner/pi-ai";
|
|
230
430
|
import { bedrockProviderModule } from "@mariozechner/pi-ai/bedrock-provider";
|
|
231
431
|
import {
|
|
432
|
+
AuthStorage,
|
|
232
433
|
createAgentSession,
|
|
233
434
|
DefaultResourceLoader,
|
|
234
435
|
getAgentDir,
|
|
235
436
|
InteractiveMode,
|
|
437
|
+
ModelRegistry,
|
|
236
438
|
runPrintMode,
|
|
237
439
|
SessionManager,
|
|
238
440
|
SettingsManager
|
|
@@ -257,8 +459,8 @@ async function readStdin() {
|
|
|
257
459
|
});
|
|
258
460
|
}
|
|
259
461
|
async function main(argv) {
|
|
260
|
-
const
|
|
261
|
-
const { args, commandHandled } = parseArgs(argv,
|
|
462
|
+
const pkg2 = getPackageJson();
|
|
463
|
+
const { args, commandHandled } = parseArgs(argv, pkg2.version, pkg2.name);
|
|
262
464
|
if (commandHandled) {
|
|
263
465
|
return;
|
|
264
466
|
}
|
|
@@ -273,29 +475,37 @@ async function main(argv) {
|
|
|
273
475
|
if (args.model) {
|
|
274
476
|
const provider = args.provider ?? "anthropic";
|
|
275
477
|
try {
|
|
276
|
-
model =
|
|
478
|
+
model = getModel2(provider, args.model);
|
|
277
479
|
} catch {
|
|
278
480
|
console.warn(`Warning: unknown model "${provider}/${args.model}", falling back to default.`);
|
|
279
481
|
}
|
|
280
482
|
}
|
|
281
483
|
const agentDir = getAgentDir();
|
|
282
484
|
const settingsManager = SettingsManager.create(cwd, agentDir);
|
|
283
|
-
|
|
284
|
-
const
|
|
285
|
-
if (existsSync2(extensionsDir)) {
|
|
286
|
-
extensionFiles = await readdir(extensionsDir).then(
|
|
287
|
-
(files) => files.filter((f) => (f.endsWith(".ts") || f.endsWith(".js")) && !f.endsWith(".d.ts")).map((f) => join2(extensionsDir, f))
|
|
288
|
-
);
|
|
289
|
-
}
|
|
485
|
+
const sharedExtensions = getExtensions("cli");
|
|
486
|
+
const extensionFactories = [...sharedExtensions, version_check_default];
|
|
290
487
|
const resourceLoader = new DefaultResourceLoader({
|
|
291
488
|
cwd,
|
|
292
489
|
agentDir,
|
|
293
490
|
settingsManager,
|
|
294
|
-
|
|
491
|
+
extensionFactories
|
|
295
492
|
});
|
|
296
493
|
await resourceLoader.reload();
|
|
494
|
+
const extensionsResult = resourceLoader.getExtensions();
|
|
495
|
+
const authStorage = AuthStorage.create(join2(agentDir, "auth.json"));
|
|
496
|
+
const modelRegistry = new ModelRegistry(authStorage, join2(agentDir, "models.json"));
|
|
497
|
+
for (const { name, config, extensionPath } of extensionsResult.runtime.pendingProviderRegistrations) {
|
|
498
|
+
try {
|
|
499
|
+
modelRegistry.registerProvider(name, config);
|
|
500
|
+
} catch (error) {
|
|
501
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
502
|
+
console.warn(`Warning: Extension "${extensionPath}" failed to register provider "${name}": ${message}`);
|
|
503
|
+
}
|
|
504
|
+
}
|
|
505
|
+
extensionsResult.runtime.pendingProviderRegistrations = [];
|
|
297
506
|
const { session, modelFallbackMessage } = await createAgentSession({
|
|
298
507
|
cwd,
|
|
508
|
+
modelRegistry,
|
|
299
509
|
...model ? { model } : {},
|
|
300
510
|
...args.thinking ? { thinkingLevel: args.thinking } : {},
|
|
301
511
|
...sessionManager ? { sessionManager } : {},
|
|
@@ -331,7 +541,9 @@ var __filename, __dirname;
|
|
|
331
541
|
var init_cli = __esm({
|
|
332
542
|
"src/cli.ts"() {
|
|
333
543
|
"use strict";
|
|
544
|
+
init_dist();
|
|
334
545
|
init_args();
|
|
546
|
+
init_version_check();
|
|
335
547
|
init_package();
|
|
336
548
|
setBedrockProviderModule(bedrockProviderModule);
|
|
337
549
|
__filename = fileURLToPath3(import.meta.url);
|
|
@@ -344,7 +556,7 @@ var init_cli = __esm({
|
|
|
344
556
|
});
|
|
345
557
|
|
|
346
558
|
// src/launcher.ts
|
|
347
|
-
import { existsSync as
|
|
559
|
+
import { existsSync as existsSync2 } from "fs";
|
|
348
560
|
import { dirname as dirname3, join as join3 } from "path";
|
|
349
561
|
import { fileURLToPath as fileURLToPath4 } from "url";
|
|
350
562
|
var __filename2 = fileURLToPath4(import.meta.url);
|
|
@@ -352,7 +564,7 @@ var __dirname2 = dirname3(__filename2);
|
|
|
352
564
|
function findPackageDir(startDir) {
|
|
353
565
|
let dir = startDir;
|
|
354
566
|
while (dir !== dirname3(dir)) {
|
|
355
|
-
if (
|
|
567
|
+
if (existsSync2(join3(dir, "package.json"))) {
|
|
356
568
|
return dir;
|
|
357
569
|
}
|
|
358
570
|
dir = dirname3(dir);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../cli-utils/src/self-update.ts","../../../../../cli-utils/src/index.ts","../../src/args.ts","../../src/utils/package.ts","../../src/cli.ts","../../src/launcher.ts"],"sourcesContent":["/**\n * Self-update functionality for Genesys CLI tools.\n *\n * Provides utilities for checking and performing CLI updates\n * via npm or pnpm package managers.\n */\n\nimport { execSync } from 'child_process';\nimport { fileURLToPath } from 'url';\nimport type { Command } from 'commander';\n\n/**\n * Check if running from an installed package (not local development).\n * Returns true if the current file is inside node_modules.\n */\nexport function isInstalledPackage(): boolean {\n try {\n const currentFile = fileURLToPath(import.meta.url);\n return currentFile.includes('node_modules');\n } catch {\n return false;\n }\n}\n\n/**\n * Detect which package manager was used to install the CLI.\n * Checks environment variables and execution path.\n *\n * @returns 'pnpm', 'npm', or 'unknown'\n */\nexport function detectPackageManager(): 'pnpm' | 'npm' | 'unknown' {\n // Check environment variables\n if (process.env.PNPM_PACKAGE_NAME) return 'pnpm';\n if (process.env.npm_execpath?.includes('pnpm')) return 'pnpm';\n\n // Check exec path\n const execPath = process.argv[1] || '';\n if (execPath.includes('pnpm')) return 'pnpm';\n if (execPath.includes('npm')) return 'npm';\n\n // Default to pnpm (monorepo preference)\n return 'pnpm';\n}\n\n/**\n * Compare semantic versions.\n * Returns true if latest is newer than current.\n */\nfunction isNewerVersion(latest: string, current: string): boolean {\n const latestParts = latest.split('.').map(Number);\n const currentParts = current.split('.').map(Number);\n\n for (let i = 0; i < 3; i++) {\n const latestPart = latestParts[i] || 0;\n const currentPart = currentParts[i] || 0;\n if (latestPart > currentPart) return true;\n if (latestPart < currentPart) return false;\n }\n\n return false;\n}\n\n/**\n * Check npm registry for the latest version of a package.\n *\n * @param packageName - The npm package name\n * @param currentVersion - The currently installed version\n * @returns Latest version string, or null if up-to-date or error\n */\nexport async function checkForUpdates(\n packageName: string,\n currentVersion: string\n): Promise<string | null> {\n try {\n if (!isInstalledPackage()) return null;\n\n const encodedName = encodeURIComponent(packageName);\n const response = await fetch(`https://registry.npmjs.org/${encodedName}/latest`, {\n signal: AbortSignal.timeout(10000),\n });\n\n if (!response.ok) return null;\n\n const data = (await response.json()) as { version?: string };\n const latestVersion = data.version;\n\n if (!latestVersion || latestVersion === currentVersion) return null;\n if (!isNewerVersion(latestVersion, currentVersion)) return null;\n\n return latestVersion;\n } catch {\n return null;\n }\n}\n\n/**\n * Perform the update using the detected package manager.\n *\n * @param packageName - The npm package name\n * @param packageManager - The package manager to use ('pnpm' or 'npm')\n * @param currentVersion - The current installed version\n * @param latestVersion - The latest available version\n * @returns true on success, false on failure\n */\nexport function performUpdate(\n packageName: string,\n packageManager: 'pnpm' | 'npm',\n currentVersion: string,\n latestVersion: string\n): boolean {\n console.log(`\\nUpdating ${packageName}...`);\n console.log(` Current: v${currentVersion}`);\n console.log(` Latest: v${latestVersion}\\n`);\n\n try {\n const updateCommand = packageManager === 'pnpm'\n ? `pnpm remove -g ${packageName} && pnpm add -g ${packageName}@latest`\n : `npm uninstall -g ${packageName} && npm install -g ${packageName}@latest`;\n\n // Run in shell for cross-platform compatibility (&& works on Unix, needs shell on Windows)\n execSync(updateCommand, { stdio: 'inherit' } as import('child_process').ExecSyncOptions);\n\n console.log(`\\n✅ Update complete! ${packageName} has been updated to v${latestVersion}.`);\n return true;\n } catch (error) {\n console.error(`\\n❌ Update failed. Please try running the commands manually:`);\n if (packageManager === 'pnpm') {\n console.error(` pnpm remove -g ${packageName}`);\n console.error(` pnpm add -g ${packageName}@latest`);\n } else {\n console.error(` npm uninstall -g ${packageName}`);\n console.error(` npm install -g ${packageName}@latest`);\n }\n return false;\n }\n}\n\n/**\n * Callback fired when the update command is invoked.\n */\nexport type UpdateCommandCallback = () => void;\n\n/**\n * Add 'update' subcommand to a Commander.js program.\n *\n * @param program - The Commander.js program\n * @param packageName - The npm package name\n * @param currentVersion - The current installed version\n * @param onUpdate - Optional callback fired when the update command is invoked\n */\nexport function addUpdateCommand(\n program: Command,\n packageName: string,\n currentVersion: string,\n onUpdate?: UpdateCommandCallback\n): void {\n program\n .command('update')\n .description('Check for updates and install the latest version')\n .action(async () => {\n // Notify caller that update command is being handled\n onUpdate?.();\n\n // Skip if running from local development\n if (!isInstalledPackage()) {\n console.log('Skipping update check - running from local development.');\n process.exit(0);\n }\n\n console.log('Checking for updates...');\n\n const latestVersion = await checkForUpdates(packageName, currentVersion);\n\n if (!latestVersion) {\n console.log(`You are already using the latest version (v${currentVersion}).`);\n process.exit(0);\n }\n\n console.log(`\\n📦 Update available: v${currentVersion} → v${latestVersion}`);\n\n const packageManager = detectPackageManager();\n\n if (packageManager === 'unknown') {\n console.error('\\n❌ Could not detect package manager. Please update manually:');\n console.error(` pnpm remove -g ${packageName} && pnpm add -g ${packageName}@latest`);\n console.error(` or`);\n console.error(` npm uninstall -g ${packageName} && npm install -g ${packageName}@latest`);\n process.exit(1);\n }\n\n const success = performUpdate(packageName, packageManager, currentVersion, latestVersion);\n process.exit(success ? 0 : 1);\n });\n}\n","export * from './self-update.js';\n","/**\n * CLI argument definitions for the Genesys Agent v2 CLI.\n *\n * Intentionally minimal — model selection, session management and tool\n * configuration are delegated to pi's own machinery via createAgentSession.\n */\n\nimport { addUpdateCommand } from '@gnsx/cli-utils';\nimport { Command } from 'commander';\n\nimport type { ThinkingLevel } from '@mariozechner/pi-agent-core';\n\nexport interface Args {\n /** Working directory (default: process.cwd()) */\n cwd?: string;\n\n /** Model identifier, e.g. \"anthropic/claude-opus-4-5\" or \"claude-opus-4-5\" */\n model?: string;\n\n /** LLM provider, e.g. \"anthropic\". Used together with --model. */\n provider?: string;\n\n /** Thinking/reasoning level */\n thinking?: ThinkingLevel;\n\n /**\n * Print mode: send a single prompt, output the response, exit.\n * When true, `messages[0]` is used as the prompt.\n */\n print: boolean;\n\n /**\n * Disable session persistence (in-memory only).\n */\n noSession: boolean;\n\n /**\n * Continue the most recent session for the current working directory.\n */\n continue: boolean;\n\n /** Positional arguments / prompt text (used in print mode) */\n messages: string[];\n}\n\nexport interface ParseArgsResult {\n args: Args;\n program: Command;\n /** True if a subcommand (e.g., update) was invoked and the caller should exit early */\n commandHandled: boolean;\n}\n\nconst THINKING_LEVELS: ThinkingLevel[] = ['off', 'minimal', 'low', 'medium', 'high', 'xhigh'];\n\nfunction isThinkingLevel(value: string): value is ThinkingLevel {\n return THINKING_LEVELS.includes(value as ThinkingLevel);\n}\n\nfunction parseModel(value: string): { provider?: string; model: string } {\n // Support \"provider/model\" shorthand\n if (value.includes('/')) {\n const slash = value.indexOf('/');\n return {\n provider: value.slice(0, slash),\n model: value.slice(slash + 1),\n };\n }\n return { model: value };\n}\n\nexport function parseArgs(argv: string[], version: string, packageName: string): ParseArgsResult {\n let commandHandled = false;\n\n const program = new Command();\n const args: Args = {\n print: false,\n noSession: false,\n continue: false,\n messages: [],\n };\n\n program\n .name('genesys')\n .description('Genesys Agent v2 CLI - AI-powered coding assistant')\n .version(version, '-v, --version')\n .usage('[options] [prompt]')\n .action(() => {\n // Default action: agent session will run (commandHandled remains false)\n });\n\n // Add update command - callback sets flag when invoked\n addUpdateCommand(program, packageName, version, () => {\n commandHandled = true;\n });\n\n program\n .option('-p, --print', 'print mode: send prompt, output response, exit', false)\n .option('-c, --continue', 'continue the most recent session', false)\n .option('--no-session', 'disable session persistence (in-memory only)', false)\n .option('-m, --model <model>', 'model to use, e.g. \"anthropic/claude-opus-4-5\"')\n .option('--provider <name>', 'provider name (used with --model)')\n .option('--thinking <level>', `thinking level: ${THINKING_LEVELS.join(', ')}`)\n .option('--cwd <dir>', 'working directory (default: current directory)')\n .argument('[prompt...]', 'initial prompt text')\n .parse(argv, { from: 'user' });\n\n const opts = program.opts();\n const cliArgs = program.processedArgs as string[][];\n\n // Handle model parsing with provider/model shorthand\n if (opts.model) {\n const parsed = parseModel(opts.model);\n args.model = parsed.model;\n if (parsed.provider) {\n args.provider = parsed.provider;\n }\n }\n // Provider can be overridden explicitly\n if (opts.provider) {\n args.provider = opts.provider;\n }\n\n // Validate thinking level\n if (opts.thinking) {\n if (!isThinkingLevel(opts.thinking)) {\n console.error(`--thinking must be one of: ${THINKING_LEVELS.join(', ')}`);\n process.exit(1);\n }\n args.thinking = opts.thinking;\n }\n\n args.print = opts.print ?? false;\n args.noSession = opts.noSession ?? false;\n args.continue = opts.continue ?? false;\n args.cwd = opts.cwd;\n\n // Collect positional arguments as messages\n if (cliArgs.length > 0 && cliArgs[0]) {\n args.messages = cliArgs[0];\n }\n\n return { args, program, commandHandled };\n}\n","/**\n * Returns the parsed package.json for the nearest package by traversing\n * up from the current module's directory.\n */\nimport { existsSync, readFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nexport function getPackageJson<T = { name: string; version: string }>(): T {\n const __dirname = dirname(fileURLToPath(import.meta.url));\n let currentDir = __dirname;\n\n while (true) {\n const pkgPath = join(currentDir, 'package.json');\n if (existsSync(pkgPath)) {\n const content = readFileSync(pkgPath, 'utf-8');\n return JSON.parse(content) as T;\n }\n\n const parentDir = dirname(currentDir);\n // Stop at filesystem root\n if (parentDir === currentDir) {\n throw new Error('Could not find package.json');\n }\n currentDir = parentDir;\n }\n}\n","#!/usr/bin/env node\n/**\n * Genesys Agent v2 CLI entry point.\n *\n * Thin wrapper around pi's createAgentSession + InteractiveMode / runPrintMode.\n * All session persistence, model selection, tool management and compaction are\n * handled by the pi framework.\n */\n\nimport { existsSync } from 'node:fs';\nimport { readdir } from 'node:fs/promises';\nimport { dirname, join, resolve } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\n\nimport { getModel, setBedrockProviderModule } from '@mariozechner/pi-ai';\nimport { bedrockProviderModule } from '@mariozechner/pi-ai/bedrock-provider';\nimport {\n createAgentSession,\n DefaultResourceLoader,\n getAgentDir,\n InteractiveMode,\n runPrintMode,\n SessionManager,\n SettingsManager,\n} from '@mariozechner/pi-coding-agent';\n\nimport { parseArgs } from './args.js';\nimport { getPackageJson } from './utils/package.js';\n\n/**\n * Read all data from stdin if available.\n * Returns null if stdin is not piped/redirected.\n */\nasync function readStdin(): Promise<string | null> {\n if (process.stdin.isTTY) {\n // stdin is a terminal (not piped)\n return null;\n }\n\n return new Promise((resolve, reject) => {\n let data = '';\n process.stdin.setEncoding('utf-8');\n\n process.stdin.on('data', (chunk) => {\n data += chunk;\n });\n\n process.stdin.on('end', () => {\n resolve(data.trim() || null);\n });\n\n process.stdin.on('error', (err) => {\n reject(err);\n });\n\n // Resume stdin to start reading\n process.stdin.resume();\n });\n}\n\n// Register Bedrock provider so AWS users can use it without extra setup\nsetBedrockProviderModule(bedrockProviderModule);\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\nasync function main(argv: string[]): Promise<void> {\n const pkg = getPackageJson();\n const { args, commandHandled } = parseArgs(argv, pkg.version, pkg.name);\n\n // If a subcommand (e.g., update) was invoked, skip the agent session logic\n if (commandHandled) {\n return;\n }\n\n const cwd = args.cwd ? resolve(args.cwd) : process.cwd();\n\n // -------------------------------------------------------------------------\n // Session manager\n // -------------------------------------------------------------------------\n let sessionManager: SessionManager | undefined;\n\n if (args.noSession) {\n sessionManager = SessionManager.inMemory();\n } else if (args.continue) {\n sessionManager = SessionManager.continueRecent(cwd);\n }\n // undefined → createAgentSession creates a new persisted session\n\n // -------------------------------------------------------------------------\n // Model resolution (only when --model is passed; pi picks from settings /\n // env vars automatically otherwise)\n // -------------------------------------------------------------------------\n let model: ReturnType<typeof getModel> | undefined;\n\n if (args.model) {\n const provider = (args.provider ?? 'anthropic') as Parameters<typeof getModel>[0];\n try {\n model = getModel(provider, args.model as Parameters<typeof getModel>[1]);\n } catch {\n console.warn(`Warning: unknown model \"${provider}/${args.model}\", falling back to default.`);\n }\n }\n\n // -------------------------------------------------------------------------\n // Create custom resource loader with our version-check extension\n // -------------------------------------------------------------------------\n const agentDir = getAgentDir();\n const settingsManager = SettingsManager.create(cwd, agentDir);\n\n // Scan extensions folder for all .ts and .js files (excluding .d.ts)\n let extensionFiles: string[] = [];\n const extensionsDir = join(__dirname, 'extensions');\n if (existsSync(extensionsDir)) {\n extensionFiles = await readdir(extensionsDir).then((files) =>\n files\n .filter((f) => (f.endsWith('.ts') || f.endsWith('.js')) && !f.endsWith('.d.ts'))\n .map((f) => join(extensionsDir, f)),\n );\n }\n\n const resourceLoader = new DefaultResourceLoader({\n cwd,\n agentDir,\n settingsManager,\n additionalExtensionPaths: extensionFiles,\n });\n await resourceLoader.reload();\n\n // -------------------------------------------------------------------------\n // Create session\n // -------------------------------------------------------------------------\n const { session, modelFallbackMessage } = await createAgentSession({\n cwd,\n ...(model ? { model } : {}),\n ...(args.thinking ? { thinkingLevel: args.thinking } : {}),\n ...(sessionManager ? { sessionManager } : {}),\n settingsManager,\n resourceLoader,\n });\n\n if (modelFallbackMessage) {\n console.warn(`Warning: ${modelFallbackMessage}`);\n }\n\n // -------------------------------------------------------------------------\n // Run mode\n // -------------------------------------------------------------------------\n\n // Read from stdin if -p flag is set but no prompt provided\n let initialMessage = args.messages[0];\n if (args.print && !initialMessage) {\n const stdinContent = await readStdin();\n if (stdinContent) {\n initialMessage = stdinContent;\n }\n }\n\n if (args.print) {\n await runPrintMode(session, {\n mode: 'text',\n initialMessage,\n messages: args.messages.slice(1),\n });\n process.exit(0);\n } else {\n const mode = new InteractiveMode(session, {\n initialMessage,\n initialMessages: args.messages.slice(1),\n });\n await mode.run();\n }\n}\n\nmain(process.argv.slice(2)).catch((err) => {\n console.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n});\n","#!/usr/bin/env node\n/**\n * Genesys Agent v2 CLI launcher.\n *\n * Sets environment variables before importing the main CLI to ensure\n * pi-coding-agent reads the correct configuration during initialization.\n */\n\nimport { existsSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\n/**\n * Find the first directory containing package.json, starting from the given\n * directory and walking upward.\n */\nfunction findPackageDir(startDir: string): string | undefined {\n let dir = startDir;\n while (dir !== dirname(dir)) {\n if (existsSync(join(dir, 'package.json'))) {\n return dir;\n }\n dir = dirname(dir);\n }\n return undefined;\n}\n\n// Set PI_PACKAGE_DIR to the first directory with package.json\n// This MUST be set before importing @mariozechner/pi-coding-agent so that\n// packages/coding-agent/src/config.ts can read it during initialization\nconst packageDir = findPackageDir(__dirname);\nif (packageDir) {\n process.env.PI_PACKAGE_DIR = packageDir;\n}\n\n// Disable pi-coding-agent's built-in version check (we use an extension)\nprocess.env.PI_SKIP_VERSION_CHECK = '1';\n\n// Now import and run the actual CLI\nawait import('./cli.js');\n"],"mappings":"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","names":["fileURLToPath","__dirname","existsSync","dirname","join","fileURLToPath","resolve","existsSync","dirname","join","fileURLToPath","__filename","__dirname"]}
|
|
1
|
+
{"version":3,"sources":["../../../extensions/src/internal/providers/dashscope.ts","../../../extensions/src/internal/providers/index.ts","../../../extensions/src/internal/context-resolver.ts","../../../extensions/src/index.ts","../../../../../cli-utils/src/self-update.ts","../../../../../cli-utils/src/index.ts","../../src/args.ts","../../src/utils/package.ts","../../src/extensions/version-check.ts","../../src/cli.ts","../../src/launcher.ts"],"sourcesContent":["import { getModel } from '@mariozechner/pi-ai';\n\nimport type { ExtensionAPI, ExtensionFactory } from '@mariozechner/pi-coding-agent';\n\nconst DASHSCOPE_BASE_URL_ANTHROPIC = 'https://coding.dashscope.aliyuncs.com/apps/anthropic';\n\nexport function createDashscopeExtension(): ExtensionFactory {\n return (pi: ExtensionAPI) => {\n const apiKey = process.env.DASHSCOPE_API_KEY;\n if (!apiKey) {\n return;\n }\n\n const qwen35PlusModel = getModel('openrouter', 'qwen/qwen3.5-plus-02-15');\n const qwen3MaxModel = getModel('openrouter', 'qwen/qwen3-max');\n const qwen3CoderNextModel = getModel('openrouter', 'qwen/qwen3-coder-next');\n const qwen3CoderPlusModel = getModel('openrouter', 'qwen/qwen3-coder-plus');\n const glm5Model = getModel('openrouter', 'z-ai/glm-5');\n const glm47Model = getModel('openrouter', 'z-ai/glm-4.7');\n const kimiK25Model = getModel('openrouter', 'moonshotai/kimi-k2.5');\n const minimaxM25Model = getModel('openrouter', 'minimax/minimax-m2.5');\n\n pi.registerProvider('dashscope', {\n baseUrl: DASHSCOPE_BASE_URL_ANTHROPIC,\n apiKey: apiKey,\n api: 'anthropic-messages',\n models: [\n // Qwen models (Alibaba Cloud)\n {\n id: 'qwen3.5-plus',\n name: 'Qwen 3.5 Plus',\n reasoning: qwen35PlusModel.reasoning,\n input: qwen35PlusModel.input,\n cost: qwen35PlusModel.cost,\n contextWindow: qwen35PlusModel.contextWindow,\n maxTokens: qwen35PlusModel.maxTokens,\n },\n {\n id: 'qwen3-max-2026-01-23',\n name: 'Qwen 3 Max',\n reasoning: qwen3MaxModel.reasoning,\n input: qwen3MaxModel.input,\n cost: qwen3MaxModel.cost,\n contextWindow: qwen3MaxModel.contextWindow,\n maxTokens: qwen3MaxModel.maxTokens,\n },\n {\n id: 'qwen3-coder-next',\n name: 'Qwen 3 Coder Next',\n reasoning: qwen3CoderNextModel.reasoning,\n input: qwen3CoderNextModel.input,\n cost: qwen3CoderNextModel.cost,\n contextWindow: qwen3CoderNextModel.contextWindow,\n maxTokens: qwen3CoderNextModel.maxTokens,\n },\n {\n id: 'qwen3-coder-plus',\n name: 'Qwen 3 Coder Plus',\n reasoning: qwen3CoderPlusModel.reasoning,\n input: qwen3CoderPlusModel.input,\n cost: qwen3CoderPlusModel.cost,\n contextWindow: qwen3CoderPlusModel.contextWindow,\n maxTokens: qwen3CoderPlusModel.maxTokens,\n },\n // GLM models (Zhipu AI)\n {\n id: 'glm-5',\n name: 'GLM 5',\n reasoning: glm5Model.reasoning,\n input: glm5Model.input,\n cost: glm5Model.cost,\n contextWindow: glm5Model.contextWindow,\n maxTokens: glm5Model.maxTokens,\n },\n {\n id: 'glm-4.7',\n name: 'GLM 4.7',\n reasoning: glm47Model.reasoning,\n input: glm47Model.input,\n cost: glm47Model.cost,\n contextWindow: glm47Model.contextWindow,\n maxTokens: glm47Model.maxTokens,\n },\n // Kimi models (Moonshot AI)\n {\n id: 'kimi-k2.5',\n name: 'Kimi K2.5',\n reasoning: kimiK25Model.reasoning,\n input: kimiK25Model.input,\n cost: kimiK25Model.cost,\n contextWindow: kimiK25Model.contextWindow,\n maxTokens: kimiK25Model.maxTokens,\n },\n // MiniMax models\n {\n id: 'MiniMax-M2.5',\n name: 'MiniMax M2.5',\n reasoning: minimaxM25Model.reasoning,\n input: minimaxM25Model.input,\n cost: minimaxM25Model.cost,\n contextWindow: minimaxM25Model.contextWindow,\n maxTokens: 32768,\n },\n ],\n });\n };\n}\n\n// Default instance uses env vars, skips silently if missing\nexport const dashscopeExtension = createDashscopeExtension();\n","export { createDashscopeExtension, dashscopeExtension } from './dashscope.js';\n","import { dashscopeExtension } from './providers/index.js';\n\nimport type { ExtensionContext, ExtensionSet } from '../types.js';\n\nexport function resolveExtensionSet(context: ExtensionContext): ExtensionSet {\n const extensions: ExtensionSet = [];\n\n switch (context) {\n case 'cli': {\n // CLI gets default extensions (env-based configuration)\n extensions.push(dashscopeExtension);\n // Add other CLI-appropriate extensions here\n break;\n }\n\n case 'embedded': {\n // Embedded gets the same extensions by default\n // Could add context-specific extensions here in the future\n extensions.push(dashscopeExtension);\n break;\n }\n\n default: {\n const _exhaustive: never = context;\n throw new Error(`Unknown extension context: ${_exhaustive}`);\n }\n }\n\n return extensions;\n}\n","import { resolveExtensionSet } from './internal/context-resolver.js';\n\nimport type { ExtensionContext, ExtensionSet } from './types.js';\n\nexport type { ExtensionContext, ExtensionSet } from './types.js';\nexport type { ExtensionFactory } from '@mariozechner/pi-coding-agent';\n\n/**\n * Get the appropriate extension set for the given context.\n *\n * @param context - The context to get extensions for ('cli' | 'embedded')\n * @returns Array of extension factories ready to use\n *\n * @example\n * ```typescript\n * // CLI usage\n * import { getExtensions } from '@gnsx/genesys.agent.extensions';\n *\n * const extensions = getExtensions('cli');\n * const resourceLoader = new DefaultResourceLoader({\n * extensionFactories: extensions\n * });\n * ```\n *\n * @example\n * ```typescript\n * // Embedded usage\n * import { getExtensions } from '@gnsx/genesys.agent.extensions';\n *\n * const agent = new EmbeddedAgent();\n * await agent.start({\n * cwd: '/project',\n * extensions: getExtensions('embedded')\n * });\n * ```\n */\nexport function getExtensions(context: ExtensionContext): ExtensionSet {\n return resolveExtensionSet(context);\n}\n","/**\n * Self-update functionality for Genesys CLI tools.\n *\n * Provides utilities for checking and performing CLI updates\n * via npm or pnpm package managers.\n */\n\nimport { execSync } from 'child_process';\nimport { fileURLToPath } from 'url';\nimport type { Command } from 'commander';\n\n/**\n * Check if running from an installed package (not local development).\n * Returns true if the current file is inside node_modules.\n */\nexport function isInstalledPackage(): boolean {\n try {\n const currentFile = fileURLToPath(import.meta.url);\n return currentFile.includes('node_modules');\n } catch {\n return false;\n }\n}\n\n/**\n * Detect which package manager was used to install the CLI.\n * Checks environment variables and execution path.\n *\n * @returns 'pnpm', 'npm', or 'unknown'\n */\nexport function detectPackageManager(): 'pnpm' | 'npm' | 'unknown' {\n // Check environment variables\n if (process.env.PNPM_PACKAGE_NAME) return 'pnpm';\n if (process.env.npm_execpath?.includes('pnpm')) return 'pnpm';\n\n // Check exec path\n const execPath = process.argv[1] || '';\n if (execPath.includes('pnpm')) return 'pnpm';\n if (execPath.includes('npm')) return 'npm';\n\n // Default to pnpm (monorepo preference)\n return 'pnpm';\n}\n\n/**\n * Compare semantic versions.\n * Returns true if latest is newer than current.\n */\nfunction isNewerVersion(latest: string, current: string): boolean {\n const latestParts = latest.split('.').map(Number);\n const currentParts = current.split('.').map(Number);\n\n for (let i = 0; i < 3; i++) {\n const latestPart = latestParts[i] || 0;\n const currentPart = currentParts[i] || 0;\n if (latestPart > currentPart) return true;\n if (latestPart < currentPart) return false;\n }\n\n return false;\n}\n\n/**\n * Check npm registry for the latest version of a package.\n *\n * @param packageName - The npm package name\n * @param currentVersion - The currently installed version\n * @returns Latest version string, or null if up-to-date or error\n */\nexport async function checkForUpdates(\n packageName: string,\n currentVersion: string\n): Promise<string | null> {\n try {\n if (!isInstalledPackage()) return null;\n\n const encodedName = encodeURIComponent(packageName);\n const response = await fetch(`https://registry.npmjs.org/${encodedName}/latest`, {\n signal: AbortSignal.timeout(10000),\n });\n\n if (!response.ok) return null;\n\n const data = (await response.json()) as { version?: string };\n const latestVersion = data.version;\n\n if (!latestVersion || latestVersion === currentVersion) return null;\n if (!isNewerVersion(latestVersion, currentVersion)) return null;\n\n return latestVersion;\n } catch {\n return null;\n }\n}\n\n/**\n * Perform the update using the detected package manager.\n *\n * @param packageName - The npm package name\n * @param packageManager - The package manager to use ('pnpm' or 'npm')\n * @param currentVersion - The current installed version\n * @param latestVersion - The latest available version\n * @returns true on success, false on failure\n */\nexport function performUpdate(\n packageName: string,\n packageManager: 'pnpm' | 'npm',\n currentVersion: string,\n latestVersion: string\n): boolean {\n console.log(`\\nUpdating ${packageName}...`);\n console.log(` Current: v${currentVersion}`);\n console.log(` Latest: v${latestVersion}\\n`);\n\n try {\n const updateCommand = packageManager === 'pnpm'\n ? `pnpm remove -g ${packageName} && pnpm add -g ${packageName}@latest`\n : `npm uninstall -g ${packageName} && npm install -g ${packageName}@latest`;\n\n // Run in shell for cross-platform compatibility (&& works on Unix, needs shell on Windows)\n execSync(updateCommand, { stdio: 'inherit' } as import('child_process').ExecSyncOptions);\n\n console.log(`\\n✅ Update complete! ${packageName} has been updated to v${latestVersion}.`);\n return true;\n } catch (error) {\n console.error(`\\n❌ Update failed. Please try running the commands manually:`);\n if (packageManager === 'pnpm') {\n console.error(` pnpm remove -g ${packageName}`);\n console.error(` pnpm add -g ${packageName}@latest`);\n } else {\n console.error(` npm uninstall -g ${packageName}`);\n console.error(` npm install -g ${packageName}@latest`);\n }\n return false;\n }\n}\n\n/**\n * Callback fired when the update command is invoked.\n */\nexport type UpdateCommandCallback = () => void;\n\n/**\n * Add 'update' subcommand to a Commander.js program.\n *\n * @param program - The Commander.js program\n * @param packageName - The npm package name\n * @param currentVersion - The current installed version\n * @param onUpdate - Optional callback fired when the update command is invoked\n */\nexport function addUpdateCommand(\n program: Command,\n packageName: string,\n currentVersion: string,\n onUpdate?: UpdateCommandCallback\n): void {\n program\n .command('update')\n .description('Check for updates and install the latest version')\n .action(async () => {\n // Notify caller that update command is being handled\n onUpdate?.();\n\n // Skip if running from local development\n if (!isInstalledPackage()) {\n console.log('Skipping update check - running from local development.');\n process.exit(0);\n }\n\n console.log('Checking for updates...');\n\n const latestVersion = await checkForUpdates(packageName, currentVersion);\n\n if (!latestVersion) {\n console.log(`You are already using the latest version (v${currentVersion}).`);\n process.exit(0);\n }\n\n console.log(`\\n📦 Update available: v${currentVersion} → v${latestVersion}`);\n\n const packageManager = detectPackageManager();\n\n if (packageManager === 'unknown') {\n console.error('\\n❌ Could not detect package manager. Please update manually:');\n console.error(` pnpm remove -g ${packageName} && pnpm add -g ${packageName}@latest`);\n console.error(` or`);\n console.error(` npm uninstall -g ${packageName} && npm install -g ${packageName}@latest`);\n process.exit(1);\n }\n\n const success = performUpdate(packageName, packageManager, currentVersion, latestVersion);\n process.exit(success ? 0 : 1);\n });\n}\n","export * from './self-update.js';\n","/**\n * CLI argument definitions for the Genesys Agent v2 CLI.\n *\n * Intentionally minimal — model selection, session management and tool\n * configuration are delegated to pi's own machinery via createAgentSession.\n */\n\nimport { addUpdateCommand } from '@gnsx/cli-utils';\nimport { Command } from 'commander';\n\nimport type { ThinkingLevel } from '@mariozechner/pi-agent-core';\n\nexport interface Args {\n /** Working directory (default: process.cwd()) */\n cwd?: string;\n\n /** Model identifier, e.g. \"anthropic/claude-opus-4-5\" or \"claude-opus-4-5\" */\n model?: string;\n\n /** LLM provider, e.g. \"anthropic\". Used together with --model. */\n provider?: string;\n\n /** Thinking/reasoning level */\n thinking?: ThinkingLevel;\n\n /**\n * Print mode: send a single prompt, output the response, exit.\n * When true, `messages[0]` is used as the prompt.\n */\n print: boolean;\n\n /**\n * Disable session persistence (in-memory only).\n */\n noSession: boolean;\n\n /**\n * Continue the most recent session for the current working directory.\n */\n continue: boolean;\n\n /** Positional arguments / prompt text (used in print mode) */\n messages: string[];\n}\n\nexport interface ParseArgsResult {\n args: Args;\n program: Command;\n /** True if a subcommand (e.g., update) was invoked and the caller should exit early */\n commandHandled: boolean;\n}\n\nconst THINKING_LEVELS: ThinkingLevel[] = ['off', 'minimal', 'low', 'medium', 'high', 'xhigh'];\n\nfunction isThinkingLevel(value: string): value is ThinkingLevel {\n return THINKING_LEVELS.includes(value as ThinkingLevel);\n}\n\nfunction parseModel(value: string): { provider?: string; model: string } {\n // Support \"provider/model\" shorthand\n if (value.includes('/')) {\n const slash = value.indexOf('/');\n return {\n provider: value.slice(0, slash),\n model: value.slice(slash + 1),\n };\n }\n return { model: value };\n}\n\nexport function parseArgs(argv: string[], version: string, packageName: string): ParseArgsResult {\n let commandHandled = false;\n\n const program = new Command();\n const args: Args = {\n print: false,\n noSession: false,\n continue: false,\n messages: [],\n };\n\n program\n .name('genesys')\n .description('Genesys Agent v2 CLI - AI-powered coding assistant')\n .version(version, '-v, --version')\n .usage('[options] [prompt]')\n .action(() => {\n // Default action: agent session will run (commandHandled remains false)\n });\n\n // Add update command - callback sets flag when invoked\n addUpdateCommand(program, packageName, version, () => {\n commandHandled = true;\n });\n\n program\n .option('-p, --print', 'print mode: send prompt, output response, exit', false)\n .option('-c, --continue', 'continue the most recent session', false)\n .option('--no-session', 'disable session persistence (in-memory only)', false)\n .option('-m, --model <model>', 'model to use, e.g. \"anthropic/claude-opus-4-5\"')\n .option('--provider <name>', 'provider name (used with --model)')\n .option('--thinking <level>', `thinking level: ${THINKING_LEVELS.join(', ')}`)\n .option('--cwd <dir>', 'working directory (default: current directory)')\n .argument('[prompt...]', 'initial prompt text')\n .parse(argv, { from: 'user' });\n\n const opts = program.opts();\n const cliArgs = program.processedArgs as string[][];\n\n // Handle model parsing with provider/model shorthand\n if (opts.model) {\n const parsed = parseModel(opts.model);\n args.model = parsed.model;\n if (parsed.provider) {\n args.provider = parsed.provider;\n }\n }\n // Provider can be overridden explicitly\n if (opts.provider) {\n args.provider = opts.provider;\n }\n\n // Validate thinking level\n if (opts.thinking) {\n if (!isThinkingLevel(opts.thinking)) {\n console.error(`--thinking must be one of: ${THINKING_LEVELS.join(', ')}`);\n process.exit(1);\n }\n args.thinking = opts.thinking;\n }\n\n args.print = opts.print ?? false;\n args.noSession = opts.noSession ?? false;\n args.continue = opts.continue ?? false;\n args.cwd = opts.cwd;\n\n // Collect positional arguments as messages\n if (cliArgs.length > 0 && cliArgs[0]) {\n args.messages = cliArgs[0];\n }\n\n return { args, program, commandHandled };\n}\n","/**\n * Returns the parsed package.json for the nearest package by traversing\n * up from the current module's directory.\n */\nimport { existsSync, readFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nexport function getPackageJson<T = { name: string; version: string }>(): T {\n const __dirname = dirname(fileURLToPath(import.meta.url));\n let currentDir = __dirname;\n\n while (true) {\n const pkgPath = join(currentDir, 'package.json');\n if (existsSync(pkgPath)) {\n const content = readFileSync(pkgPath, 'utf-8');\n return JSON.parse(content) as T;\n }\n\n const parentDir = dirname(currentDir);\n // Stop at filesystem root\n if (parentDir === currentDir) {\n throw new Error('Could not find package.json');\n }\n currentDir = parentDir;\n }\n}\n","/**\n * Extension that checks for updates to @gnsx/genesys.agent.cli\n * and shows a notification if a newer version is available.\n */\nimport { getPackageJson } from '../utils/package.js';\n\nimport type { ExtensionAPI, ExtensionContext, ExtensionFactory } from '@mariozechner/pi-coding-agent';\n\nconst pkg = getPackageJson();\nconst PACKAGE_NAME = pkg.name;\nconst CURRENT_VERSION = pkg.version;\n\nasync function checkForNewVersion(): Promise<string | undefined> {\n if (process.env.PI_OFFLINE) {\n return undefined;\n }\n\n try {\n const encodedName = encodeURIComponent(PACKAGE_NAME);\n const response = await fetch(`https://registry.npmjs.org/${encodedName}/latest`, {\n signal: AbortSignal.timeout(10000),\n });\n if (!response.ok) {\n return undefined;\n }\n\n const data = (await response.json()) as { version?: string };\n const latestVersion = data.version;\n\n if (latestVersion && latestVersion !== CURRENT_VERSION) {\n return latestVersion;\n }\n return undefined;\n } catch (err) {\n return undefined;\n }\n}\n\nconst versionCheckExtension: ExtensionFactory = (pi: ExtensionAPI) => {\n // Listen for session start to check version\n pi.on('session_start', async (_event, ctx: ExtensionContext) => {\n // Run version check asynchronously (don't block startup)\n checkForNewVersion().then((newVersion) => {\n if (newVersion) {\n ctx.ui.notify(\n `Update available: v${newVersion} (current: v${CURRENT_VERSION}). Run: pnpm add -g ${PACKAGE_NAME}`,\n 'info'\n );\n }\n });\n });\n};\n\nexport default versionCheckExtension;\n","#!/usr/bin/env node\n/**\n * Genesys Agent v2 CLI entry point.\n *\n * Thin wrapper around pi's createAgentSession + InteractiveMode / runPrintMode.\n * All session persistence, model selection, tool management and compaction are\n * handled by the pi framework.\n */\n\nimport { dirname, join, resolve } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nimport { getExtensions } from '@gnsx/genesys.agent.extensions';\nimport { getModel, setBedrockProviderModule } from '@mariozechner/pi-ai';\nimport { bedrockProviderModule } from '@mariozechner/pi-ai/bedrock-provider';\nimport {\n AuthStorage,\n createAgentSession,\n DefaultResourceLoader,\n getAgentDir,\n InteractiveMode,\n ModelRegistry,\n runPrintMode,\n SessionManager,\n SettingsManager,\n} from '@mariozechner/pi-coding-agent';\n\nimport { parseArgs } from './args.js';\nimport versionCheckExtension from './extensions/version-check.js';\nimport { getPackageJson } from './utils/package.js';\n\n/**\n * Read all data from stdin if available.\n * Returns null if stdin is not piped/redirected.\n */\nasync function readStdin(): Promise<string | null> {\n if (process.stdin.isTTY) {\n // stdin is a terminal (not piped)\n return null;\n }\n\n return new Promise((resolve, reject) => {\n let data = '';\n process.stdin.setEncoding('utf-8');\n\n process.stdin.on('data', (chunk) => {\n data += chunk;\n });\n\n process.stdin.on('end', () => {\n resolve(data.trim() || null);\n });\n\n process.stdin.on('error', (err) => {\n reject(err);\n });\n\n // Resume stdin to start reading\n process.stdin.resume();\n });\n}\n\n// Register Bedrock provider so AWS users can use it without extra setup\nsetBedrockProviderModule(bedrockProviderModule);\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\nasync function main(argv: string[]): Promise<void> {\n const pkg = getPackageJson();\n const { args, commandHandled } = parseArgs(argv, pkg.version, pkg.name);\n\n // If a subcommand (e.g., update) was invoked, skip the agent session logic\n if (commandHandled) {\n return;\n }\n\n const cwd = args.cwd ? resolve(args.cwd) : process.cwd();\n\n // -------------------------------------------------------------------------\n // Session manager\n // -------------------------------------------------------------------------\n let sessionManager: SessionManager | undefined;\n\n if (args.noSession) {\n sessionManager = SessionManager.inMemory();\n } else if (args.continue) {\n sessionManager = SessionManager.continueRecent(cwd);\n }\n // undefined → createAgentSession creates a new persisted session\n\n // -------------------------------------------------------------------------\n // Model resolution (only when --model is passed; pi picks from settings /\n // env vars automatically otherwise)\n // -------------------------------------------------------------------------\n let model: ReturnType<typeof getModel> | undefined;\n\n if (args.model) {\n const provider = (args.provider ?? 'anthropic') as Parameters<typeof getModel>[0];\n try {\n model = getModel(provider, args.model as Parameters<typeof getModel>[1]);\n } catch {\n console.warn(`Warning: unknown model \"${provider}/${args.model}\", falling back to default.`);\n }\n }\n\n // -------------------------------------------------------------------------\n // Create custom resource loader with shared extensions + CLI-specific extensions\n // -------------------------------------------------------------------------\n const agentDir = getAgentDir();\n const settingsManager = SettingsManager.create(cwd, agentDir);\n\n // Get shared extensions from the extensions package + CLI-specific version check\n const sharedExtensions = getExtensions('cli');\n const extensionFactories = [...sharedExtensions, versionCheckExtension];\n\n const resourceLoader = new DefaultResourceLoader({\n cwd,\n agentDir,\n settingsManager,\n extensionFactories,\n });\n await resourceLoader.reload();\n\n // -------------------------------------------------------------------------\n // Apply extension provider registrations\n // -------------------------------------------------------------------------\n const extensionsResult = resourceLoader.getExtensions();\n const authStorage = AuthStorage.create(join(agentDir, 'auth.json'));\n const modelRegistry = new ModelRegistry(authStorage, join(agentDir, 'models.json'));\n\n // Apply pending provider registrations from extensions so they're available\n // for model resolution before AgentSession is created\n for (const { name, config, extensionPath } of extensionsResult.runtime.pendingProviderRegistrations) {\n try {\n modelRegistry.registerProvider(name, config);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.warn(`Warning: Extension \"${extensionPath}\" failed to register provider \"${name}\": ${message}`);\n }\n }\n extensionsResult.runtime.pendingProviderRegistrations = [];\n\n // -------------------------------------------------------------------------\n // Create session\n // -------------------------------------------------------------------------\n const { session, modelFallbackMessage } = await createAgentSession({\n cwd,\n modelRegistry,\n ...(model ? { model } : {}),\n ...(args.thinking ? { thinkingLevel: args.thinking } : {}),\n ...(sessionManager ? { sessionManager } : {}),\n settingsManager,\n resourceLoader,\n });\n\n if (modelFallbackMessage) {\n console.warn(`Warning: ${modelFallbackMessage}`);\n }\n\n // -------------------------------------------------------------------------\n // Run mode\n // -------------------------------------------------------------------------\n\n // Read from stdin if -p flag is set but no prompt provided\n let initialMessage = args.messages[0];\n if (args.print && !initialMessage) {\n const stdinContent = await readStdin();\n if (stdinContent) {\n initialMessage = stdinContent;\n }\n }\n\n if (args.print) {\n await runPrintMode(session, {\n mode: 'text',\n initialMessage,\n messages: args.messages.slice(1),\n });\n process.exit(0);\n } else {\n const mode = new InteractiveMode(session, {\n initialMessage,\n initialMessages: args.messages.slice(1),\n });\n await mode.run();\n }\n}\n\nmain(process.argv.slice(2)).catch((err) => {\n console.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n});\n","#!/usr/bin/env node\n/**\n * Genesys Agent v2 CLI launcher.\n *\n * Sets environment variables before importing the main CLI to ensure\n * pi-coding-agent reads the correct configuration during initialization.\n */\n\nimport { existsSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\n/**\n * Find the first directory containing package.json, starting from the given\n * directory and walking upward.\n */\nfunction findPackageDir(startDir: string): string | undefined {\n let dir = startDir;\n while (dir !== dirname(dir)) {\n if (existsSync(join(dir, 'package.json'))) {\n return dir;\n }\n dir = dirname(dir);\n }\n return undefined;\n}\n\n// Set PI_PACKAGE_DIR to the first directory with package.json\n// This MUST be set before importing @mariozechner/pi-coding-agent so that\n// packages/coding-agent/src/config.ts can read it during initialization\nconst packageDir = findPackageDir(__dirname);\nif (packageDir) {\n process.env.PI_PACKAGE_DIR = packageDir;\n}\n\n// Disable pi-coding-agent's built-in version check (we use an extension)\nprocess.env.PI_SKIP_VERSION_CHECK = '1';\n\n// Now import and run the actual CLI\nawait import('./cli.js');\n"],"mappings":";;;;;;;AAAA,SAAS,gBAAgB;AAMnB,SAAU,2BAAwB;AACtC,SAAO,CAAC,OAAoB;AAC1B,UAAM,SAAS,QAAQ,IAAI;AAC3B,QAAI,CAAC,QAAQ;AACX;IACF;AAEA,UAAM,kBAAkB,SAAS,cAAc,yBAAyB;AACxE,UAAM,gBAAgB,SAAS,cAAc,gBAAgB;AAC7D,UAAM,sBAAsB,SAAS,cAAc,uBAAuB;AAC1E,UAAM,sBAAsB,SAAS,cAAc,uBAAuB;AAC1E,UAAM,YAAY,SAAS,cAAc,YAAY;AACrD,UAAM,aAAa,SAAS,cAAc,cAAc;AACxD,UAAM,eAAe,SAAS,cAAc,sBAAsB;AAClE,UAAM,kBAAkB,SAAS,cAAc,sBAAsB;AAErE,OAAG,iBAAiB,aAAa;MAC/B,SAAS;MACT;MACA,KAAK;MACL,QAAQ;;QAEN;UACE,IAAI;UACJ,MAAM;UACN,WAAW,gBAAgB;UAC3B,OAAO,gBAAgB;UACvB,MAAM,gBAAgB;UACtB,eAAe,gBAAgB;UAC/B,WAAW,gBAAgB;;QAE7B;UACE,IAAI;UACJ,MAAM;UACN,WAAW,cAAc;UACzB,OAAO,cAAc;UACrB,MAAM,cAAc;UACpB,eAAe,cAAc;UAC7B,WAAW,cAAc;;QAE3B;UACE,IAAI;UACJ,MAAM;UACN,WAAW,oBAAoB;UAC/B,OAAO,oBAAoB;UAC3B,MAAM,oBAAoB;UAC1B,eAAe,oBAAoB;UACnC,WAAW,oBAAoB;;QAEjC;UACE,IAAI;UACJ,MAAM;UACN,WAAW,oBAAoB;UAC/B,OAAO,oBAAoB;UAC3B,MAAM,oBAAoB;UAC1B,eAAe,oBAAoB;UACnC,WAAW,oBAAoB;;;QAGjC;UACE,IAAI;UACJ,MAAM;UACN,WAAW,UAAU;UACrB,OAAO,UAAU;UACjB,MAAM,UAAU;UAChB,eAAe,UAAU;UACzB,WAAW,UAAU;;QAEvB;UACE,IAAI;UACJ,MAAM;UACN,WAAW,WAAW;UACtB,OAAO,WAAW;UAClB,MAAM,WAAW;UACjB,eAAe,WAAW;UAC1B,WAAW,WAAW;;;QAGxB;UACE,IAAI;UACJ,MAAM;UACN,WAAW,aAAa;UACxB,OAAO,aAAa;UACpB,MAAM,aAAa;UACnB,eAAe,aAAa;UAC5B,WAAW,aAAa;;;QAG1B;UACE,IAAI;UACJ,MAAM;UACN,WAAW,gBAAgB;UAC3B,OAAO,gBAAgB;UACvB,MAAM,gBAAgB;UACtB,eAAe,gBAAgB;UAC/B,WAAW;;;KAGhB;EACH;AACF;AA1GA,IAIM,8BAyGO;AA7Gb;;;AAIA,IAAM,+BAA+B;AAyG9B,IAAM,qBAAqB,yBAAwB;;;;;AC7G1D;;;;;;;;ACIM,SAAU,oBAAoB,SAAyB;AAC3D,QAAM,aAA2B,CAAA;AAEjC,UAAQ,SAAS;IACf,KAAK,OAAO;AAEV,iBAAW,KAAK,kBAAkB;AAElC;IACF;IAEA,KAAK,YAAY;AAGf,iBAAW,KAAK,kBAAkB;AAClC;IACF;IAEA,SAAS;AACP,YAAM,cAAqB;AAC3B,YAAM,IAAI,MAAM,8BAA8B,WAAW,EAAE;IAC7D;EACF;AAEA,SAAO;AACT;AA7BA;;;;;;;;ACoCM,SAAU,cAAc,SAAyB;AACrD,SAAO,oBAAoB,OAAO;AACpC;AAtCA;;;;;;;;ACOA,SAAS,gBAAgB;AACzB,SAAS,qBAAqB;AAOxB,SAAU,qBAAkB;AAChC,MAAI;AACF,UAAM,cAAc,cAAc,YAAY,GAAG;AACjD,WAAO,YAAY,SAAS,cAAc;EAC5C,QAAQ;AACN,WAAO;EACT;AACF;AAQM,SAAU,uBAAoB;AAElC,MAAI,QAAQ,IAAI;AAAmB,WAAO;AAC1C,MAAI,QAAQ,IAAI,cAAc,SAAS,MAAM;AAAG,WAAO;AAGvD,QAAM,WAAW,QAAQ,KAAK,CAAC,KAAK;AACpC,MAAI,SAAS,SAAS,MAAM;AAAG,WAAO;AACtC,MAAI,SAAS,SAAS,KAAK;AAAG,WAAO;AAGrC,SAAO;AACT;AAMA,SAAS,eAAe,QAAgB,SAAe;AACrD,QAAM,cAAc,OAAO,MAAM,GAAG,EAAE,IAAI,MAAM;AAChD,QAAM,eAAe,QAAQ,MAAM,GAAG,EAAE,IAAI,MAAM;AAElD,WAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,UAAM,aAAa,YAAY,CAAC,KAAK;AACrC,UAAM,cAAc,aAAa,CAAC,KAAK;AACvC,QAAI,aAAa;AAAa,aAAO;AACrC,QAAI,aAAa;AAAa,aAAO;EACvC;AAEA,SAAO;AACT;AASA,eAAsB,gBACpB,aACA,gBAAsB;AAEtB,MAAI;AACF,QAAI,CAAC,mBAAkB;AAAI,aAAO;AAElC,UAAM,cAAc,mBAAmB,WAAW;AAClD,UAAM,WAAW,MAAM,MAAM,8BAA8B,WAAW,WAAW;MAC/E,QAAQ,YAAY,QAAQ,GAAK;KAClC;AAED,QAAI,CAAC,SAAS;AAAI,aAAO;AAEzB,UAAM,OAAQ,MAAM,SAAS,KAAI;AACjC,UAAM,gBAAgB,KAAK;AAE3B,QAAI,CAAC,iBAAiB,kBAAkB;AAAgB,aAAO;AAC/D,QAAI,CAAC,eAAe,eAAe,cAAc;AAAG,aAAO;AAE3D,WAAO;EACT,QAAQ;AACN,WAAO;EACT;AACF;AAWM,SAAU,cACd,aACA,gBACA,gBACA,eAAqB;AAErB,UAAQ,IAAI;WAAc,WAAW,KAAK;AAC1C,UAAQ,IAAI,eAAe,cAAc,EAAE;AAC3C,UAAQ,IAAI,eAAe,aAAa;CAAI;AAE5C,MAAI;AACF,UAAM,gBAAgB,mBAAmB,SACrC,kBAAkB,WAAW,mBAAmB,WAAW,YAC3D,oBAAoB,WAAW,sBAAsB,WAAW;AAGpE,aAAS,eAAe,EAAE,OAAO,UAAS,CAA6C;AAEvF,YAAQ,IAAI;0BAAwB,WAAW,yBAAyB,aAAa,GAAG;AACxF,WAAO;EACT,SAAS,OAAO;AACd,YAAQ,MAAM;gEAA8D;AAC5E,QAAI,mBAAmB,QAAQ;AAC7B,cAAQ,MAAM,oBAAoB,WAAW,EAAE;AAC/C,cAAQ,MAAM,iBAAiB,WAAW,SAAS;IACrD,OAAO;AACL,cAAQ,MAAM,sBAAsB,WAAW,EAAE;AACjD,cAAQ,MAAM,oBAAoB,WAAW,SAAS;IACxD;AACA,WAAO;EACT;AACF;AAeM,SAAU,iBACd,SACA,aACA,gBACA,UAAgC;AAEhC,UACG,QAAQ,QAAQ,EAChB,YAAY,kDAAkD,EAC9D,OAAO,YAAW;AAEjB,eAAU;AAGV,QAAI,CAAC,mBAAkB,GAAI;AACzB,cAAQ,IAAI,yDAAyD;AACrE,cAAQ,KAAK,CAAC;IAChB;AAEA,YAAQ,IAAI,yBAAyB;AAErC,UAAM,gBAAgB,MAAM,gBAAgB,aAAa,cAAc;AAEvE,QAAI,CAAC,eAAe;AAClB,cAAQ,IAAI,8CAA8C,cAAc,IAAI;AAC5E,cAAQ,KAAK,CAAC;IAChB;AAEA,YAAQ,IAAI;+BAA2B,cAAc,YAAO,aAAa,EAAE;AAE3E,UAAM,iBAAiB,qBAAoB;AAE3C,QAAI,mBAAmB,WAAW;AAChC,cAAQ,MAAM,oEAA+D;AAC7E,cAAQ,MAAM,oBAAoB,WAAW,mBAAmB,WAAW,SAAS;AACpF,cAAQ,MAAM,MAAM;AACpB,cAAQ,MAAM,sBAAsB,WAAW,sBAAsB,WAAW,SAAS;AACzF,cAAQ,KAAK,CAAC;IAChB;AAEA,UAAM,UAAU,cAAc,aAAa,gBAAgB,gBAAgB,aAAa;AACxF,YAAQ,KAAK,UAAU,IAAI,CAAC;EAC9B,CAAC;AACL;AAjMA;;;;;;;ACAA,IAAAA,aAAA;;;;;;;;ACQA,SAAS,eAAe;AA8CxB,SAAS,gBAAgB,OAAuC;AAC9D,SAAO,gBAAgB,SAAS,KAAsB;AACxD;AAEA,SAAS,WAAW,OAAqD;AAEvE,MAAI,MAAM,SAAS,GAAG,GAAG;AACvB,UAAM,QAAQ,MAAM,QAAQ,GAAG;AAC/B,WAAO;AAAA,MACL,UAAU,MAAM,MAAM,GAAG,KAAK;AAAA,MAC9B,OAAO,MAAM,MAAM,QAAQ,CAAC;AAAA,IAC9B;AAAA,EACF;AACA,SAAO,EAAE,OAAO,MAAM;AACxB;AAEO,SAAS,UAAU,MAAgB,SAAiB,aAAsC;AAC/F,MAAI,iBAAiB;AAErB,QAAM,UAAU,IAAI,QAAQ;AAC5B,QAAM,OAAa;AAAA,IACjB,OAAO;AAAA,IACP,WAAW;AAAA,IACX,UAAU;AAAA,IACV,UAAU,CAAC;AAAA,EACb;AAEA,UACG,KAAK,SAAS,EACd,YAAY,oDAAoD,EAChE,QAAQ,SAAS,eAAe,EAChC,MAAM,oBAAoB,EAC1B,OAAO,MAAM;AAAA,EAEd,CAAC;AAGH,mBAAiB,SAAS,aAAa,SAAS,MAAM;AACpD,qBAAiB;AAAA,EACnB,CAAC;AAED,UACG,OAAO,eAAe,kDAAkD,KAAK,EAC7E,OAAO,kBAAkB,oCAAoC,KAAK,EAClE,OAAO,gBAAgB,gDAAgD,KAAK,EAC5E,OAAO,uBAAuB,gDAAgD,EAC9E,OAAO,qBAAqB,mCAAmC,EAC/D,OAAO,sBAAsB,mBAAmB,gBAAgB,KAAK,IAAI,CAAC,EAAE,EAC5E,OAAO,eAAe,gDAAgD,EACtE,SAAS,eAAe,qBAAqB,EAC7C,MAAM,MAAM,EAAE,MAAM,OAAO,CAAC;AAE/B,QAAM,OAAO,QAAQ,KAAK;AAC1B,QAAM,UAAU,QAAQ;AAGxB,MAAI,KAAK,OAAO;AACd,UAAM,SAAS,WAAW,KAAK,KAAK;AACpC,SAAK,QAAQ,OAAO;AACpB,QAAI,OAAO,UAAU;AACnB,WAAK,WAAW,OAAO;AAAA,IACzB;AAAA,EACF;AAEA,MAAI,KAAK,UAAU;AACjB,SAAK,WAAW,KAAK;AAAA,EACvB;AAGA,MAAI,KAAK,UAAU;AACjB,QAAI,CAAC,gBAAgB,KAAK,QAAQ,GAAG;AACnC,cAAQ,MAAM,8BAA8B,gBAAgB,KAAK,IAAI,CAAC,EAAE;AACxE,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,SAAK,WAAW,KAAK;AAAA,EACvB;AAEA,OAAK,QAAQ,KAAK,SAAS;AAC3B,OAAK,YAAY,KAAK,aAAa;AACnC,OAAK,WAAW,KAAK,YAAY;AACjC,OAAK,MAAM,KAAK;AAGhB,MAAI,QAAQ,SAAS,KAAK,QAAQ,CAAC,GAAG;AACpC,SAAK,WAAW,QAAQ,CAAC;AAAA,EAC3B;AAEA,SAAO,EAAE,MAAM,SAAS,eAAe;AACzC;AA9IA,IAoDM;AApDN;AAAA;AAAA;AAOA,IAAAC;AA6CA,IAAM,kBAAmC,CAAC,OAAO,WAAW,OAAO,UAAU,QAAQ,OAAO;AAAA;AAAA;;;AChD5F,SAAS,YAAY,oBAAoB;AACzC,SAAS,SAAS,YAAY;AAC9B,SAAS,iBAAAC,sBAAqB;AAEvB,SAAS,iBAA2D;AACzE,QAAMC,aAAY,QAAQD,eAAc,YAAY,GAAG,CAAC;AACxD,MAAI,aAAaC;AAEjB,SAAO,MAAM;AACX,UAAM,UAAU,KAAK,YAAY,cAAc;AAC/C,QAAI,WAAW,OAAO,GAAG;AACvB,YAAM,UAAU,aAAa,SAAS,OAAO;AAC7C,aAAO,KAAK,MAAM,OAAO;AAAA,IAC3B;AAEA,UAAM,YAAY,QAAQ,UAAU;AAEpC,QAAI,cAAc,YAAY;AAC5B,YAAM,IAAI,MAAM,6BAA6B;AAAA,IAC/C;AACA,iBAAa;AAAA,EACf;AACF;AA1BA;AAAA;AAAA;AAAA;AAAA;;;ACYA,eAAe,qBAAkD;AAC/D,MAAI,QAAQ,IAAI,YAAY;AAC1B,WAAO;AAAA,EACT;AAEA,MAAI;AACF,UAAM,cAAc,mBAAmB,YAAY;AACnD,UAAM,WAAW,MAAM,MAAM,8BAA8B,WAAW,WAAW;AAAA,MAC/E,QAAQ,YAAY,QAAQ,GAAK;AAAA,IACnC,CAAC;AACD,QAAI,CAAC,SAAS,IAAI;AAChB,aAAO;AAAA,IACT;AAEA,UAAM,OAAQ,MAAM,SAAS,KAAK;AAClC,UAAM,gBAAgB,KAAK;AAE3B,QAAI,iBAAiB,kBAAkB,iBAAiB;AACtD,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT,SAAS,KAAK;AACZ,WAAO;AAAA,EACT;AACF;AApCA,IAQM,KACA,cACA,iBA4BA,uBAeC;AArDP;AAAA;AAAA;AAIA;AAIA,IAAM,MAAM,eAAe;AAC3B,IAAM,eAAe,IAAI;AACzB,IAAM,kBAAkB,IAAI;AA4B5B,IAAM,wBAA0C,CAAC,OAAqB;AAEpE,SAAG,GAAG,iBAAiB,OAAO,QAAQ,QAA0B;AAE9D,2BAAmB,EAAE,KAAK,CAAC,eAAe;AACxC,cAAI,YAAY;AACd,gBAAI,GAAG;AAAA,cACL,sBAAsB,UAAU,eAAe,eAAe,uBAAuB,YAAY;AAAA,cACjG;AAAA,YACF;AAAA,UACF;AAAA,QACF,CAAC;AAAA,MACH,CAAC;AAAA,IACH;AAEA,IAAO,wBAAQ;AAAA;AAAA;;;ACrDf;AASA,SAAS,WAAAC,UAAS,QAAAC,OAAM,eAAe;AACvC,SAAS,iBAAAC,sBAAqB;AAG9B,SAAS,YAAAC,WAAU,gCAAgC;AACnD,SAAS,6BAA6B;AACtC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAUP,eAAe,YAAoC;AACjD,MAAI,QAAQ,MAAM,OAAO;AAEvB,WAAO;AAAA,EACT;AAEA,SAAO,IAAI,QAAQ,CAACC,UAAS,WAAW;AACtC,QAAI,OAAO;AACX,YAAQ,MAAM,YAAY,OAAO;AAEjC,YAAQ,MAAM,GAAG,QAAQ,CAAC,UAAU;AAClC,cAAQ;AAAA,IACV,CAAC;AAED,YAAQ,MAAM,GAAG,OAAO,MAAM;AAC5B,MAAAA,SAAQ,KAAK,KAAK,KAAK,IAAI;AAAA,IAC7B,CAAC;AAED,YAAQ,MAAM,GAAG,SAAS,CAAC,QAAQ;AACjC,aAAO,GAAG;AAAA,IACZ,CAAC;AAGD,YAAQ,MAAM,OAAO;AAAA,EACvB,CAAC;AACH;AAQA,eAAe,KAAK,MAA+B;AACjD,QAAMC,OAAM,eAAe;AAC3B,QAAM,EAAE,MAAM,eAAe,IAAI,UAAU,MAAMA,KAAI,SAASA,KAAI,IAAI;AAGtE,MAAI,gBAAgB;AAClB;AAAA,EACF;AAEA,QAAM,MAAM,KAAK,MAAM,QAAQ,KAAK,GAAG,IAAI,QAAQ,IAAI;AAKvD,MAAI;AAEJ,MAAI,KAAK,WAAW;AAClB,qBAAiB,eAAe,SAAS;AAAA,EAC3C,WAAW,KAAK,UAAU;AACxB,qBAAiB,eAAe,eAAe,GAAG;AAAA,EACpD;AAOA,MAAI;AAEJ,MAAI,KAAK,OAAO;AACd,UAAM,WAAY,KAAK,YAAY;AACnC,QAAI;AACF,cAAQF,UAAS,UAAU,KAAK,KAAuC;AAAA,IACzE,QAAQ;AACN,cAAQ,KAAK,2BAA2B,QAAQ,IAAI,KAAK,KAAK,6BAA6B;AAAA,IAC7F;AAAA,EACF;AAKA,QAAM,WAAW,YAAY;AAC7B,QAAM,kBAAkB,gBAAgB,OAAO,KAAK,QAAQ;AAG5D,QAAM,mBAAmB,cAAc,KAAK;AAC5C,QAAM,qBAAqB,CAAC,GAAG,kBAAkB,qBAAqB;AAEtE,QAAM,iBAAiB,IAAI,sBAAsB;AAAA,IAC/C;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACD,QAAM,eAAe,OAAO;AAK5B,QAAM,mBAAmB,eAAe,cAAc;AACtD,QAAM,cAAc,YAAY,OAAOF,MAAK,UAAU,WAAW,CAAC;AAClE,QAAM,gBAAgB,IAAI,cAAc,aAAaA,MAAK,UAAU,aAAa,CAAC;AAIlF,aAAW,EAAE,MAAM,QAAQ,cAAc,KAAK,iBAAiB,QAAQ,8BAA8B;AACnG,QAAI;AACF,oBAAc,iBAAiB,MAAM,MAAM;AAAA,IAC7C,SAAS,OAAO;AACd,YAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,cAAQ,KAAK,uBAAuB,aAAa,kCAAkC,IAAI,MAAM,OAAO,EAAE;AAAA,IACxG;AAAA,EACF;AACA,mBAAiB,QAAQ,+BAA+B,CAAC;AAKzD,QAAM,EAAE,SAAS,qBAAqB,IAAI,MAAM,mBAAmB;AAAA,IACjE;AAAA,IACA;AAAA,IACA,GAAI,QAAQ,EAAE,MAAM,IAAI,CAAC;AAAA,IACzB,GAAI,KAAK,WAAW,EAAE,eAAe,KAAK,SAAS,IAAI,CAAC;AAAA,IACxD,GAAI,iBAAiB,EAAE,eAAe,IAAI,CAAC;AAAA,IAC3C;AAAA,IACA;AAAA,EACF,CAAC;AAED,MAAI,sBAAsB;AACxB,YAAQ,KAAK,YAAY,oBAAoB,EAAE;AAAA,EACjD;AAOA,MAAI,iBAAiB,KAAK,SAAS,CAAC;AACpC,MAAI,KAAK,SAAS,CAAC,gBAAgB;AACjC,UAAM,eAAe,MAAM,UAAU;AACrC,QAAI,cAAc;AAChB,uBAAiB;AAAA,IACnB;AAAA,EACF;AAEA,MAAI,KAAK,OAAO;AACd,UAAM,aAAa,SAAS;AAAA,MAC1B,MAAM;AAAA,MACN;AAAA,MACA,UAAU,KAAK,SAAS,MAAM,CAAC;AAAA,IACjC,CAAC;AACD,YAAQ,KAAK,CAAC;AAAA,EAChB,OAAO;AACL,UAAM,OAAO,IAAI,gBAAgB,SAAS;AAAA,MACxC;AAAA,MACA,iBAAiB,KAAK,SAAS,MAAM,CAAC;AAAA,IACxC,CAAC;AACD,UAAM,KAAK,IAAI;AAAA,EACjB;AACF;AA3LA,IAiEM,YACA;AAlEN;AAAA;AAAA;AAYA;AAeA;AACA;AACA;AAkCA,6BAAyB,qBAAqB;AAE9C,IAAM,aAAaC,eAAc,YAAY,GAAG;AAChD,IAAM,YAAYF,SAAQ,UAAU;AA2HpC,SAAK,QAAQ,KAAK,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,QAAQ;AACzC,cAAQ,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAC9D,cAAQ,KAAK,CAAC;AAAA,IAChB,CAAC;AAAA;AAAA;;;ACxLD,SAAS,cAAAM,mBAAkB;AAC3B,SAAS,WAAAC,UAAS,QAAAC,aAAY;AAC9B,SAAS,iBAAAC,sBAAqB;AAE9B,IAAMC,cAAaD,eAAc,YAAY,GAAG;AAChD,IAAME,aAAYJ,SAAQG,WAAU;AAMpC,SAAS,eAAe,UAAsC;AAC5D,MAAI,MAAM;AACV,SAAO,QAAQH,SAAQ,GAAG,GAAG;AAC3B,QAAID,YAAWE,MAAK,KAAK,cAAc,CAAC,GAAG;AACzC,aAAO;AAAA,IACT;AACA,UAAMD,SAAQ,GAAG;AAAA,EACnB;AACA,SAAO;AACT;AAKA,IAAM,aAAa,eAAeI,UAAS;AAC3C,IAAI,YAAY;AACd,UAAQ,IAAI,iBAAiB;AAC/B;AAGA,QAAQ,IAAI,wBAAwB;AAGpC,MAAM;","names":["init_dist","init_dist","fileURLToPath","__dirname","dirname","join","fileURLToPath","getModel","resolve","pkg","existsSync","dirname","join","fileURLToPath","__filename","__dirname"]}
|
package/dist/src/cli.js
CHANGED
|
@@ -6,14 +6,14 @@
|
|
|
6
6
|
* All session persistence, model selection, tool management and compaction are
|
|
7
7
|
* handled by the pi framework.
|
|
8
8
|
*/
|
|
9
|
-
import { existsSync } from 'node:fs';
|
|
10
|
-
import { readdir } from 'node:fs/promises';
|
|
11
9
|
import { dirname, join, resolve } from 'node:path';
|
|
12
10
|
import { fileURLToPath } from 'node:url';
|
|
11
|
+
import { getExtensions } from '@gnsx/genesys.agent.extensions';
|
|
13
12
|
import { getModel, setBedrockProviderModule } from '@mariozechner/pi-ai';
|
|
14
13
|
import { bedrockProviderModule } from '@mariozechner/pi-ai/bedrock-provider';
|
|
15
|
-
import { createAgentSession, DefaultResourceLoader, getAgentDir, InteractiveMode, runPrintMode, SessionManager, SettingsManager, } from '@mariozechner/pi-coding-agent';
|
|
14
|
+
import { AuthStorage, createAgentSession, DefaultResourceLoader, getAgentDir, InteractiveMode, ModelRegistry, runPrintMode, SessionManager, SettingsManager, } from '@mariozechner/pi-coding-agent';
|
|
16
15
|
import { parseArgs } from './args.js';
|
|
16
|
+
import versionCheckExtension from './extensions/version-check.js';
|
|
17
17
|
import { getPackageJson } from './utils/package.js';
|
|
18
18
|
/**
|
|
19
19
|
* Read all data from stdin if available.
|
|
@@ -78,30 +78,44 @@ async function main(argv) {
|
|
|
78
78
|
}
|
|
79
79
|
}
|
|
80
80
|
// -------------------------------------------------------------------------
|
|
81
|
-
// Create custom resource loader with
|
|
81
|
+
// Create custom resource loader with shared extensions + CLI-specific extensions
|
|
82
82
|
// -------------------------------------------------------------------------
|
|
83
83
|
const agentDir = getAgentDir();
|
|
84
84
|
const settingsManager = SettingsManager.create(cwd, agentDir);
|
|
85
|
-
//
|
|
86
|
-
|
|
87
|
-
const
|
|
88
|
-
if (existsSync(extensionsDir)) {
|
|
89
|
-
extensionFiles = await readdir(extensionsDir).then((files) => files
|
|
90
|
-
.filter((f) => (f.endsWith('.ts') || f.endsWith('.js')) && !f.endsWith('.d.ts'))
|
|
91
|
-
.map((f) => join(extensionsDir, f)));
|
|
92
|
-
}
|
|
85
|
+
// Get shared extensions from the extensions package + CLI-specific version check
|
|
86
|
+
const sharedExtensions = getExtensions('cli');
|
|
87
|
+
const extensionFactories = [...sharedExtensions, versionCheckExtension];
|
|
93
88
|
const resourceLoader = new DefaultResourceLoader({
|
|
94
89
|
cwd,
|
|
95
90
|
agentDir,
|
|
96
91
|
settingsManager,
|
|
97
|
-
|
|
92
|
+
extensionFactories,
|
|
98
93
|
});
|
|
99
94
|
await resourceLoader.reload();
|
|
100
95
|
// -------------------------------------------------------------------------
|
|
96
|
+
// Apply extension provider registrations
|
|
97
|
+
// -------------------------------------------------------------------------
|
|
98
|
+
const extensionsResult = resourceLoader.getExtensions();
|
|
99
|
+
const authStorage = AuthStorage.create(join(agentDir, 'auth.json'));
|
|
100
|
+
const modelRegistry = new ModelRegistry(authStorage, join(agentDir, 'models.json'));
|
|
101
|
+
// Apply pending provider registrations from extensions so they're available
|
|
102
|
+
// for model resolution before AgentSession is created
|
|
103
|
+
for (const { name, config, extensionPath } of extensionsResult.runtime.pendingProviderRegistrations) {
|
|
104
|
+
try {
|
|
105
|
+
modelRegistry.registerProvider(name, config);
|
|
106
|
+
}
|
|
107
|
+
catch (error) {
|
|
108
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
109
|
+
console.warn(`Warning: Extension "${extensionPath}" failed to register provider "${name}": ${message}`);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
extensionsResult.runtime.pendingProviderRegistrations = [];
|
|
113
|
+
// -------------------------------------------------------------------------
|
|
101
114
|
// Create session
|
|
102
115
|
// -------------------------------------------------------------------------
|
|
103
116
|
const { session, modelFallbackMessage } = await createAgentSession({
|
|
104
117
|
cwd,
|
|
118
|
+
modelRegistry,
|
|
105
119
|
...(model ? { model } : {}),
|
|
106
120
|
...(args.thinking ? { thinkingLevel: args.thinking } : {}),
|
|
107
121
|
...(sessionManager ? { sessionManager } : {}),
|
package/dist/src/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":";AACA;;;;;;GAMG;AAEH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"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"}
|