chainlesschain 0.162.42 → 0.162.43

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (150) hide show
  1. package/package.json +1 -1
  2. package/src/assets/web-panel/assets/{AIOps-Dsw5p7A7.js → AIOps-B0VFIcg3.js} +1 -1
  3. package/src/assets/web-panel/assets/{ActionButton-sk89dGuT.js → ActionButton-V20enLcA.js} +1 -1
  4. package/src/assets/web-panel/assets/{Analytics-kd8hzeK3.js → Analytics-DndClUmA.js} +3 -3
  5. package/src/assets/web-panel/assets/{AppLayout-CxlLp7J8.js → AppLayout-D2rOhyu6.js} +5 -5
  6. package/src/assets/web-panel/assets/{Audit-CQnGmRxA.js → Audit-DqfIKxsM.js} +1 -1
  7. package/src/assets/web-panel/assets/{Backup-BioBFWVV.js → Backup-Cuqlers6.js} +1 -1
  8. package/src/assets/web-panel/assets/{BaseInput-DiYG1n7T.js → BaseInput-C5hGNJ5N.js} +1 -1
  9. package/src/assets/web-panel/assets/{Chat-BBuQf6VM.js → Chat-jbQSEg4t.js} +6 -6
  10. package/src/assets/web-panel/assets/{ChatBubbleRenderer-BwgFmlRu.js → ChatBubbleRenderer-43u4DJn6.js} +1 -1
  11. package/src/assets/web-panel/assets/{Checkbox-B-9WwFTA.js → Checkbox-DbUBGgg0.js} +1 -1
  12. package/src/assets/web-panel/assets/{Codegen-DCkpThQa.js → Codegen-B99Mk_oQ.js} +1 -1
  13. package/src/assets/web-panel/assets/{Col-BowFdito.js → Col-Uxc3P9FF.js} +1 -1
  14. package/src/assets/web-panel/assets/{Community-BWGa92rE.js → Community-CCCVsol2.js} +1 -1
  15. package/src/assets/web-panel/assets/{Compact-CqJYYK0v.js → Compact-DpVZkM4n.js} +1 -1
  16. package/src/assets/web-panel/assets/{Compliance-DiFqpJrM.js → Compliance-CZic_otw.js} +1 -1
  17. package/src/assets/web-panel/assets/{Cowork-qZNWcSQ9.js → Cowork-mfrcXT5E.js} +3 -3
  18. package/src/assets/web-panel/assets/{Cron-BK70XYci.js → Cron-DZgYJquv.js} +2 -2
  19. package/src/assets/web-panel/assets/{Crosschain-DoM9N2kO.js → Crosschain-CsJE5KNs.js} +1 -1
  20. package/src/assets/web-panel/assets/{DID-B1F1RhQr.js → DID-DhzhW9OD.js} +2 -2
  21. package/src/assets/web-panel/assets/{Dashboard-CmDxx07G.js → Dashboard-wRXP3tMC.js} +2 -2
  22. package/src/assets/web-panel/assets/{Dropdown-5GRByJY9.js → Dropdown-B-J3c7n7.js} +1 -1
  23. package/src/assets/web-panel/assets/{EmailListRenderer-CyNgNjLG.js → EmailListRenderer-sNbeZPLo.js} +1 -1
  24. package/src/assets/web-panel/assets/{FamilyGuardDashboard-Jwg-Wuye.js → FamilyGuardDashboard-CzfFKArY.js} +1 -1
  25. package/src/assets/web-panel/assets/{Federation-BQvoY2_5.js → Federation-DYehIJb9.js} +1 -1
  26. package/src/assets/web-panel/assets/{FormItemContext-DKy8Zatd.js → FormItemContext-DpDqU3yC.js} +1 -1
  27. package/src/assets/web-panel/assets/{GenericCardRenderer-n7VGwZNh.js → GenericCardRenderer-MSm4ZBE2.js} +1 -1
  28. package/src/assets/web-panel/assets/{Git-CFCUe_so.js → Git-CJJpll9b.js} +2 -2
  29. package/src/assets/web-panel/assets/{Governance-DuZbRElA.js → Governance-D93XtWte.js} +1 -1
  30. package/src/assets/web-panel/assets/{Inference-DSEsBonV.js → Inference-8fZkwWyg.js} +1 -1
  31. package/src/assets/web-panel/assets/{KnowledgeGraph-DQoaeSnN.js → KnowledgeGraph-BbbI-D3L.js} +1 -1
  32. package/src/assets/web-panel/assets/Logs-B6n1Hcn8.js +2 -0
  33. package/src/assets/web-panel/assets/{Marketplace--gDqWnX8.js → Marketplace-B92T5ZT1.js} +1 -1
  34. package/src/assets/web-panel/assets/{McpTools-btiDEQ_G.js → McpTools-DKddzSA8.js} +5 -5
  35. package/src/assets/web-panel/assets/{Memory-CYrqC903.js → Memory-CAHamDmS.js} +2 -2
  36. package/src/assets/web-panel/assets/{MobileBridge-CktV5fRJ.js → MobileBridge-BTPLGA6_.js} +3 -3
  37. package/src/assets/web-panel/assets/{MobileProjects-CTVZQD7g.js → MobileProjects-DvGxl7Bd.js} +1 -1
  38. package/src/assets/web-panel/assets/{Mtc-CRq5Ir7q.js → Mtc-BGm92GtT.js} +4 -4
  39. package/src/assets/web-panel/assets/{MtcAudit-HvY-N0XZ.js → MtcAudit-CL6I9XX4.js} +2 -2
  40. package/src/assets/web-panel/assets/{Multisig-CWmUSW7g.js → Multisig-BYQujNg6.js} +3 -3
  41. package/src/assets/web-panel/assets/{NLProgramming-BUwhn6xG.js → NLProgramming-x4DYENrx.js} +1 -1
  42. package/src/assets/web-panel/assets/{Notes-BI8NqNSW.js → Notes-DyW_mhF0.js} +4 -4
  43. package/src/assets/web-panel/assets/{NotificationSettings-DVa8gbo1.js → NotificationSettings-CgeAblV8.js} +1 -1
  44. package/src/assets/web-panel/assets/{OrderTableRenderer-XNEr64wi.js → OrderTableRenderer-COT7rmDe.js} +1 -1
  45. package/src/assets/web-panel/assets/{Organization-a0imltNQ.js → Organization-Pm-XRWB1.js} +4 -4
  46. package/src/assets/web-panel/assets/{Overflow-DJ2P1mNg.js → Overflow-Batydsoy.js} +1 -1
  47. package/src/assets/web-panel/assets/{P2P-pRJPEJ7a.js → P2P-qwLlvxlM.js} +2 -2
  48. package/src/assets/web-panel/assets/{PdhVaultBrowser-eJa8vkF5.js → PdhVaultBrowser-CYvPhc0M.js} +5 -5
  49. package/src/assets/web-panel/assets/{Permissions-fxa21qzR.js → Permissions-gRGKScdi.js} +4 -4
  50. package/src/assets/web-panel/assets/{PersonalDataHub-C3JggyPn.js → PersonalDataHub-Bob9qL_z.js} +2 -2
  51. package/src/assets/web-panel/assets/{Pipeline-iR9fwke0.js → Pipeline-DvP3SdFD.js} +1 -1
  52. package/src/assets/web-panel/assets/{Privacy-oBf4gwv0.js → Privacy-B-c--IOb.js} +1 -1
  53. package/src/assets/web-panel/assets/{ProjectInit-DZU2PVgs.js → ProjectInit-UYJYk1VO.js} +2 -2
  54. package/src/assets/web-panel/assets/{ProjectSettings-amcXcSet.js → ProjectSettings--euwin_I.js} +2 -2
  55. package/src/assets/web-panel/assets/{Projects-QoksY3-i.js → Projects-2xn0tfJt.js} +1 -1
  56. package/src/assets/web-panel/assets/{Providers-uquz_5KZ.js → Providers-Bgq2bGTl.js} +1 -1
  57. package/src/assets/web-panel/assets/{QuickAsk-Wxx-iIH9.js → QuickAsk-Ck0iiQiv.js} +1 -1
  58. package/src/assets/web-panel/assets/{Recommend-CD8OJGJF.js → Recommend-CuW6xeEE.js} +1 -1
  59. package/src/assets/web-panel/assets/{Reputation-BuJMHfco.js → Reputation-JiNIQHms.js} +1 -1
  60. package/src/assets/web-panel/assets/{Row-DvfqASM7.js → Row-BCudZU5T.js} +1 -1
  61. package/src/assets/web-panel/assets/{RssFeed-TGSmYgmV.js → RssFeed-CH0VQaou.js} +3 -3
  62. package/src/assets/web-panel/assets/{Search-ndSDi33l.js → Search-CJjlSa50.js} +1 -1
  63. package/src/assets/web-panel/assets/{Security-CL1FLyzy.js → Security-B8Cf8rVb.js} +3 -3
  64. package/src/assets/web-panel/assets/{Services--AeNKFrY.js → Services-BocEJ7ad.js} +2 -2
  65. package/src/assets/web-panel/assets/{Skeleton-CMllAeqY.js → Skeleton-DpI6YIya.js} +1 -1
  66. package/src/assets/web-panel/assets/{Skills-DD29bVTm.js → Skills-C2lt0BNa.js} +1 -1
  67. package/src/assets/web-panel/assets/{Sla-DU_Mdrad.js → Sla-BxSG8zOp.js} +1 -1
  68. package/src/assets/web-panel/assets/{SpeechSettings-Cu0ncgI_.js → SpeechSettings-DzOejchn.js} +1 -1
  69. package/src/assets/web-panel/assets/{SyncSettings-Bfk00Eb9.js → SyncSettings-CgKxL89k.js} +2 -2
  70. package/src/assets/web-panel/assets/{Tasks-C-2V1COO.js → Tasks-CYDrs0ND.js} +1 -1
  71. package/src/assets/web-panel/assets/{Templates-CWO4Aw1l.js → Templates-CRIQTXNH.js} +1 -1
  72. package/src/assets/web-panel/assets/{Tenant-BnDkNC6u.js → Tenant-DC4HO1F6.js} +1 -1
  73. package/src/assets/web-panel/assets/{Terminal-VR0JLDdw.js → Terminal-CqMZJzEh.js} +2 -2
  74. package/src/assets/web-panel/assets/{TimelineRenderer-DMjbfev0.js → TimelineRenderer-D-TTq2sh.js} +1 -1
  75. package/src/assets/web-panel/assets/{Tokens-j1ZGEgBP.js → Tokens-NUv03cX9.js} +1 -1
  76. package/src/assets/web-panel/assets/{Trigger-BKVNLlOB.js → Trigger-X-FBeIBO.js} +1 -1
  77. package/src/assets/web-panel/assets/{Trust-Bbfv8AJr.js → Trust-BFd9yV9d.js} +1 -1
  78. package/src/assets/web-panel/assets/{UkeySign-C0_Gllsu.js → UkeySign-BVJ0bGzq.js} +1 -1
  79. package/src/assets/web-panel/assets/{VideoEditing-CE__3Owf.js → VideoEditing-C3Q7lvPF.js} +1 -1
  80. package/src/assets/web-panel/assets/{Wallet-Cjzavume.js → Wallet-Doxo0C8S.js} +4 -4
  81. package/src/assets/web-panel/assets/{WebAuthn-KbjxueWc.js → WebAuthn-DveIKeGo.js} +4 -4
  82. package/src/assets/web-panel/assets/{WorkflowEditor-Bz7UuLhK.js → WorkflowEditor-CTzSNXfX.js} +1 -1
  83. package/src/assets/web-panel/assets/{chat-BrSAQ_Gd.js → chat-eQ6OL2Nl.js} +1 -1
  84. package/src/assets/web-panel/assets/{colors-Bn8oqI93.js → colors-B7NzPMJ1.js} +1 -1
  85. package/src/assets/web-panel/assets/{compact-item-jxrLqj8Q.js → compact-item-DA8_yifp.js} +1 -1
  86. package/src/assets/web-panel/assets/{createContext-B0uxIvgB.js → createContext-CAdn_TqD.js} +1 -1
  87. package/src/assets/web-panel/assets/devWarning-UBrKMao4.js +1 -0
  88. package/src/assets/web-panel/assets/{hasIn-BFsfry47.js → hasIn-ko4B6kih.js} +1 -1
  89. package/src/assets/web-panel/assets/{index-CireH7ze.js → index-B0I9Q9uH.js} +1 -1
  90. package/src/assets/web-panel/assets/{index-vma7bVdQ.js → index-B6M0zm0k.js} +1 -1
  91. package/src/assets/web-panel/assets/{index-Bd-zsWvY.js → index-BBIQJRlz.js} +1 -1
  92. package/src/assets/web-panel/assets/{index-CAIdm73g.js → index-BBq7mqhI.js} +1 -1
  93. package/src/assets/web-panel/assets/{index-DmD-qtjF.js → index-BKAgTgeT.js} +1 -1
  94. package/src/assets/web-panel/assets/{index-DteDdzDQ.js → index-BNt9GIgX.js} +1 -1
  95. package/src/assets/web-panel/assets/{index-CCVF9irI.js → index-BX1VHvqW.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-BY4oOQaA.js → index-B_sjoYmu.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-BQvlv_iE.js → index-Bb6JBiCG.js} +1 -1
  98. package/src/assets/web-panel/assets/index-BcOtgvfX.js +1 -0
  99. package/src/assets/web-panel/assets/{index-DMPQqeLb.js → index-C2qPPvCv.js} +3 -3
  100. package/src/assets/web-panel/assets/{index-B9ZDJUc0.js → index-CDweqnrF.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-9iuxVwRC.js → index-CJY-yrWh.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-DdjhDnIk.js → index-CgcRhqah.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-DcHQBw3b.js → index-CloqX2ad.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-_fgTMPd1.js → index-Co5moC1M.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-DOJYoYG7.js → index-CqNS5nZH.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-BRkK0yoO.js → index-CzerRnMr.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-Crqzhccj.js → index-D38_8grM.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-CovEs7is.js → index-D4yrKz8e.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-C7q_gApa.js → index-DGCgSG2a.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-BiXyJmcf.js → index-DLn-aR4t.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-BPpGWBAU.js → index-DMGbCVXZ.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-DeHd8uSh.js → index-DQ-4d9yy.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-LLFwwG0R.js → index-DZ0Dd5mp.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-E6sYKDbw.js → index-DmEcUTX3.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-Bk_Tv7Ey.js → index-Dnz_7pqU.js} +1 -1
  116. package/src/assets/web-panel/assets/index-DogBvgW2.js +1 -0
  117. package/src/assets/web-panel/assets/{index-pMVcl-a3.js → index-Dq_DwzU4.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-C6AmzUjG.js → index-DyfLqass.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-CZ8gyTGc.js → index-N7_jPRVy.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-D1WrY_4z.js → index-aClwSoZt.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-CR3QNisI.js → index-b2I5q4bm.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-D08W2YxD.js → index-dMx6z8Kk.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-DSDgBgrL.js → index-dhQxLUnV.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-DjxJSCB8.js → index-ku6l6unx.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-xRD9Fctn.js → index-llKEnU9Q.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-BQZsB8nt.js → index-snb01c99.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-BzZfG8Ft.js → index-v8QteGiY.js} +1 -1
  128. package/src/assets/web-panel/assets/{initDefaultProps-AKS5cCeZ.js → initDefaultProps-BE1YKWp0.js} +1 -1
  129. package/src/assets/web-panel/assets/{motion-SDjWiFhF.js → motion-B4Pkg4rs.js} +1 -1
  130. package/src/assets/web-panel/assets/{move-LEZnOtYR.js → move-DbLtadAv.js} +1 -1
  131. package/src/assets/web-panel/assets/{omit-DhLBVNzX.js → omit-Dn52nvgx.js} +1 -1
  132. package/src/assets/web-panel/assets/{pickAttrs-DdVSELea.js → pickAttrs-D4B5N6WV.js} +1 -1
  133. package/src/assets/web-panel/assets/{placementArrow-BaEGCCq9.js → placementArrow-CKSjiqCc.js} +1 -1
  134. package/src/assets/web-panel/assets/{responsiveObserve-DV6XM19W.js → responsiveObserve-g5NpHuRh.js} +1 -1
  135. package/src/assets/web-panel/assets/{slide-BOUnaBay.js → slide-WYVY3fl7.js} +1 -1
  136. package/src/assets/web-panel/assets/{statusUtils-BAaMQ0VA.js → statusUtils-YAkHF6HM.js} +1 -1
  137. package/src/assets/web-panel/assets/{styleChecker-CsoP0nmm.js → styleChecker-Cv_nVk4H.js} +1 -1
  138. package/src/assets/web-panel/assets/{useFlexGapSupport-t20RbINy.js → useFlexGapSupport-D1JaeNmU.js} +1 -1
  139. package/src/assets/web-panel/assets/{useFs-DH_Emn7A.js → useFs-DYfXeCVm.js} +1 -1
  140. package/src/assets/web-panel/assets/{usePersonalDataHub-CeYW427U.js → usePersonalDataHub-DdtPxV0b.js} +1 -1
  141. package/src/assets/web-panel/assets/{vnode-CX5gGmGb.js → vnode-nFZXhzTF.js} +1 -1
  142. package/src/assets/web-panel/assets/{zoom-CofyY9oD.js → zoom-CmyXMc6s.js} +1 -1
  143. package/src/assets/web-panel/index.html +1 -1
  144. package/src/commands/agent.js +66 -51
  145. package/src/lib/llm-config-defaults.js +31 -0
  146. package/src/runtime/headless-stream.js +109 -0
  147. package/src/assets/web-panel/assets/Logs-u7UMHPnz.js +0 -2
  148. package/src/assets/web-panel/assets/devWarning-rqonNzey.js +0 -1
  149. package/src/assets/web-panel/assets/index-BI1fCgPX.js +0 -1
  150. package/src/assets/web-panel/assets/index-D8iCZ8gl.js +0 -1
