@cleocode/cleo 2026.5.65 → 2026.5.67
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/cli/index.js +381 -48
- package/dist/cli/index.js.map +3 -3
- package/package.json +10 -10
package/dist/cli/index.js
CHANGED
|
@@ -24279,8 +24279,8 @@ async function loadPlaybookByName(name) {
|
|
|
24279
24279
|
return null;
|
|
24280
24280
|
}
|
|
24281
24281
|
try {
|
|
24282
|
-
const { getProjectRoot:
|
|
24283
|
-
const projectRoot = __playbookRuntimeOverrides.projectRoot ??
|
|
24282
|
+
const { getProjectRoot: getProjectRoot35 } = await import("@cleocode/core/internal");
|
|
24283
|
+
const projectRoot = __playbookRuntimeOverrides.projectRoot ?? getProjectRoot35();
|
|
24284
24284
|
const resolved = resolvePlaybook(name, {
|
|
24285
24285
|
projectRoot,
|
|
24286
24286
|
globalPlaybooksDir: __playbookRuntimeOverrides.globalPlaybooksDir,
|
|
@@ -24324,8 +24324,8 @@ async function acquireDb() {
|
|
|
24324
24324
|
async function buildDefaultDispatcher() {
|
|
24325
24325
|
if (__playbookRuntimeOverrides.dispatcher) return __playbookRuntimeOverrides.dispatcher;
|
|
24326
24326
|
const { orchestrateSpawnExecute: orchestrateSpawnExecute2 } = await Promise.resolve().then(() => (init_engine(), engine_exports));
|
|
24327
|
-
const { getProjectRoot:
|
|
24328
|
-
const projectRoot =
|
|
24327
|
+
const { getProjectRoot: getProjectRoot35 } = await import("@cleocode/core/internal");
|
|
24328
|
+
const projectRoot = getProjectRoot35();
|
|
24329
24329
|
return {
|
|
24330
24330
|
async dispatch(input) {
|
|
24331
24331
|
try {
|
|
@@ -24515,8 +24515,8 @@ var init_playbook2 = __esm({
|
|
|
24515
24515
|
projectRoot = __playbookRuntimeOverrides.projectRoot;
|
|
24516
24516
|
} else {
|
|
24517
24517
|
try {
|
|
24518
|
-
const { getProjectRoot:
|
|
24519
|
-
projectRoot =
|
|
24518
|
+
const { getProjectRoot: getProjectRoot35 } = await import("@cleocode/core/internal");
|
|
24519
|
+
projectRoot = getProjectRoot35();
|
|
24520
24520
|
} catch {
|
|
24521
24521
|
projectRoot = void 0;
|
|
24522
24522
|
}
|
|
@@ -24580,14 +24580,14 @@ var init_playbook2 = __esm({
|
|
|
24580
24580
|
const dispatcher = await buildDefaultDispatcher();
|
|
24581
24581
|
let result;
|
|
24582
24582
|
try {
|
|
24583
|
-
const { getProjectRoot:
|
|
24583
|
+
const { getProjectRoot: getProjectRoot35 } = await import("@cleocode/core/internal");
|
|
24584
24584
|
const opts = {
|
|
24585
24585
|
db,
|
|
24586
24586
|
playbook: parsed.definition,
|
|
24587
24587
|
playbookHash: parsed.sourceHash,
|
|
24588
24588
|
initialContext,
|
|
24589
24589
|
dispatcher,
|
|
24590
|
-
projectRoot:
|
|
24590
|
+
projectRoot: getProjectRoot35()
|
|
24591
24591
|
};
|
|
24592
24592
|
if (__playbookRuntimeOverrides.approvalSecret !== void 0) {
|
|
24593
24593
|
opts.approvalSecret = __playbookRuntimeOverrides.approvalSecret;
|
|
@@ -29496,11 +29496,11 @@ var init_security = __esm({
|
|
|
29496
29496
|
});
|
|
29497
29497
|
|
|
29498
29498
|
// packages/cleo/src/dispatch/middleware/sanitizer.ts
|
|
29499
|
-
function createSanitizer(
|
|
29499
|
+
function createSanitizer(getProjectRoot35) {
|
|
29500
29500
|
return async (req, next) => {
|
|
29501
29501
|
if (req.params) {
|
|
29502
29502
|
try {
|
|
29503
|
-
const root =
|
|
29503
|
+
const root = getProjectRoot35 ? getProjectRoot35() : void 0;
|
|
29504
29504
|
req.params = sanitizeParams(req.params, root, {
|
|
29505
29505
|
domain: req.domain,
|
|
29506
29506
|
operation: req.operation
|
|
@@ -34722,9 +34722,9 @@ var init_backup = __esm({
|
|
|
34722
34722
|
},
|
|
34723
34723
|
async run({ args }) {
|
|
34724
34724
|
const scope = args.scope;
|
|
34725
|
-
const { packBundle, getProjectRoot:
|
|
34725
|
+
const { packBundle, getProjectRoot: getProjectRoot35 } = await import("@cleocode/core/internal");
|
|
34726
34726
|
const includesProject = scope === "project" || scope === "all";
|
|
34727
|
-
const projectRoot = includesProject ?
|
|
34727
|
+
const projectRoot = includesProject ? getProjectRoot35() : void 0;
|
|
34728
34728
|
let passphrase;
|
|
34729
34729
|
if (args.encrypt === true) {
|
|
34730
34730
|
passphrase = process.env["CLEO_BACKUP_PASSPHRASE"];
|
|
@@ -44054,11 +44054,262 @@ var init_list = __esm({
|
|
|
44054
44054
|
}
|
|
44055
44055
|
});
|
|
44056
44056
|
|
|
44057
|
+
// packages/cleo/src/cli/commands/llm-cost.ts
|
|
44058
|
+
var llm_cost_exports = {};
|
|
44059
|
+
__export(llm_cost_exports, {
|
|
44060
|
+
costCommand: () => costCommand
|
|
44061
|
+
});
|
|
44062
|
+
import { getProjectRoot as getProjectRoot26 } from "@cleocode/core/internal";
|
|
44063
|
+
import { computeCost } from "@cleocode/core/llm/usage-pricing";
|
|
44064
|
+
function resolveSessionId(raw) {
|
|
44065
|
+
if (raw === "current") {
|
|
44066
|
+
const envId = process.env["CLEO_SESSION_ID"];
|
|
44067
|
+
if (envId) return envId;
|
|
44068
|
+
return "current";
|
|
44069
|
+
}
|
|
44070
|
+
return raw;
|
|
44071
|
+
}
|
|
44072
|
+
async function loadSessionCostBreakdown(projectRoot, sessionId) {
|
|
44073
|
+
const { listTokenUsage: listTokenUsage2 } = await import(
|
|
44074
|
+
/* webpackIgnore: true */
|
|
44075
|
+
"@cleocode/core/internal"
|
|
44076
|
+
);
|
|
44077
|
+
const result = await listTokenUsage2(projectRoot, {
|
|
44078
|
+
sessionId,
|
|
44079
|
+
limit: 1e3
|
|
44080
|
+
// Practical upper bound for a single session.
|
|
44081
|
+
});
|
|
44082
|
+
const entries = result.records.map(
|
|
44083
|
+
(row) => {
|
|
44084
|
+
const usage = {
|
|
44085
|
+
inputTokens: row.inputTokens,
|
|
44086
|
+
outputTokens: row.outputTokens
|
|
44087
|
+
};
|
|
44088
|
+
const model = row.model ?? "unknown";
|
|
44089
|
+
return {
|
|
44090
|
+
id: row.id,
|
|
44091
|
+
provider: row.provider,
|
|
44092
|
+
model: row.model,
|
|
44093
|
+
usage,
|
|
44094
|
+
costUsd: computeCost(usage, model),
|
|
44095
|
+
createdAt: row.createdAt
|
|
44096
|
+
};
|
|
44097
|
+
}
|
|
44098
|
+
);
|
|
44099
|
+
entries.sort((a, b) => a.createdAt.localeCompare(b.createdAt));
|
|
44100
|
+
return entries;
|
|
44101
|
+
}
|
|
44102
|
+
var costCommand;
|
|
44103
|
+
var init_llm_cost = __esm({
|
|
44104
|
+
"packages/cleo/src/cli/commands/llm-cost.ts"() {
|
|
44105
|
+
"use strict";
|
|
44106
|
+
init_dist();
|
|
44107
|
+
init_renderers();
|
|
44108
|
+
costCommand = defineCommand({
|
|
44109
|
+
meta: {
|
|
44110
|
+
name: "cost",
|
|
44111
|
+
description: 'Compute cumulative USD cost for an LLM session from recorded token_usage entries. Use "current" to resolve the active session from CLEO_SESSION_ID. Returns totalUsd=0 when no usage records exist yet (ADR-072 Wave 4b pending).'
|
|
44112
|
+
},
|
|
44113
|
+
args: {
|
|
44114
|
+
sessionId: {
|
|
44115
|
+
type: "positional",
|
|
44116
|
+
description: 'Session id to query, or "current" for the active session',
|
|
44117
|
+
required: true
|
|
44118
|
+
},
|
|
44119
|
+
json: {
|
|
44120
|
+
type: "boolean",
|
|
44121
|
+
description: "Output as JSON"
|
|
44122
|
+
}
|
|
44123
|
+
},
|
|
44124
|
+
async run({ args }) {
|
|
44125
|
+
const a = args;
|
|
44126
|
+
const rawSessionId = String(a["sessionId"] ?? "");
|
|
44127
|
+
if (!rawSessionId) {
|
|
44128
|
+
cliError("session-id is required", 6, {
|
|
44129
|
+
name: "E_VALIDATION",
|
|
44130
|
+
fix: 'Provide a session id or "current": cleo llm cost <session-id>'
|
|
44131
|
+
});
|
|
44132
|
+
process.exit(6);
|
|
44133
|
+
}
|
|
44134
|
+
const sessionId = resolveSessionId(rawSessionId);
|
|
44135
|
+
const projectRoot = getProjectRoot26(process.cwd());
|
|
44136
|
+
let breakdown;
|
|
44137
|
+
try {
|
|
44138
|
+
breakdown = await loadSessionCostBreakdown(projectRoot, sessionId);
|
|
44139
|
+
} catch (err) {
|
|
44140
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
44141
|
+
cliError(`Failed to query token_usage: ${message}`, 1, {
|
|
44142
|
+
name: "E_QUERY_FAILED",
|
|
44143
|
+
fix: "Ensure tasks.db is initialized: cleo session start"
|
|
44144
|
+
});
|
|
44145
|
+
process.exit(1);
|
|
44146
|
+
}
|
|
44147
|
+
const totalUsd = breakdown.reduce((sum, entry) => sum + entry.costUsd, 0);
|
|
44148
|
+
const result = {
|
|
44149
|
+
sessionId,
|
|
44150
|
+
totalUsd,
|
|
44151
|
+
recordCount: breakdown.length,
|
|
44152
|
+
breakdown
|
|
44153
|
+
};
|
|
44154
|
+
if (breakdown.length === 0) {
|
|
44155
|
+
result.note = "No token_usage records found for this session. Live usage wiring is pending ADR-072 Wave 4b (LlmExecutor done event). Records will appear automatically once that wave ships.";
|
|
44156
|
+
}
|
|
44157
|
+
cliOutput(result, {
|
|
44158
|
+
command: "llm-cost",
|
|
44159
|
+
operation: "llm.cost"
|
|
44160
|
+
});
|
|
44161
|
+
}
|
|
44162
|
+
});
|
|
44163
|
+
}
|
|
44164
|
+
});
|
|
44165
|
+
|
|
44166
|
+
// packages/cleo/src/cli/commands/llm-login.ts
|
|
44167
|
+
import { addCredential } from "@cleocode/core/llm/credentials-store.js";
|
|
44168
|
+
import {
|
|
44169
|
+
DeviceCodeAuthError,
|
|
44170
|
+
DeviceCodeTimeoutError,
|
|
44171
|
+
getAnthropicDeviceCodeConfig,
|
|
44172
|
+
pollForToken,
|
|
44173
|
+
startDeviceCodeFlow
|
|
44174
|
+
} from "@cleocode/core/llm/oauth/device-code.js";
|
|
44175
|
+
async function runLlmLogin(provider, opts) {
|
|
44176
|
+
const meta = { operation: "llm.login", timestamp: (/* @__PURE__ */ new Date()).toISOString() };
|
|
44177
|
+
if (provider !== "anthropic") {
|
|
44178
|
+
return {
|
|
44179
|
+
success: false,
|
|
44180
|
+
error: {
|
|
44181
|
+
code: "E_NOT_IMPLEMENTED",
|
|
44182
|
+
codeName: "E_NOT_IMPLEMENTED",
|
|
44183
|
+
message: `OAuth device-code login for '${provider}' is not yet wired. 'anthropic' is the only supported provider in the current MVP. To add credentials for other providers use 'cleo llm add <provider> --api-key-stdin'.`
|
|
44184
|
+
},
|
|
44185
|
+
meta
|
|
44186
|
+
};
|
|
44187
|
+
}
|
|
44188
|
+
const cfg = getAnthropicDeviceCodeConfig();
|
|
44189
|
+
let startResp;
|
|
44190
|
+
try {
|
|
44191
|
+
startResp = await startDeviceCodeFlow(cfg);
|
|
44192
|
+
} catch (err) {
|
|
44193
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
44194
|
+
return {
|
|
44195
|
+
success: false,
|
|
44196
|
+
error: {
|
|
44197
|
+
code: "E_DEVICE_CODE_START_FAILED",
|
|
44198
|
+
codeName: "E_DEVICE_CODE_START_FAILED",
|
|
44199
|
+
message: `Failed to initiate device-code OAuth flow: ${msg}`
|
|
44200
|
+
},
|
|
44201
|
+
meta
|
|
44202
|
+
};
|
|
44203
|
+
}
|
|
44204
|
+
process.stderr.write("\n");
|
|
44205
|
+
process.stderr.write(
|
|
44206
|
+
` Visit: ${startResp.verificationUriComplete ?? startResp.verificationUri}
|
|
44207
|
+
`
|
|
44208
|
+
);
|
|
44209
|
+
process.stderr.write(` Enter code: ${startResp.userCode}
|
|
44210
|
+
`);
|
|
44211
|
+
process.stderr.write("\n");
|
|
44212
|
+
process.stderr.write(
|
|
44213
|
+
` Waiting for authorization (up to ${Math.round(startResp.expiresIn / 60)} min)...
|
|
44214
|
+
`
|
|
44215
|
+
);
|
|
44216
|
+
let tokenResp;
|
|
44217
|
+
try {
|
|
44218
|
+
tokenResp = await pollForToken(cfg, startResp, {
|
|
44219
|
+
onPending: (elapsed) => {
|
|
44220
|
+
process.stderr.write(`\r Polling... ${elapsed}s elapsed`);
|
|
44221
|
+
}
|
|
44222
|
+
});
|
|
44223
|
+
} catch (err) {
|
|
44224
|
+
process.stderr.write("\n");
|
|
44225
|
+
if (err instanceof DeviceCodeTimeoutError) {
|
|
44226
|
+
return {
|
|
44227
|
+
success: false,
|
|
44228
|
+
error: {
|
|
44229
|
+
code: "E_DEVICE_CODE_TIMEOUT",
|
|
44230
|
+
codeName: "E_DEVICE_CODE_TIMEOUT",
|
|
44231
|
+
message: err.message
|
|
44232
|
+
},
|
|
44233
|
+
meta
|
|
44234
|
+
};
|
|
44235
|
+
}
|
|
44236
|
+
if (err instanceof DeviceCodeAuthError) {
|
|
44237
|
+
return {
|
|
44238
|
+
success: false,
|
|
44239
|
+
error: {
|
|
44240
|
+
code: "E_DEVICE_CODE_AUTH_FAILED",
|
|
44241
|
+
codeName: "E_DEVICE_CODE_AUTH_FAILED",
|
|
44242
|
+
message: err.message
|
|
44243
|
+
},
|
|
44244
|
+
meta
|
|
44245
|
+
};
|
|
44246
|
+
}
|
|
44247
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
44248
|
+
return {
|
|
44249
|
+
success: false,
|
|
44250
|
+
error: {
|
|
44251
|
+
code: "E_DEVICE_CODE_POLL_FAILED",
|
|
44252
|
+
codeName: "E_DEVICE_CODE_POLL_FAILED",
|
|
44253
|
+
message: `Polling for device code token failed: ${msg}`
|
|
44254
|
+
},
|
|
44255
|
+
meta
|
|
44256
|
+
};
|
|
44257
|
+
}
|
|
44258
|
+
process.stderr.write("\r Authorization approved. \n\n");
|
|
44259
|
+
const label = opts.label ?? "oauth-login";
|
|
44260
|
+
const expiresAt = typeof tokenResp.expiresIn === "number" ? Date.now() + tokenResp.expiresIn * 1e3 : void 0;
|
|
44261
|
+
try {
|
|
44262
|
+
await addCredential({
|
|
44263
|
+
provider: "anthropic",
|
|
44264
|
+
label,
|
|
44265
|
+
authType: "oauth",
|
|
44266
|
+
accessToken: tokenResp.accessToken,
|
|
44267
|
+
refreshToken: tokenResp.refreshToken,
|
|
44268
|
+
expiresAt,
|
|
44269
|
+
priority: 10,
|
|
44270
|
+
source: "oauth-device-code",
|
|
44271
|
+
extraHeaders: { "anthropic-beta": "oauth-2025-04-20" }
|
|
44272
|
+
});
|
|
44273
|
+
} catch (err) {
|
|
44274
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
44275
|
+
return {
|
|
44276
|
+
success: false,
|
|
44277
|
+
error: {
|
|
44278
|
+
code: "E_CREDENTIAL_STORE_FAILED",
|
|
44279
|
+
codeName: "E_CREDENTIAL_STORE_FAILED",
|
|
44280
|
+
message: `Failed to store credential in pool: ${msg}`
|
|
44281
|
+
},
|
|
44282
|
+
meta
|
|
44283
|
+
};
|
|
44284
|
+
}
|
|
44285
|
+
return {
|
|
44286
|
+
success: true,
|
|
44287
|
+
data: {
|
|
44288
|
+
provider: "anthropic",
|
|
44289
|
+
label,
|
|
44290
|
+
expiresIn: tokenResp.expiresIn
|
|
44291
|
+
},
|
|
44292
|
+
meta
|
|
44293
|
+
};
|
|
44294
|
+
}
|
|
44295
|
+
var init_llm_login = __esm({
|
|
44296
|
+
"packages/cleo/src/cli/commands/llm-login.ts"() {
|
|
44297
|
+
"use strict";
|
|
44298
|
+
}
|
|
44299
|
+
});
|
|
44300
|
+
|
|
44057
44301
|
// packages/cleo/src/cli/commands/llm.ts
|
|
44058
44302
|
var llm_exports = {};
|
|
44059
44303
|
__export(llm_exports, {
|
|
44060
44304
|
llmCommand: () => llmCommand
|
|
44061
44305
|
});
|
|
44306
|
+
async function getListProviders() {
|
|
44307
|
+
const { listProviders } = await import(
|
|
44308
|
+
/* webpackIgnore: true */
|
|
44309
|
+
"@cleocode/core/llm/provider-registry"
|
|
44310
|
+
);
|
|
44311
|
+
return listProviders;
|
|
44312
|
+
}
|
|
44062
44313
|
async function readApiKeyFromStdin() {
|
|
44063
44314
|
if (process.stdin.isTTY) return "";
|
|
44064
44315
|
process.stdin.setEncoding("utf-8");
|
|
@@ -44085,12 +44336,15 @@ function makeLlmSubcommand(opts) {
|
|
|
44085
44336
|
}
|
|
44086
44337
|
});
|
|
44087
44338
|
}
|
|
44088
|
-
var API_KEY_FLAG_DEPRECATION, addCommand5, listCommand10, removeCommand3, useCommand, profileCommand, testCommand, whoamiCommand, llmCommand;
|
|
44339
|
+
var API_KEY_FLAG_DEPRECATION, addCommand5, listCommand10, removeCommand3, useCommand, profileCommand, testCommand, whoamiCommand, listProvidersCommand, loginCommand, llmCommand;
|
|
44089
44340
|
var init_llm3 = __esm({
|
|
44090
44341
|
"packages/cleo/src/cli/commands/llm.ts"() {
|
|
44091
44342
|
"use strict";
|
|
44092
44343
|
init_dist();
|
|
44093
44344
|
init_cli();
|
|
44345
|
+
init_renderers();
|
|
44346
|
+
init_llm_cost();
|
|
44347
|
+
init_llm_login();
|
|
44094
44348
|
API_KEY_FLAG_DEPRECATION = "[warning] --api-key exposes the secret to 'ps' listings and shell history. Prefer --api-key-stdin or --api-key-env=NAME for production use.";
|
|
44095
44349
|
addCommand5 = defineCommand({
|
|
44096
44350
|
meta: {
|
|
@@ -44331,6 +44585,76 @@ var init_llm3 = __esm({
|
|
|
44331
44585
|
...args["role"] !== void 0 && args["role"] !== "" ? { role: args["role"] } : {}
|
|
44332
44586
|
})
|
|
44333
44587
|
});
|
|
44588
|
+
listProvidersCommand = defineCommand({
|
|
44589
|
+
meta: {
|
|
44590
|
+
name: "list-providers",
|
|
44591
|
+
description: "List all registered LLM provider profiles (builtins + user plugins from $CLEO_HOME/plugins/model-providers/)."
|
|
44592
|
+
},
|
|
44593
|
+
args: {
|
|
44594
|
+
json: {
|
|
44595
|
+
type: "boolean",
|
|
44596
|
+
description: "Output as JSON"
|
|
44597
|
+
}
|
|
44598
|
+
},
|
|
44599
|
+
async run() {
|
|
44600
|
+
const listProviders = await getListProviders();
|
|
44601
|
+
const profiles = await listProviders();
|
|
44602
|
+
const providers = profiles.map((p) => ({
|
|
44603
|
+
name: p.name,
|
|
44604
|
+
displayName: p.displayName,
|
|
44605
|
+
authTypes: p.authTypes,
|
|
44606
|
+
defaultModel: p.defaultModel,
|
|
44607
|
+
baseUrl: p.baseUrl
|
|
44608
|
+
}));
|
|
44609
|
+
cliOutput(
|
|
44610
|
+
{ providers },
|
|
44611
|
+
{
|
|
44612
|
+
command: "llm-list-providers",
|
|
44613
|
+
operation: "llm.listProviders"
|
|
44614
|
+
}
|
|
44615
|
+
);
|
|
44616
|
+
}
|
|
44617
|
+
});
|
|
44618
|
+
loginCommand = defineCommand({
|
|
44619
|
+
meta: {
|
|
44620
|
+
name: "login",
|
|
44621
|
+
description: "Authenticate with a provider via OAuth device-code flow. Supported providers: anthropic (MVP). Prints the verification URL and user code, then polls until the user approves."
|
|
44622
|
+
},
|
|
44623
|
+
args: {
|
|
44624
|
+
provider: {
|
|
44625
|
+
type: "positional",
|
|
44626
|
+
description: "Provider to authenticate with (e.g. anthropic)",
|
|
44627
|
+
required: true
|
|
44628
|
+
},
|
|
44629
|
+
label: {
|
|
44630
|
+
type: "string",
|
|
44631
|
+
description: "Human-readable label for the stored credential (default: 'oauth-login'). Must be unique within the provider. Use distinct labels when storing multiple OAuth sessions."
|
|
44632
|
+
},
|
|
44633
|
+
json: {
|
|
44634
|
+
type: "boolean",
|
|
44635
|
+
description: "Output result as JSON"
|
|
44636
|
+
}
|
|
44637
|
+
},
|
|
44638
|
+
async run({ args }) {
|
|
44639
|
+
const a = args;
|
|
44640
|
+
const provider = String(a["provider"] ?? "");
|
|
44641
|
+
const label = typeof a["label"] === "string" && a["label"] ? a["label"] : void 0;
|
|
44642
|
+
const jsonOutput = a["json"] === true;
|
|
44643
|
+
const result = await runLlmLogin(provider, { label });
|
|
44644
|
+
if (jsonOutput) {
|
|
44645
|
+
process.stdout.write(`${JSON.stringify(result, null, 2)}
|
|
44646
|
+
`);
|
|
44647
|
+
} else if (result.success && result.data) {
|
|
44648
|
+
process.stdout.write(
|
|
44649
|
+
`Logged in to ${result.data.provider} as '${result.data.label}'` + (result.data.expiresIn != null ? ` (expires in ${Math.round(result.data.expiresIn / 60)} min)` : "") + "\n"
|
|
44650
|
+
);
|
|
44651
|
+
} else if (result.error) {
|
|
44652
|
+
process.stderr.write(`[error] ${result.error.message}
|
|
44653
|
+
`);
|
|
44654
|
+
process.exit(1);
|
|
44655
|
+
}
|
|
44656
|
+
}
|
|
44657
|
+
});
|
|
44334
44658
|
llmCommand = defineCommand({
|
|
44335
44659
|
meta: {
|
|
44336
44660
|
name: "llm",
|
|
@@ -44338,12 +44662,15 @@ var init_llm3 = __esm({
|
|
|
44338
44662
|
},
|
|
44339
44663
|
subCommands: {
|
|
44340
44664
|
add: addCommand5,
|
|
44665
|
+
cost: costCommand,
|
|
44341
44666
|
list: listCommand10,
|
|
44667
|
+
login: loginCommand,
|
|
44342
44668
|
remove: removeCommand3,
|
|
44343
44669
|
use: useCommand,
|
|
44344
44670
|
profile: profileCommand,
|
|
44345
44671
|
test: testCommand,
|
|
44346
|
-
whoami: whoamiCommand
|
|
44672
|
+
whoami: whoamiCommand,
|
|
44673
|
+
"list-providers": listProvidersCommand
|
|
44347
44674
|
},
|
|
44348
44675
|
async run({ cmd, rawArgs }) {
|
|
44349
44676
|
const firstArg = rawArgs?.find((a) => !a.startsWith("-"));
|
|
@@ -44786,7 +45113,7 @@ import {
|
|
|
44786
45113
|
getBrainDb as getBrainDb2,
|
|
44787
45114
|
getBrainNativeDb as getBrainNativeDb3,
|
|
44788
45115
|
getDreamStatus,
|
|
44789
|
-
getProjectRoot as
|
|
45116
|
+
getProjectRoot as getProjectRoot27,
|
|
44790
45117
|
runConsolidation,
|
|
44791
45118
|
triggerManualDream
|
|
44792
45119
|
} from "@cleocode/core/internal";
|
|
@@ -45747,7 +46074,7 @@ var init_memory3 = __esm({
|
|
|
45747
46074
|
},
|
|
45748
46075
|
args: {},
|
|
45749
46076
|
async run() {
|
|
45750
|
-
const root =
|
|
46077
|
+
const root = getProjectRoot27();
|
|
45751
46078
|
try {
|
|
45752
46079
|
const result = await runConsolidation(root);
|
|
45753
46080
|
cliOutput(result, { command: "memory-consolidate", operation: "memory.consolidate" });
|
|
@@ -45771,7 +46098,7 @@ var init_memory3 = __esm({
|
|
|
45771
46098
|
}
|
|
45772
46099
|
},
|
|
45773
46100
|
async run({ args }) {
|
|
45774
|
-
const root =
|
|
46101
|
+
const root = getProjectRoot27();
|
|
45775
46102
|
if (args.status) {
|
|
45776
46103
|
try {
|
|
45777
46104
|
const status = await getDreamStatus(root);
|
|
@@ -45808,7 +46135,7 @@ var init_memory3 = __esm({
|
|
|
45808
46135
|
}
|
|
45809
46136
|
},
|
|
45810
46137
|
async run({ args }) {
|
|
45811
|
-
const root =
|
|
46138
|
+
const root = getProjectRoot27();
|
|
45812
46139
|
try {
|
|
45813
46140
|
const { runObserver, runReflector } = await import("@cleocode/core/internal");
|
|
45814
46141
|
const observerResult = await runObserver(root, args.session, {
|
|
@@ -45848,7 +46175,7 @@ var init_memory3 = __esm({
|
|
|
45848
46175
|
}
|
|
45849
46176
|
},
|
|
45850
46177
|
async run({ args }) {
|
|
45851
|
-
const root =
|
|
46178
|
+
const root = getProjectRoot27();
|
|
45852
46179
|
try {
|
|
45853
46180
|
const { getBrainDb: getBrainDbInner, getBrainNativeDb: getBrainNativeDbInner } = await import("@cleocode/core/internal");
|
|
45854
46181
|
await getBrainDbInner(root);
|
|
@@ -45946,7 +46273,7 @@ var init_memory3 = __esm({
|
|
|
45946
46273
|
async run({ args }) {
|
|
45947
46274
|
const sourceDir = args.from ?? join19(homedir6(), ".claude", "projects", "-mnt-projects-cleocode", "memory");
|
|
45948
46275
|
const isDryRun = !!args["dry-run"];
|
|
45949
|
-
const projectRoot =
|
|
46276
|
+
const projectRoot = getProjectRoot27();
|
|
45950
46277
|
const stateFile = join19(projectRoot, CLEO_DIR_NAME, MIGRATE_MEMORY_HASHES_JSON);
|
|
45951
46278
|
if (!existsSync14(sourceDir)) {
|
|
45952
46279
|
cliError(`Source directory not found: ${sourceDir}`, "E_NOT_FOUND", { name: "E_NOT_FOUND" });
|
|
@@ -46159,7 +46486,7 @@ var init_memory3 = __esm({
|
|
|
46159
46486
|
},
|
|
46160
46487
|
args: {},
|
|
46161
46488
|
async run() {
|
|
46162
|
-
const root =
|
|
46489
|
+
const root = getProjectRoot27();
|
|
46163
46490
|
try {
|
|
46164
46491
|
await getBrainDb2(root);
|
|
46165
46492
|
const nativeDb = getBrainNativeDb3();
|
|
@@ -46258,7 +46585,7 @@ var init_memory3 = __esm({
|
|
|
46258
46585
|
}
|
|
46259
46586
|
},
|
|
46260
46587
|
async run({ args }) {
|
|
46261
|
-
const root =
|
|
46588
|
+
const root = getProjectRoot27();
|
|
46262
46589
|
const targetTier = args.to;
|
|
46263
46590
|
const reason = args.reason;
|
|
46264
46591
|
const validTiers = ["medium", "long"];
|
|
@@ -46362,7 +46689,7 @@ var init_memory3 = __esm({
|
|
|
46362
46689
|
}
|
|
46363
46690
|
},
|
|
46364
46691
|
async run({ args }) {
|
|
46365
|
-
const root =
|
|
46692
|
+
const root = getProjectRoot27();
|
|
46366
46693
|
const targetTier = args.to;
|
|
46367
46694
|
const reason = args.reason;
|
|
46368
46695
|
const validTiers = ["short", "medium"];
|
|
@@ -46876,7 +47203,7 @@ var migrate_claude_mem_exports = {};
|
|
|
46876
47203
|
__export(migrate_claude_mem_exports, {
|
|
46877
47204
|
migrateClaudeMemCommand: () => migrateClaudeMemCommand
|
|
46878
47205
|
});
|
|
46879
|
-
import { getProjectRoot as
|
|
47206
|
+
import { getProjectRoot as getProjectRoot28, migrateClaudeMem } from "@cleocode/core/internal";
|
|
46880
47207
|
import { ingestLooseAgentOutputs, ingestRcasdDirectories } from "@cleocode/core/memory";
|
|
46881
47208
|
import { getDb as getDb2 } from "@cleocode/core/store/sqlite";
|
|
46882
47209
|
var storageCommand, claudeMemCommand, manifestIngestCommand, migrateClaudeMemCommand;
|
|
@@ -46939,7 +47266,7 @@ var init_migrate_claude_mem = __esm({
|
|
|
46939
47266
|
}
|
|
46940
47267
|
},
|
|
46941
47268
|
async run({ args }) {
|
|
46942
|
-
const root =
|
|
47269
|
+
const root = getProjectRoot28();
|
|
46943
47270
|
try {
|
|
46944
47271
|
const result = await migrateClaudeMem(root, {
|
|
46945
47272
|
sourcePath: args.source,
|
|
@@ -46988,7 +47315,7 @@ var init_migrate_claude_mem = __esm({
|
|
|
46988
47315
|
}
|
|
46989
47316
|
},
|
|
46990
47317
|
async run({ args }) {
|
|
46991
|
-
const projectRoot =
|
|
47318
|
+
const projectRoot = getProjectRoot28();
|
|
46992
47319
|
try {
|
|
46993
47320
|
const db = await getDb2(projectRoot);
|
|
46994
47321
|
const rcasdFlag = Boolean(args.rcasd);
|
|
@@ -47933,7 +48260,7 @@ var init_nexus4 = __esm({
|
|
|
47933
48260
|
const repoPath = args.path ? path4.resolve(args.path) : process.cwd();
|
|
47934
48261
|
humanInfo(`[nexus] Analyzing: ${repoPath}${isIncremental ? " (incremental)" : ""}`);
|
|
47935
48262
|
try {
|
|
47936
|
-
const [{ getNexusDb, nexusSchema }, { runPipeline }, { getProjectRoot:
|
|
48263
|
+
const [{ getNexusDb, nexusSchema }, { runPipeline }, { getProjectRoot: getProjectRoot35 }, { eq: eq2 }] = await Promise.all([
|
|
47937
48264
|
import("@cleocode/core/store/nexus-sqlite"),
|
|
47938
48265
|
import("@cleocode/nexus/pipeline"),
|
|
47939
48266
|
import("@cleocode/core/internal"),
|
|
@@ -48013,7 +48340,7 @@ var init_nexus4 = __esm({
|
|
|
48013
48340
|
extensions: { duration_ms: durationMs }
|
|
48014
48341
|
}
|
|
48015
48342
|
);
|
|
48016
|
-
void
|
|
48343
|
+
void getProjectRoot35;
|
|
48017
48344
|
} catch (err) {
|
|
48018
48345
|
const msg = err instanceof Error ? err.message : String(err);
|
|
48019
48346
|
cliError(
|
|
@@ -51615,7 +51942,7 @@ var refresh_memory_exports = {};
|
|
|
51615
51942
|
__export(refresh_memory_exports, {
|
|
51616
51943
|
refreshMemoryCommand: () => refreshMemoryCommand
|
|
51617
51944
|
});
|
|
51618
|
-
import { getProjectRoot as
|
|
51945
|
+
import { getProjectRoot as getProjectRoot29 } from "@cleocode/core";
|
|
51619
51946
|
var refreshMemoryCommand;
|
|
51620
51947
|
var init_refresh_memory = __esm({
|
|
51621
51948
|
"packages/cleo/src/cli/commands/refresh-memory.ts"() {
|
|
@@ -51628,7 +51955,7 @@ var init_refresh_memory = __esm({
|
|
|
51628
51955
|
description: "Regenerate .cleo/memory-bridge.md from brain.db"
|
|
51629
51956
|
},
|
|
51630
51957
|
async run() {
|
|
51631
|
-
const projectDir =
|
|
51958
|
+
const projectDir = getProjectRoot29();
|
|
51632
51959
|
const { writeMemoryBridge } = await import("@cleocode/core/internal");
|
|
51633
51960
|
const result = await writeMemoryBridge(projectDir);
|
|
51634
51961
|
if (result.written) {
|
|
@@ -52938,7 +53265,7 @@ __export(restore_exports, {
|
|
|
52938
53265
|
import fs3 from "node:fs";
|
|
52939
53266
|
import path5 from "node:path";
|
|
52940
53267
|
import { CleoError as CleoError8, getTaskAccessor as getTaskAccessor3 } from "@cleocode/core";
|
|
52941
|
-
import { getProjectRoot as
|
|
53268
|
+
import { getProjectRoot as getProjectRoot30 } from "@cleocode/core/internal";
|
|
52942
53269
|
function parseMarkdownValue(raw) {
|
|
52943
53270
|
const trimmed = raw.trim();
|
|
52944
53271
|
if (trimmed === "_(not present)_" || trimmed === "") return void 0;
|
|
@@ -53058,7 +53385,7 @@ var init_restore = __esm({
|
|
|
53058
53385
|
description: "Apply manually-resolved conflicts from .cleo/restore-conflicts.md"
|
|
53059
53386
|
},
|
|
53060
53387
|
async run() {
|
|
53061
|
-
const projectRoot =
|
|
53388
|
+
const projectRoot = getProjectRoot30();
|
|
53062
53389
|
const reportPath = path5.join(projectRoot, CLEO_DIR_NAME, RESTORE_CONFLICTS_MD);
|
|
53063
53390
|
if (!fs3.existsSync(reportPath)) {
|
|
53064
53391
|
humanLine("No pending restore conflicts. Nothing to finalize.");
|
|
@@ -55033,7 +55360,7 @@ var sequence_exports = {};
|
|
|
55033
55360
|
__export(sequence_exports, {
|
|
55034
55361
|
sequenceCommand: () => sequenceCommand
|
|
55035
55362
|
});
|
|
55036
|
-
import { getProjectRoot as
|
|
55363
|
+
import { getProjectRoot as getProjectRoot31 } from "@cleocode/core/internal";
|
|
55037
55364
|
var showCommand12, checkCommand6, repairCommand, sequenceCommand;
|
|
55038
55365
|
var init_sequence = __esm({
|
|
55039
55366
|
"packages/cleo/src/cli/commands/sequence.ts"() {
|
|
@@ -55069,7 +55396,7 @@ var init_sequence = __esm({
|
|
|
55069
55396
|
meta: { name: "repair", description: "Reset counter to max + 1 if behind" },
|
|
55070
55397
|
async run() {
|
|
55071
55398
|
const { repairSequence } = await import("@cleocode/core/internal");
|
|
55072
|
-
const projectRoot =
|
|
55399
|
+
const projectRoot = getProjectRoot31();
|
|
55073
55400
|
const repair = await repairSequence(projectRoot);
|
|
55074
55401
|
const result = {
|
|
55075
55402
|
repaired: repair.repaired,
|
|
@@ -55512,8 +55839,8 @@ var init_session4 = __esm({
|
|
|
55512
55839
|
"audit-scope": { type: "string", description: "Audit log scope (global|local)" }
|
|
55513
55840
|
},
|
|
55514
55841
|
async run({ args }) {
|
|
55515
|
-
const { detectSessionDrift, getProjectRoot:
|
|
55516
|
-
const projectRoot = await
|
|
55842
|
+
const { detectSessionDrift, getProjectRoot: getProjectRoot35 } = await import("@cleocode/core");
|
|
55843
|
+
const projectRoot = await getProjectRoot35();
|
|
55517
55844
|
const scope = args["audit-scope"] === "local" ? "local" : "global";
|
|
55518
55845
|
const report = await detectSessionDrift({ projectRoot, auditScope: scope });
|
|
55519
55846
|
cliOutput(report, { command: "session drift", operation: "session.drift" });
|
|
@@ -57021,7 +57348,7 @@ __export(token_exports, {
|
|
|
57021
57348
|
tokenCommand: () => tokenCommand
|
|
57022
57349
|
});
|
|
57023
57350
|
import { readFileSync as readFileSync15 } from "node:fs";
|
|
57024
|
-
import { getProjectRoot as
|
|
57351
|
+
import { getProjectRoot as getProjectRoot32, measureTokenExchange, recordTokenExchange as recordTokenExchange2 } from "@cleocode/core/internal";
|
|
57025
57352
|
function readPayload(args, textKey, fileKey) {
|
|
57026
57353
|
const text = args[textKey];
|
|
57027
57354
|
const file = args[fileKey];
|
|
@@ -57185,7 +57512,7 @@ var init_token = __esm({
|
|
|
57185
57512
|
domain: args.domain,
|
|
57186
57513
|
operation: args.operation
|
|
57187
57514
|
};
|
|
57188
|
-
const result = args.record ? await recordTokenExchange2(
|
|
57515
|
+
const result = args.record ? await recordTokenExchange2(getProjectRoot32(), input) : await measureTokenExchange(input);
|
|
57189
57516
|
cliOutput(result, {
|
|
57190
57517
|
command: "token",
|
|
57191
57518
|
operation: args.record ? "admin.token.record" : "token.estimate"
|
|
@@ -57221,7 +57548,7 @@ __export(transcript_exports, {
|
|
|
57221
57548
|
});
|
|
57222
57549
|
import { homedir as homedir8 } from "node:os";
|
|
57223
57550
|
import { join as join23 } from "node:path";
|
|
57224
|
-
import { getProjectRoot as
|
|
57551
|
+
import { getProjectRoot as getProjectRoot33 } from "@cleocode/core";
|
|
57225
57552
|
import {
|
|
57226
57553
|
parseDurationMs,
|
|
57227
57554
|
pruneTranscripts,
|
|
@@ -57251,7 +57578,7 @@ var init_transcript = __esm({
|
|
|
57251
57578
|
async run({ args }) {
|
|
57252
57579
|
if (args.pending) {
|
|
57253
57580
|
try {
|
|
57254
|
-
const projectRoot =
|
|
57581
|
+
const projectRoot = getProjectRoot33();
|
|
57255
57582
|
const { scanPendingTranscripts } = await import("@cleocode/core/memory/transcript-scanner.js");
|
|
57256
57583
|
const pending = await scanPendingTranscripts(projectRoot);
|
|
57257
57584
|
cliOutput(
|
|
@@ -57348,7 +57675,7 @@ var init_transcript = __esm({
|
|
|
57348
57675
|
async run({ args }) {
|
|
57349
57676
|
const tier = args.tier ?? "warm";
|
|
57350
57677
|
const dryRun = args["dry-run"] ?? false;
|
|
57351
|
-
const projectRoot =
|
|
57678
|
+
const projectRoot = getProjectRoot33();
|
|
57352
57679
|
try {
|
|
57353
57680
|
const { extractTranscript } = await import("@cleocode/core/memory/transcript-extractor.js");
|
|
57354
57681
|
const { findSessionTranscriptPath, listAllTranscripts } = await import("@cleocode/core/memory/transcript-scanner.js");
|
|
@@ -57460,7 +57787,7 @@ var init_transcript = __esm({
|
|
|
57460
57787
|
const dryRun = args["dry-run"] ?? false;
|
|
57461
57788
|
const olderThanHours = args["older-than-hours"] ? Number.parseInt(args["older-than-hours"], 10) : 24;
|
|
57462
57789
|
const limit = args.limit ? Number.parseInt(args.limit, 10) : void 0;
|
|
57463
|
-
const projectRoot =
|
|
57790
|
+
const projectRoot = getProjectRoot33();
|
|
57464
57791
|
try {
|
|
57465
57792
|
const { extractTranscript } = await import("@cleocode/core/memory/transcript-extractor.js");
|
|
57466
57793
|
const { listAllTranscripts } = await import("@cleocode/core/memory/transcript-scanner.js");
|
|
@@ -58062,7 +58389,7 @@ import { resolve as resolve6 } from "node:path";
|
|
|
58062
58389
|
import {
|
|
58063
58390
|
backfillAllPendingVerifiers,
|
|
58064
58391
|
backfillVerifier,
|
|
58065
|
-
getProjectRoot as
|
|
58392
|
+
getProjectRoot as getProjectRoot34,
|
|
58066
58393
|
resolveVerifierScript as resolveVerifierScript2,
|
|
58067
58394
|
runVerifier
|
|
58068
58395
|
} from "@cleocode/core";
|
|
@@ -58159,7 +58486,7 @@ var init_verify = __esm({
|
|
|
58159
58486
|
}
|
|
58160
58487
|
},
|
|
58161
58488
|
async run({ args, cmd }) {
|
|
58162
|
-
const projectRoot =
|
|
58489
|
+
const projectRoot = getProjectRoot34();
|
|
58163
58490
|
const force = !!args.force;
|
|
58164
58491
|
if (args["all-pending"]) {
|
|
58165
58492
|
await runBackfillAll(projectRoot, force);
|
|
@@ -58229,7 +58556,7 @@ var init_verify = __esm({
|
|
|
58229
58556
|
const taskIdArg = remainingArgs.find((a) => !a.startsWith("-"));
|
|
58230
58557
|
const allPending = remainingArgs.includes("--all-pending");
|
|
58231
58558
|
const force = remainingArgs.includes("--force");
|
|
58232
|
-
const projectRoot =
|
|
58559
|
+
const projectRoot = getProjectRoot34();
|
|
58233
58560
|
if (allPending) {
|
|
58234
58561
|
await runBackfillAll(projectRoot, force);
|
|
58235
58562
|
} else if (taskIdArg) {
|
|
@@ -59064,6 +59391,12 @@ var COMMAND_MANIFEST = [
|
|
|
59064
59391
|
description: "List tasks with optional filters",
|
|
59065
59392
|
load: async () => (await Promise.resolve().then(() => (init_list(), list_exports))).listCommand
|
|
59066
59393
|
},
|
|
59394
|
+
{
|
|
59395
|
+
exportName: "costCommand",
|
|
59396
|
+
name: "cost",
|
|
59397
|
+
description: "Compute cumulative USD cost for an LLM session from recorded token_usage entries. ",
|
|
59398
|
+
load: async () => (await Promise.resolve().then(() => (init_llm_cost(), llm_cost_exports))).costCommand
|
|
59399
|
+
},
|
|
59067
59400
|
{
|
|
59068
59401
|
exportName: "llmCommand",
|
|
59069
59402
|
name: "llm",
|
|
@@ -59837,7 +60170,7 @@ async function runStartupMaintenance() {
|
|
|
59837
60170
|
detectAndRemoveStrayProjectNexus,
|
|
59838
60171
|
getGlobalSalt,
|
|
59839
60172
|
getLogger: getLogger17,
|
|
59840
|
-
getProjectRoot:
|
|
60173
|
+
getProjectRoot: getProjectRoot35,
|
|
59841
60174
|
isCleanupMarkerSet,
|
|
59842
60175
|
migrateSignaldockToConduit,
|
|
59843
60176
|
needsSignaldockToConduitMigration,
|
|
@@ -59846,7 +60179,7 @@ async function runStartupMaintenance() {
|
|
|
59846
60179
|
} = await import("@cleocode/core/internal");
|
|
59847
60180
|
let projectRootForCleanup = "";
|
|
59848
60181
|
try {
|
|
59849
|
-
projectRootForCleanup =
|
|
60182
|
+
projectRootForCleanup = getProjectRoot35();
|
|
59850
60183
|
} catch {
|
|
59851
60184
|
}
|
|
59852
60185
|
if (!isCleanupMarkerSet(CLI_VERSION, projectRootForCleanup)) {
|
|
@@ -59866,7 +60199,7 @@ async function runStartupMaintenance() {
|
|
|
59866
60199
|
const isInitInvocation = process.argv.slice(2).some((a) => a === "init");
|
|
59867
60200
|
if (!isInitInvocation) {
|
|
59868
60201
|
try {
|
|
59869
|
-
const _projectRootForMigration =
|
|
60202
|
+
const _projectRootForMigration = getProjectRoot35();
|
|
59870
60203
|
if (needsSignaldockToConduitMigration(_projectRootForMigration)) {
|
|
59871
60204
|
const migrationResult = migrateSignaldockToConduit(_projectRootForMigration);
|
|
59872
60205
|
if (migrationResult.status === "failed") {
|