@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 CHANGED
@@ -24279,8 +24279,8 @@ async function loadPlaybookByName(name) {
24279
24279
  return null;
24280
24280
  }
24281
24281
  try {
24282
- const { getProjectRoot: getProjectRoot34 } = await import("@cleocode/core/internal");
24283
- const projectRoot = __playbookRuntimeOverrides.projectRoot ?? getProjectRoot34();
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: getProjectRoot34 } = await import("@cleocode/core/internal");
24328
- const projectRoot = getProjectRoot34();
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: getProjectRoot34 } = await import("@cleocode/core/internal");
24519
- projectRoot = getProjectRoot34();
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: getProjectRoot34 } = await import("@cleocode/core/internal");
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: getProjectRoot34()
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(getProjectRoot34) {
29499
+ function createSanitizer(getProjectRoot35) {
29500
29500
  return async (req, next) => {
29501
29501
  if (req.params) {
29502
29502
  try {
29503
- const root = getProjectRoot34 ? getProjectRoot34() : void 0;
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: getProjectRoot34 } = await import("@cleocode/core/internal");
34725
+ const { packBundle, getProjectRoot: getProjectRoot35 } = await import("@cleocode/core/internal");
34726
34726
  const includesProject = scope === "project" || scope === "all";
34727
- const projectRoot = includesProject ? getProjectRoot34() : void 0;
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 getProjectRoot26,
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 = getProjectRoot26();
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 = getProjectRoot26();
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 = getProjectRoot26();
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 = getProjectRoot26();
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 = getProjectRoot26();
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 = getProjectRoot26();
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 = getProjectRoot26();
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 = getProjectRoot26();
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 getProjectRoot27, migrateClaudeMem } from "@cleocode/core/internal";
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 = getProjectRoot27();
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 = getProjectRoot27();
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: getProjectRoot34 }, { eq: eq2 }] = await Promise.all([
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 getProjectRoot34;
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 getProjectRoot28 } from "@cleocode/core";
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 = getProjectRoot28();
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 getProjectRoot29 } from "@cleocode/core/internal";
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 = getProjectRoot29();
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 getProjectRoot30 } from "@cleocode/core/internal";
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 = getProjectRoot30();
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: getProjectRoot34 } = await import("@cleocode/core");
55516
- const projectRoot = await getProjectRoot34();
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 getProjectRoot31, measureTokenExchange, recordTokenExchange as recordTokenExchange2 } from "@cleocode/core/internal";
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(getProjectRoot31(), input) : await measureTokenExchange(input);
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 getProjectRoot32 } from "@cleocode/core";
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 = getProjectRoot32();
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 = getProjectRoot32();
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 = getProjectRoot32();
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 getProjectRoot33,
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 = getProjectRoot33();
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 = getProjectRoot33();
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: getProjectRoot34,
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 = getProjectRoot34();
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 = getProjectRoot34();
60202
+ const _projectRootForMigration = getProjectRoot35();
59870
60203
  if (needsSignaldockToConduitMigration(_projectRootForMigration)) {
59871
60204
  const migrationResult = migrateSignaldockToConduit(_projectRootForMigration);
59872
60205
  if (migrationResult.status === "failed") {