@@ -385,6 +385,22 @@ export function registerAgentCommand(program) {
385
385
  llm: loadConfig().llm || {},
386
386
  });
387
387
 
388
+ // Config-default LLM (parity with cc ask/chat): a bare `cc agent` honors
389
+ // config.json `llm` (provider/model/baseUrl/apiKey) instead of silently
390
+ // assuming local ollama — this is what makes the editor chat panel work
391
+ // against a cloud-configured setup. Explicit --provider wins outright;
392
+ // the vision resolution above still overrides for --image runs. Applied
393
+ // AFTER resolveVisionLlm so config defaults don't masquerade as explicit
394
+ // flags there, and BEFORE every dispatch (headless/stream/REPL) since
395
+ // they all read options.provider/model/baseUrl/apiKey.
396
+ {
397
+ const { applyConfigLlmDefaults } =
398
+ await import("../lib/llm-config-defaults.js");
399
+ applyConfigLlmDefaults(options, loadConfig().llm || {}, {
400
+ explicitModel: explicitCliModel, // settings-file model must not ride
401
+ });
402
+ }
403
+
388
404
  // --think / --ultrathink → options.thinking for the agent loop (Anthropic
389
405
  // extended thinking; ignored by other providers). --think with no value →
390
406
  // true; --think <level> → that level; --ultrathink wins as "ultra".
@@ -510,55 +526,55 @@ export function registerAgentCommand(program) {
510
526
  ? parseInt(options.maxTurns, 10)
511
527
  : undefined;
512
528
  const headlessOptions = {
513
- prompt,
514
- images,
515
- model: visionLlm.model || options.model,
516
- thinking,
517
- thinkingBudget,
518
- provider: visionLlm.provider || options.provider,
519
- baseUrl: visionLlm.baseUrl || options.baseUrl,
520
- apiKey: visionLlm.apiKey || options.apiKey,
521
- sessionId: options.session,
522
- // A resolved --session/--continue/--resume id means "replay this
523
- // conversation and persist the new turns"; the runner loads prior
524
- // history when the id already exists and creates it otherwise.
525
- resume: options.session,
526
- outputFormat: options.outputFormat,
527
- permissionMode: options.permissionMode,
528
- allowedTools: parseToolList(options.allowedTools),
529
- disallowedTools: parseToolList(options.disallowedTools),
530
- additionalDirectories,
531
- autoCheckpoint: options.checkpoint === true,
532
- maxTurns,
533
- // commander maps --no-file-refs → options.fileRefs === false
534
- expandFileRefs: options.fileRefs !== false,
535
- // --system-prompt / --append-system-prompt (literal or @file)
536
- systemPrompt: resolvePromptText(options.systemPrompt, {
537
- cwd: process.cwd(),
538
- }),
539
- appendSystemPrompt: resolvePromptText(options.appendSystemPrompt, {
540
- cwd: process.cwd(),
541
- }),
542
- // --include-partial-messages: live token deltas as stream_event lines
543
- includePartialMessages: options.includePartialMessages === true,
544
- // --goal [id]: bind a cc goal into the run (Phase 1)
545
- goal: options.goal,
546
- // --goal-assess: run-end LLM progress assessment (Phase 2)
547
- goalAssess: options.goalAssess === true,
548
- // --mcp-config: connect ad-hoc MCP servers + expose their tools
549
- mcpConfig: options.mcpConfig || null,
550
- // --no-mcp: skip registered (cc mcp add) auto-connect servers
551
- useRegisteredMcp: options.mcp !== false,
552
- // --ide / --no-ide: auto-connect a running editor's MCP bridge
553
- ide: options.ide,
529
+ prompt,
530
+ images,
531
+ model: visionLlm.model || options.model,
532
+ thinking,
533
+ thinkingBudget,
534
+ provider: visionLlm.provider || options.provider,
535
+ baseUrl: visionLlm.baseUrl || options.baseUrl,
536
+ apiKey: visionLlm.apiKey || options.apiKey,
537
+ sessionId: options.session,
538
+ // A resolved --session/--continue/--resume id means "replay this
539
+ // conversation and persist the new turns"; the runner loads prior
540
+ // history when the id already exists and creates it otherwise.
541
+ resume: options.session,
542
+ outputFormat: options.outputFormat,
543
+ permissionMode: options.permissionMode,
544
+ allowedTools: parseToolList(options.allowedTools),
545
+ disallowedTools: parseToolList(options.disallowedTools),
546
+ additionalDirectories,
547
+ autoCheckpoint: options.checkpoint === true,
548
+ maxTurns,
549
+ // commander maps --no-file-refs → options.fileRefs === false
550
+ expandFileRefs: options.fileRefs !== false,
551
+ // --system-prompt / --append-system-prompt (literal or @file)
552
+ systemPrompt: resolvePromptText(options.systemPrompt, {
554
553
  cwd: process.cwd(),
555
- // --permission-prompt-tool: defer approvals to an MCP tool
556
- permissionPromptTool: options.permissionPromptTool || null,
557
- // --settings: extra .claude/settings.json permission rules
558
- settingsFile: options.settings || null,
559
- outputStyle: options.outputStyle || null,
560
- // --fallback-model: retry once on a backup model on transient errors
561
- chatFn: fallbackChatFn,
554
+ }),
555
+ appendSystemPrompt: resolvePromptText(options.appendSystemPrompt, {
556
+ cwd: process.cwd(),
557
+ }),
558
+ // --include-partial-messages: live token deltas as stream_event lines
559
+ includePartialMessages: options.includePartialMessages === true,
560
+ // --goal [id]: bind a cc goal into the run (Phase 1)
561
+ goal: options.goal,
562
+ // --goal-assess: run-end LLM progress assessment (Phase 2)
563
+ goalAssess: options.goalAssess === true,
564
+ // --mcp-config: connect ad-hoc MCP servers + expose their tools
565
+ mcpConfig: options.mcpConfig || null,
566
+ // --no-mcp: skip registered (cc mcp add) auto-connect servers
567
+ useRegisteredMcp: options.mcp !== false,
568
+ // --ide / --no-ide: auto-connect a running editor's MCP bridge
569
+ ide: options.ide,
570
+ cwd: process.cwd(),
571
+ // --permission-prompt-tool: defer approvals to an MCP tool
572
+ permissionPromptTool: options.permissionPromptTool || null,
573
+ // --settings: extra .claude/settings.json permission rules
574
+ settingsFile: options.settings || null,
575
+ outputStyle: options.outputStyle || null,
576
+ // --fallback-model: retry once on a backup model on transient errors
577
+ chatFn: fallbackChatFn,
562
578
  };
563
579
 
564
580
  // --json-schema: structured output — wrap the runner with capture +
@@ -573,9 +589,8 @@ export function registerAgentCommand(program) {
573
589
  process.exit(1);
574
590
  }
575
591
  try {
576
- const { runJsonSchemaConstrained } = await import(
577
- "../lib/json-schema-output.js"
578
- );
592
+ const { runJsonSchemaConstrained } =
593
+ await import("../lib/json-schema-output.js");
579
594
  const code = await runJsonSchemaConstrained({
580
595
  schemaFile: options.jsonSchema,
581
596
  baseOptions: headlessOptions,
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Config-default LLM resolution for `cc agent` (parity with `cc ask`/`chat`):
3
+ * a bare run honors `~/.chainlesschain/config.json` `llm` —
4
+ * provider/model/baseUrl/apiKey — instead of silently assuming local ollama
5
+ * (the historical default that broke every cloud-configured setup the moment
6
+ * no --provider flag was passed, e.g. the editor chat panel's spawn).
7
+ *
8
+ * Rules (pure; mutates and returns `options` for call-site convenience):
9
+ * - An explicit --provider wins outright: config is NOT consulted at all
10
+ * (mixing config's model/key into a different provider would be wrong).
11
+ * - With no --provider but a configured one: provider + any of
12
+ * model/baseUrl/apiKey the user did not explicitly set come from config.
13
+ * - Model pairing: when the provider is adopted from config, the model must
14
+ * pair with it — only an EXPLICIT --model (opts.explicitModel) survives;
15
+ * a model that leaked in from .claude/settings.json (meant for whatever
16
+ * provider that file assumed) is replaced by config's own model. Same
17
+ * lesson as the --settings "opus"→404 vision trap.
18
+ * - No configured provider → unchanged (runner defaults apply: ollama).
19
+ */
20
+ export function applyConfigLlmDefaults(options = {}, cfgLlm = {}, opts = {}) {
21
+ if (options.provider || !cfgLlm.provider) return options;
22
+ options.provider = cfgLlm.provider;
23
+ if (opts.explicitModel) {
24
+ options.model = opts.explicitModel;
25
+ } else if (cfgLlm.model) {
26
+ options.model = cfgLlm.model;
27
+ }
28
+ if (!options.baseUrl && cfgLlm.baseUrl) options.baseUrl = cfgLlm.baseUrl;
29
+ if (!options.apiKey && cfgLlm.apiKey) options.apiKey = cfgLlm.apiKey;
30
+ return options;
31
+ }
@@ -37,6 +37,33 @@ import {
37
37
  rebuildMessages as jsonlRebuildMessages,
38
38
  sessionExists as jsonlSessionExists,
39
39
  } from "../harness/jsonl-session-store.js";
40
+ import { getPlanModeManager } from "../lib/plan-mode.js";
41
+
42
+ /**
43
+ * Structured view of the global plan-mode state for `plan_update` events
44
+ * (the chat panel renders its plan card from this). Pure read; never throws.
45
+ */
46
+ export function planSnapshot(pm) {
47
+ let items = [];
48
+ let risk = null;
49
+ try {
50
+ const plan = pm.currentPlan;
51
+ items = (plan?.items || []).map((i) => ({
52
+ id: i.id,
53
+ title: i.title,
54
+ tool: i.tool,
55
+ impact: i.estimatedImpact || "low",
56
+ status: i.status,
57
+ }));
58
+ if (items.length > 0) {
59
+ const r = pm.getRiskAssessment();
60
+ if (r) risk = { level: r.level, totalScore: r.totalScore };
61
+ }
62
+ } catch {
63
+ /* snapshot is best-effort */
64
+ }
65
+ return { active: pm.isActive(), state: pm.state || null, items, risk };
66
+ }
40
67
  import { withQuietStdout } from "./quiet-stdout.js";
41
68
 
42
69
  /**
@@ -51,6 +78,12 @@ export function parseInputEvent(line) {
51
78
  } catch {
52
79
  return { error: `invalid JSON line: ${trimmed.slice(0, 80)}` };
53
80
  }
81
+ // Plan-mode control events (chat-panel plan UI):
82
+ // {"type":"plan","action":"enter"|"approve"|"reject"}
83
+ if (obj && typeof obj === "object" && obj.type === "plan") {
84
+ const action = String(obj.action || "").toLowerCase();
85
+ return action ? { plan: action } : null;
86
+ }
54
87
  const msg = obj && typeof obj === "object" ? obj.message || obj : {};
55
88
  let content = msg.content ?? obj.text ?? obj.prompt;
56
89
  if (Array.isArray(content)) {
@@ -455,6 +488,69 @@ export async function runAgentHeadlessStream(options = {}, deps = {}) {
455
488
  continue;
456
489
  }
457
490
 
491
+ // Plan-mode control events (chat-panel plan UI). Mirrors the REPL's
492
+ // /plan verbs: enter blocks write tools (blocked calls become plan items),
493
+ // approve unlocks them and IMMEDIATELY runs a continuation turn, reject
494
+ // exits plan mode. Every control answers with a `plan_update` event.
495
+ if (parsed.plan) {
496
+ const pm = getPlanModeManager();
497
+ if (parsed.plan === "enter") {
498
+ if (!pm.isActive()) {
499
+ pm.enterPlanMode({ title: "Agent Plan" });
500
+ messages.push({
501
+ role: "system",
502
+ content:
503
+ "[PLAN MODE ACTIVE] You are now in plan mode. You can read " +
504
+ "files, search, and analyze — but write/execute tools are " +
505
+ "blocked. Any blocked tool calls will be recorded as plan " +
506
+ "items. Analyze the task thoroughly, then the user will " +
507
+ "approve your plan.",
508
+ });
509
+ }
510
+ emit({
511
+ type: "plan_update",
512
+ ...planSnapshot(pm),
513
+ session_id: sessionId,
514
+ });
515
+ continue;
516
+ }
517
+ if (parsed.plan === "reject") {
518
+ if (pm.isActive()) pm.rejectPlan("User rejected");
519
+ emit({
520
+ type: "plan_update",
521
+ ...planSnapshot(pm),
522
+ session_id: sessionId,
523
+ });
524
+ continue;
525
+ }
526
+ if (parsed.plan === "approve") {
527
+ if (!pm.isActive() || !(pm.currentPlan?.items?.length > 0)) {
528
+ emit({
529
+ type: "plan_update",
530
+ ...planSnapshot(pm),
531
+ session_id: sessionId,
532
+ note: "nothing to approve",
533
+ });
534
+ continue;
535
+ }
536
+ pm.approvePlan();
537
+ messages.push({
538
+ role: "system",
539
+ content: `[PLAN APPROVED] The user has approved your plan with ${pm.currentPlan.items.length} items. You can now use all tools including write_file, edit_file, run_shell, and run_skill. Execute the plan items in order.`,
540
+ });
541
+ emit({
542
+ type: "plan_update",
543
+ ...planSnapshot(pm),
544
+ session_id: sessionId,
545
+ });
546
+ // Fall through into the normal turn machinery with a continuation
547
+ // prompt — the agent starts executing without an extra user message.
548
+ parsed.text = "Proceed with the approved plan.";
549
+ } else if (!parsed.text) {
550
+ continue; // unknown plan action — ignored
551
+ }
552
+ }
553
+
458
554
  // Per-turn iteration budget so one turn can't starve the rest.
459
555
  const budget = Number.isFinite(options.maxTurns)
460
556
  ? new IterationBudget({
@@ -565,6 +661,19 @@ export async function runAgentHeadlessStream(options = {}, deps = {}) {
565
661
  turn: turns,
566
662
  usage: outcome.usage,
567
663
  });
664
+
665
+ // While planning, blocked tool calls grew the plan during this turn —
666
+ // push the fresh snapshot so the panel's plan card stays live.
667
+ {
668
+ const pm = getPlanModeManager();
669
+ if (pm.isActive()) {
670
+ emit({
671
+ type: "plan_update",
672
+ ...planSnapshot(pm),
673
+ session_id: sessionId,
674
+ });
675
+ }
676
+ }
568
677
  }
569
678
 
570
679
  // Tear down ad-hoc MCP servers (--mcp-config) when stdin closes.
@@ -1,2 +0,0 @@
1
- import{I as s,J as g,U as d,c as n,K as _,V as k,S as W,R as S,F as K,Z as Q,w as M,n as C,o as R,b as T,r,P as p,Q as O,_ as U}from"./vendor-BvqAck49.js";import{_ as E,u as N}from"./index-DMPQqeLb.js";import{R as F}from"./icons-DP3uiYxy.js";const I={__name:"Logs",setup(V,{expose:a}){a();const x=N(),e=r("status"),y=r(!1),v=r(""),i=r(""),c=r(""),f=r(!0),o=r(null),h={status:"status",doctor:"doctor","skill-sources":"skill sources","llm-providers":"llm providers"},m=T(()=>i.value.split(`
2
- `)),b=T(()=>{if(!c.value)return m.value;const t=c.value.toLowerCase();return m.value.filter(u=>u.toLowerCase().includes(t))});function L(t){return t.includes("✖")||t.includes("error")||t.includes("Error")||t.includes("failed")?"line-error":t.includes("✔")||t.includes("✓")||t.includes("success")||t.includes("running")?"line-success":t.includes("warn")||t.includes("Warn")||t.includes("○")?"line-warn":t.startsWith(" ")||t.startsWith(" ")?"line-indent":""}function l(t){return t.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function w(t){if(!c.value)return t;const u=c.value.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return t.replace(new RegExp(`(${u})`,"gi"),"<mark>$1</mark>")}async function B(){y.value=!0,v.value="",i.value="";const t=h[e.value]||"status";try{const{output:u}=await x.execute(t,3e4);i.value=u,f.value&&(await C(),o.value&&(o.value.scrollTop=o.value.scrollHeight))}catch(u){v.value=`执行失败: ${u.message}`,i.value=v.value}finally{y.value=!1}}M(b,async()=>{f.value&&(await C(),o.value&&(o.value.scrollTop=o.value.scrollHeight))}),R(B);const H={ws:x,activeTab:e,loading:y,error:v,rawOutput:i,searchQuery:c,autoScroll:f,logContainer:o,TAB_COMMANDS:h,allLines:m,filteredLines:b,lineClass:L,escapeHtml:l,highlightSearch:w,loadLog:B,ref:r,computed:T,watch:M,nextTick:C,onMounted:R,get ReloadOutlined(){return F},get useWsStore(){return N}};return Object.defineProperty(H,"__isScriptSetup",{enumerable:!1,value:!0}),H}},j={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},q={style:{display:"flex",gap:"10px",margin:"12px 0"}},z={ref:"logContainer",class:"log-box"},A={key:0,style:{"text-align":"center",padding:"40px",color:"var(--text-muted)"}},D={key:1,style:{"text-align":"center",padding:"40px",color:"var(--text-muted)"}},P={key:2},Z=["innerHTML"];function J(V,a,x,e,y,v){const i=s("a-checkbox"),c=s("a-button"),f=s("a-space"),o=s("a-tab-pane"),h=s("a-tabs"),m=s("a-input-search"),b=s("a-tag"),L=s("a-spin");return p(),g("div",null,[d("div",j,[a[5]||(a[5]=d("div",null,[d("h2",{class:"page-title"},"日志查看"),d("p",{class:"page-sub"},"系统运行日志与诊断输出")],-1)),n(f,null,{default:_(()=>[n(i,{checked:e.autoScroll,"onUpdate:checked":a[0]||(a[0]=l=>e.autoScroll=l)},{default:_(()=>[...a[3]||(a[3]=[O("自动滚动",-1)])]),_:1},8,["checked"]),n(c,{type:"primary",ghost:"",loading:e.loading,onClick:e.loadLog},{icon:_(()=>[n(e.ReloadOutlined)]),default:_(()=>[a[4]||(a[4]=O(" 刷新 ",-1))]),_:1},8,["loading"])]),_:1})]),k(" Tab Selector "),n(h,{activeKey:e.activeTab,"onUpdate:activeKey":a[1]||(a[1]=l=>e.activeTab=l),onChange:e.loadLog,style:{"margin-bottom":"0"}},{default:_(()=>[n(o,{key:"status",tab:"系统状态"}),n(o,{key:"doctor",tab:"环境诊断"}),n(o,{key:"skill-sources",tab:"技能来源"}),n(o,{key:"llm-providers",tab:"LLM 提供商"})]),_:1},8,["activeKey"]),k(" Search Bar "),d("div",q,[n(m,{value:e.searchQuery,"onUpdate:value":a[2]||(a[2]=l=>e.searchQuery=l),placeholder:"搜索日志内容...","allow-clear":"",style:{flex:"1"}},null,8,["value"]),e.filteredLines.length!==e.allLines.length?(p(),W(b,{key:0,color:"blue"},{default:_(()=>[O(S(e.filteredLines.length)+" / "+S(e.allLines.length)+" 行 ",1)]),_:1})):k("v-if",!0)]),k(" Log Output "),d("div",z,[e.loading?(p(),g("div",A,[n(L,{size:"large"}),a[6]||(a[6]=d("div",{style:{"margin-top":"10px"}},"加载中...",-1))])):e.filteredLines.length?(p(),g("div",P,[(p(!0),g(K,null,Q(e.filteredLines,(l,w)=>(p(),g("div",{key:w,class:U(["log-line",e.lineClass(l)]),innerHTML:e.highlightSearch(e.escapeHtml(l))},null,10,Z))),128))])):(p(),g("div",D,S(e.error||"暂无日志内容,点击刷新加载"),1))],512)])}const $=E(I,[["render",J],["__scopeId","data-v-8c2906e0"],["__file","/tmp/cc-web-panel-Fa41ZI/repo/packages/web-panel/src/views/Logs.vue"]]);export{$ as default};
@@ -1 +0,0 @@
1
- import{O as r}from"./index-DMPQqeLb.js";const o=((n,a,e)=>{r(n,`[ant-design-vue: ${a}] ${e}`)});export{o as d};
@@ -1 +0,0 @@
1
- import{A as o}from"./Row-DvfqASM7.js";import{U as t}from"./index-DMPQqeLb.js";import"./vendor-BvqAck49.js";import"./responsiveObserve-DV6XM19W.js";import"./useFlexGapSupport-t20RbINy.js";import"./styleChecker-CsoP0nmm.js";import"./index-CR3QNisI.js";import"./icons-DP3uiYxy.js";const l=t(o);export{l as default};
@@ -1 +0,0 @@
1
- import{C as o}from"./Col-BowFdito.js";import{U as t}from"./index-DMPQqeLb.js";import"./vendor-BvqAck49.js";import"./index-CR3QNisI.js";import"./icons-DP3uiYxy.js";const s=t(o);export{s as default};