chainlesschain 0.162.184 → 0.162.186
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/bin/chainlesschain.js +21 -5
- package/package.json +1 -1
- package/src/assets/web-panel/.build-hash +1 -1
- package/src/assets/web-panel/assets/{AIOps-DzAl5fGx.js → AIOps-DTXiO-TB.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-DAHtMGeC.js → ActionButton-BbmDW-Pz.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-BHQaexv5.js → Analytics-CSfgXJuD.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-Phz_pD0n.js → AppLayout-BS0FFLb7.js} +4 -4
- package/src/assets/web-panel/assets/{Artifacts-DHt47kCA.js → Artifacts-B19WFPK2.js} +1 -1
- package/src/assets/web-panel/assets/{Audit--Y_8FULl.js → Audit-CQhZBi7n.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-N1zchH7D.js → BackgroundAgents-BOLZCpGH.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-B_BoyN30.js → Backup-Dz3R_ePD.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-Gl4uQHcT.js → BaseInput-CYfgMpax.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-Cg-eIyAZ.js → Chat-5CymMr1j.js} +5 -5
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-BzeUi3JH.js → ChatBubbleRenderer-B2A_TJtl.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-D0MGR2wA.js → Checkbox-CDXHVYcu.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-BdObJEFn.js → Codegen-uq9Z9oiS.js} +1 -1
- package/src/assets/web-panel/assets/{Col--ghxXT3z.js → Col-BuW1K_65.js} +1 -1
- package/src/assets/web-panel/assets/{Community-BUFeXOqz.js → Community-Bbg-PvRY.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-DhQO2_Mr.js → Compact-co0pPPTw.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-3HoTqKYd.js → Compliance-B-pFAv7z.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-B3zmO4VW.js → Cowork-54ZQS4gC.js} +3 -3
- package/src/assets/web-panel/assets/{Cron-CJDrZOcc.js → Cron-B1BF2Seq.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-SMl15obd.js → Crosschain-Dey6qQTj.js} +1 -1
- package/src/assets/web-panel/assets/{DID-CgTrTWrl.js → DID-ltERvfAj.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-dXFKaKol.js → Dashboard-DuWxOcqN.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-qQHEhCvI.js → Dropdown-CrZ8ekTo.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-C_ej0MWH.js → EmailListRenderer-fIyHXhUS.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-D6ajoE7I.js → FamilyGuardDashboard-BtRyrRPm.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-Cio2y49h.js → Federation-EUC6Wydj.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-ClJz1cYp.js → FormItemContext-BOpka2G-.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-Dr_8Maca.js → GenericCardRenderer-BXtrrYHn.js} +1 -1
- package/src/assets/web-panel/assets/{Git-CevLwp5u.js → Git-8WMb7PiR.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-CW9YyQUY.js → Governance-DNWOeDTV.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-CQqeAyER.js → Inference-Bne9b_Lb.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-cuGVxHrw.js → KnowledgeGraph-Cp-6Us9b.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-DIuHri5d.js → Logs-Ck-uSPAx.js} +2 -2
- package/src/assets/web-panel/assets/{MarkdownRenderer-R91Qw5JA.js → MarkdownRenderer-DxjsdAXw.js} +1 -1
- package/src/assets/web-panel/assets/{Marketplace-CY1VhFGx.js → Marketplace-Vdq7brrJ.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-BBAbi1vt.js → McpTools-ggLnw4hY.js} +5 -5
- package/src/assets/web-panel/assets/{Memory-BWYGHxJA.js → Memory-BKIjNVCU.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-CPIFkW7A.js → MobileBridge-BElCY25a.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-DQyWxCho.js → MobileProjects-DpLgovdH.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-Bo3GnQbx.js → Mtc-bNdrF_Zh.js} +4 -4
- package/src/assets/web-panel/assets/{MtcAudit-C8-c4rSW.js → MtcAudit-Dw8w1Cqk.js} +2 -2
- package/src/assets/web-panel/assets/{Multisig-ChqMTtoq.js → Multisig-CfGKvlqc.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-C48TyhvI.js → NLProgramming-D6OJf7YN.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-zogUFWxp.js → Notes-B3n_LzIS.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-v-K9XpSB.js → NotificationSettings-Uu1V_ICM.js} +1 -1
- package/src/assets/web-panel/assets/OrderTableRenderer-aGyWwWcp.js +1 -0
- package/src/assets/web-panel/assets/{Organization-Boi1dQfR.js → Organization-qjFFmuwK.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-DM5YWwgA.js → Overflow-J4ZgnwZz.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-C57LKpKK.js → P2P-YEZF-uVH.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-BFkPqu6Q.js → PdhVaultBrowser-yqx7fwqk.js} +3 -3
- package/src/assets/web-panel/assets/{Permissions-D6fB9YSp.js → Permissions-DdEjlZ02.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-Bp7EefEo.js → PersonalDataHub-DbAPYvns.js} +3 -3
- package/src/assets/web-panel/assets/{Pipeline-BVln3hZf.js → Pipeline-Bxlk_ZJU.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-Bf8P3nF6.js → Privacy-CpE-05tz.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-DM6wA2E2.js → ProjectInit-DWlhcGHT.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-CGbc5Iho.js → ProjectSettings-BnH6BiTQ.js} +2 -2
- package/src/assets/web-panel/assets/Projects-CHw2fXDB.js +1 -0
- package/src/assets/web-panel/assets/{Providers-B2kJcxS6.js → Providers-Bdz_sTyb.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-Cxu7dXYy.js → QrScannerModal-BHh2b3pH.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-DTlrTPms.js → QuickAsk-D84M09pe.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-Cm3X-cCj.js → Recommend-Czc30K6M.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-DNb2kjvt.js → RemoteSession-q_TU5qxt.js} +2 -2
- package/src/assets/web-panel/assets/{Reputation-CZUFFjc1.js → Reputation-CnTce4WM.js} +1 -1
- package/src/assets/web-panel/assets/{Row-DAPgloxA.js → Row-C60UFLay.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-dsx9S793.js → RssFeed-BOUFEu9_.js} +3 -3
- package/src/assets/web-panel/assets/{Search-DnnC8kz-.js → Search-D4__blE-.js} +1 -1
- package/src/assets/web-panel/assets/{Security-VuZknRMK.js → Security-BoOm7_JK.js} +4 -4
- package/src/assets/web-panel/assets/{Services-B3XNX8Vx.js → Services-AvzrW6HA.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-Dl1nVtCj.js → Skeleton-BZlrHozi.js} +1 -1
- package/src/assets/web-panel/assets/Skills-CKaMLuk0.js +1 -0
- package/src/assets/web-panel/assets/{Sla-HzU56n1z.js → Sla-DYCNJF8h.js} +1 -1
- package/src/assets/web-panel/assets/SpeechSettings-BvCSU6d2.js +1 -0
- package/src/assets/web-panel/assets/{SyncSettings-DWadz7Sl.js → SyncSettings-B6tW8dVO.js} +2 -2
- package/src/assets/web-panel/assets/Tasks-oNC_2NVz.js +1 -0
- package/src/assets/web-panel/assets/{Templates-BBAgvrlM.js → Templates-DvLPvvjL.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-BsbbvGN8.js → Tenant-BDt9UBn_.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-uscpZI4q.js → Terminal-ddCUnH-X.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-mTyjNE6r.js → TimelineRenderer-CA4sDL47.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-Bz97oBgs.js → Tokens-By03hnVs.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-BTRKC140.js → Trigger-Dz2mH-ZU.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-B4A_KuyX.js → Trust-DShSWHeJ.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-DES9TmLU.js → UkeySign-JN8lP3gt.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-ClXs7Qxp.js → VideoEditing-BgPy4gV3.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-IzZqFz-7.js → Wallet-CQGEsXw_.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-BtOP04g_.js → WebAuthn-D8xR-ds_.js} +3 -3
- package/src/assets/web-panel/assets/{WorkflowEditor-_0cqnopY.js → WorkflowEditor-Df61_p1p.js} +1 -1
- package/src/assets/web-panel/assets/{chat-ax7193uU.js → chat-fdPby427.js} +1 -1
- package/src/assets/web-panel/assets/{colors-Bu4WGJah.js → colors-Dimqhufo.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-BX1dlTW0.js → compact-item-DHayKcqZ.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-CktA_Dj7.js → createContext-hZUhypRH.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-ePxoBp92.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-D5wd817l.js → hasIn-Dw7zC_dV.js} +1 -1
- package/src/assets/web-panel/assets/{index-ytp2H5Zx.js → index--DVpUpz3.js} +1 -1
- package/src/assets/web-panel/assets/{index-tYPSfGbd.js → index-BHJUptSx.js} +1 -1
- package/src/assets/web-panel/assets/{index-A4uBPQCz.js → index-BIxxvaGN.js} +1 -1
- package/src/assets/web-panel/assets/{index-DmVUeWUk.js → index-BM5BNqp9.js} +1 -1
- package/src/assets/web-panel/assets/index-BTBDdCoo.js +1 -0
- package/src/assets/web-panel/assets/{index-Ci3y1ZAv.js → index-BVHdkz8F.js} +17 -17
- package/src/assets/web-panel/assets/{index-Cv7bVWJ5.js → index-BYdNwhkv.js} +1 -1
- package/src/assets/web-panel/assets/{index-CUForzsG.js → index-Bhmpp3cm.js} +1 -1
- package/src/assets/web-panel/assets/{index-C8DkWyNr.js → index-BuMSdwno.js} +1 -1
- package/src/assets/web-panel/assets/{index-BRfXoRuh.js → index-BwnUluxu.js} +1 -1
- package/src/assets/web-panel/assets/{index-o14NNnxw.js → index-C1yMYKi-.js} +1 -1
- package/src/assets/web-panel/assets/{index-C8tLR2TG.js → index-C8XXPz2n.js} +1 -1
- package/src/assets/web-panel/assets/{index-5PYYkr8S.js → index-CBQK-LEF.js} +1 -1
- package/src/assets/web-panel/assets/{index-DkD1K-fF.js → index-CIOE8tt6.js} +1 -1
- package/src/assets/web-panel/assets/{index-CjEJjl5C.js → index-CPZ3U5iH.js} +1 -1
- package/src/assets/web-panel/assets/{index-D9op8poE.js → index-CTiVrnpR.js} +1 -1
- package/src/assets/web-panel/assets/{index-DYo9S5OT.js → index-CcpDboUd.js} +1 -1
- package/src/assets/web-panel/assets/index-CfOGx8Ns.js +1 -0
- package/src/assets/web-panel/assets/{index-D-o4Rwjk.js → index-CsCo_A0I.js} +1 -1
- package/src/assets/web-panel/assets/{index-h3KJZr95.js → index-CuaVa8tX.js} +1 -1
- package/src/assets/web-panel/assets/{index-DF1TysIF.js → index-CvKHpaao.js} +1 -1
- package/src/assets/web-panel/assets/{index-CfzxR61U.js → index-D7jQEwB6.js} +1 -1
- package/src/assets/web-panel/assets/{index-Db3CpWTr.js → index-DAjvkQ4K.js} +1 -1
- package/src/assets/web-panel/assets/{index-DmPJ6T6F.js → index-DC2R4zvM.js} +1 -1
- package/src/assets/web-panel/assets/{index-C3HmzCLt.js → index-DJP7TjWm.js} +1 -1
- package/src/assets/web-panel/assets/{index-BAtBNfkr.js → index-DSlda4-6.js} +1 -1
- package/src/assets/web-panel/assets/{index-D_cycOET.js → index-DVM_KgzF.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dzdr0zDf.js → index-DX1DwDFI.js} +1 -1
- package/src/assets/web-panel/assets/{index-bFCaM7Eq.js → index-DnwDYBnG.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bad2CYeH.js → index-DxoPzPHy.js} +1 -1
- package/src/assets/web-panel/assets/{index-iHcPtQ2e.js → index-DyEhrvpm.js} +1 -1
- package/src/assets/web-panel/assets/{index-jzlzm4VK.js → index-DzJXkoZs.js} +1 -1
- package/src/assets/web-panel/assets/{index-CP8ELJBc.js → index-JE6Udz2r.js} +1 -1
- package/src/assets/web-panel/assets/{index-CeVZaJSC.js → index-Urt2R5aE.js} +1 -1
- package/src/assets/web-panel/assets/{index-BLLsUNDc.js → index-cEnkyHtX.js} +1 -1
- package/src/assets/web-panel/assets/{index-BcGdL3sG.js → index-j0pxzOu7.js} +1 -1
- package/src/assets/web-panel/assets/{index-PBLzwYnu.js → index-lPjBQJCy.js} +1 -1
- package/src/assets/web-panel/assets/{index-CYRE0NJA.js → index-ulvBurtw.js} +1 -1
- package/src/assets/web-panel/assets/{index-BQtoRyTO.js → index-y5LHQ5Ck.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-D2Iut83B.js → initDefaultProps-B4pR3px5.js} +1 -1
- package/src/assets/web-panel/assets/{motion-BuaJVdK9.js → motion-CE7dWPPs.js} +1 -1
- package/src/assets/web-panel/assets/{move-CaEuM92y.js → move-Hw8cUObc.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-wuKNBwys.js → mtc-parser-CvRjE4Fa.js} +1 -1
- package/src/assets/web-panel/assets/{omit-7a3eklaq.js → omit-CkFeLVre.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-Dn4z7KvJ.js → pickAttrs-5ZMqmbbb.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-DVn_qT4-.js → placementArrow-BZ4oeZ0q.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-Dodz1OMQ.js → responsiveObserve-lwoiX_Us.js} +1 -1
- package/src/assets/web-panel/assets/{slide-CxoGskbp.js → slide-D_as37l8.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-DBh_epQH.js → statusUtils-BsA-4Bs7.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-RXQ4gG5P.js → styleChecker-BVar4sLQ.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-1Wxm0HEG.js → useFlexGapSupport-j1IwVpGd.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-CI_ySNxJ.js → useFs-7Q9bEnUp.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-C6973rZP.js → usePersonalDataHub-BBwTIRMd.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-CalynwKr.js → vnode-C7Dk-M8w.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-CM1cd-Q0.js → zoom-D3UHaTFB.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/commands/eval.js +7 -0
- package/src/commands/status.js +55 -0
- package/src/commands/team.js +31 -6
- package/src/data/changelog.json +26 -0
- package/src/gateways/terminal/PtyManager.js +45 -15
- package/src/gateways/ws/ws-agent-handler.js +15 -1
- package/src/gateways/ws/ws-session-gateway.js +88 -0
- package/src/harness/background-task-command-runner.js +234 -0
- package/src/harness/background-task-manager.js +150 -20
- package/src/harness/background-task-worker.js +17 -11
- package/src/lazy-dispatch.js +12 -1
- package/src/lib/background-agent-supervisor.js +46 -0
- package/src/lib/event-runtime-host.js +12 -10
- package/src/lib/hook-runner.cjs +7 -1
- package/src/lib/hook-runner.js +2 -0
- package/src/lib/hooks-v2-runtime.js +94 -6
- package/src/lib/hooks-v2-workspace-context.js +258 -0
- package/src/lib/lsp/__tests__/lsp-client.test.js +1 -4
- package/src/lib/observability/index.js +191 -19
- package/src/lib/observability/otlp-exporter.js +1209 -207
- package/src/lib/otlp-exporter.js +8 -36
- package/src/lib/plugin-runtime/bin.js +20 -4
- package/src/lib/plugin-runtime/sandbox-policy.js +1 -4
- package/src/lib/process-execution-broker/index.js +706 -40
- package/src/lib/process-execution-broker/linux-generic-bwrap-runtime.js +212 -2
- package/src/lib/process-execution-broker/linux-generic-bwrap.js +124 -6
- package/src/lib/process-execution-broker/platform-sandbox.js +6 -2
- package/src/program-base.js +9 -2
- package/src/repl/agent-repl.js +8 -0
- package/src/runtime/agent-core.js +272 -38
- package/src/runtime/headless-runner.js +56 -22
- package/src/runtime/headless-stream.js +8 -0
- package/src/workers/background-agent-worker.js +5 -11
- package/src/assets/web-panel/assets/OrderTableRenderer-P94JGGNz.js +0 -1
- package/src/assets/web-panel/assets/Projects-D0p9EOxm.js +0 -1
- package/src/assets/web-panel/assets/Skills-CY09CZ_W.js +0 -1
- package/src/assets/web-panel/assets/SpeechSettings-CRle7Jl2.js +0 -1
- package/src/assets/web-panel/assets/Tasks-CNVTDGg8.js +0 -1
- package/src/assets/web-panel/assets/devWarning-x877iKKS.js +0 -1
- package/src/assets/web-panel/assets/index-D7pfPouB.js +0 -1
- package/src/assets/web-panel/assets/index-e4i-VLBd.js +0 -1
|
@@ -201,6 +201,76 @@ function createPythonInterpreterProbeSandboxFailure(sandboxPolicy) {
|
|
|
201
201
|
return error;
|
|
202
202
|
}
|
|
203
203
|
|
|
204
|
+
function createBackgroundShellSandboxFailure(
|
|
205
|
+
reason,
|
|
206
|
+
message,
|
|
207
|
+
sandboxPolicy,
|
|
208
|
+
cause = null,
|
|
209
|
+
) {
|
|
210
|
+
const requiredBoundaries = [...(sandboxPolicy?.requiredBoundaries || [])];
|
|
211
|
+
const error = new Error(message);
|
|
212
|
+
error.code = "ERR_PROCESS_SANDBOX_BOUNDARY_UNSATISFIED";
|
|
213
|
+
error.sandboxReason = reason;
|
|
214
|
+
error.sandboxFailClosed = true;
|
|
215
|
+
error.requiredBoundaries = requiredBoundaries;
|
|
216
|
+
error.actualGuarantees = [];
|
|
217
|
+
error.missingBoundaries = [...requiredBoundaries];
|
|
218
|
+
error.sandboxBackend = null;
|
|
219
|
+
error.sandboxCandidateBackend = "linux-bwrap-workspace";
|
|
220
|
+
if (cause) error.cause = cause;
|
|
221
|
+
return error;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
function resolveBackgroundShellWorkspacePaths(
|
|
225
|
+
trustedWorkspaceRoot,
|
|
226
|
+
requestedCwd,
|
|
227
|
+
sandboxPolicy,
|
|
228
|
+
) {
|
|
229
|
+
if (
|
|
230
|
+
typeof trustedWorkspaceRoot !== "string" ||
|
|
231
|
+
!trustedWorkspaceRoot ||
|
|
232
|
+
trustedWorkspaceRoot.includes("\0") ||
|
|
233
|
+
!path.isAbsolute(trustedWorkspaceRoot)
|
|
234
|
+
) {
|
|
235
|
+
throw createBackgroundShellSandboxFailure(
|
|
236
|
+
"background_workspace_root_untrusted",
|
|
237
|
+
"Background shell strong sandbox requires an absolute trusted host workspace root",
|
|
238
|
+
sandboxPolicy,
|
|
239
|
+
);
|
|
240
|
+
}
|
|
241
|
+
const workspaceRoot = path.resolve(trustedWorkspaceRoot);
|
|
242
|
+
let workingDirectory = workspaceRoot;
|
|
243
|
+
if (
|
|
244
|
+
requestedCwd !== undefined &&
|
|
245
|
+
requestedCwd !== null &&
|
|
246
|
+
requestedCwd !== ""
|
|
247
|
+
) {
|
|
248
|
+
if (typeof requestedCwd !== "string" || requestedCwd.includes("\0")) {
|
|
249
|
+
throw createBackgroundShellSandboxFailure(
|
|
250
|
+
"background_working_directory_untrusted",
|
|
251
|
+
"Background shell strong sandbox cwd must be a trusted path string",
|
|
252
|
+
sandboxPolicy,
|
|
253
|
+
);
|
|
254
|
+
}
|
|
255
|
+
workingDirectory = path.isAbsolute(requestedCwd)
|
|
256
|
+
? path.resolve(requestedCwd)
|
|
257
|
+
: path.resolve(workspaceRoot, requestedCwd);
|
|
258
|
+
}
|
|
259
|
+
const relative = path.relative(workspaceRoot, workingDirectory);
|
|
260
|
+
if (
|
|
261
|
+
relative === ".." ||
|
|
262
|
+
relative.startsWith(`..${path.sep}`) ||
|
|
263
|
+
path.isAbsolute(relative)
|
|
264
|
+
) {
|
|
265
|
+
throw createBackgroundShellSandboxFailure(
|
|
266
|
+
"background_working_directory_escape",
|
|
267
|
+
"Background shell strong sandbox cwd escapes the trusted host workspace root",
|
|
268
|
+
sandboxPolicy,
|
|
269
|
+
);
|
|
270
|
+
}
|
|
271
|
+
return { workspaceRoot, workingDirectory };
|
|
272
|
+
}
|
|
273
|
+
|
|
204
274
|
// ─── Background shell tasks ────────────────────────────────────────────────
|
|
205
275
|
//
|
|
206
276
|
// run_shell is synchronous (execSync) and capped at a foreground timeout, which
|
|
@@ -321,10 +391,16 @@ function _releaseBgChildHandles(task) {
|
|
|
321
391
|
|
|
322
392
|
const backgroundTaskRunner = broker.spawn.bind(broker);
|
|
323
393
|
const backgroundTaskSyncRunner = broker.spawnSync.bind(broker);
|
|
394
|
+
const backgroundTaskContractIssuer =
|
|
395
|
+
typeof broker.issueLinuxWorkspaceSandboxExecutionContract === "function"
|
|
396
|
+
? broker.issueLinuxWorkspaceSandboxExecutionContract.bind(broker)
|
|
397
|
+
: null;
|
|
324
398
|
|
|
325
399
|
export const _backgroundProcessDeps = {
|
|
326
400
|
run: backgroundTaskRunner,
|
|
327
401
|
runSync: backgroundTaskSyncRunner,
|
|
402
|
+
issueLinuxWorkspaceSandboxExecutionContract: backgroundTaskContractIssuer,
|
|
403
|
+
platform: () => process.platform,
|
|
328
404
|
};
|
|
329
405
|
|
|
330
406
|
export function _runBackgroundTaskkill(pid, { sync = false } = {}) {
|
|
@@ -350,7 +426,12 @@ function _killTask(task) {
|
|
|
350
426
|
const child = task?.child;
|
|
351
427
|
if (!child || child.killed || task?.status !== "running") return false;
|
|
352
428
|
try {
|
|
353
|
-
if (
|
|
429
|
+
if (task.sandboxManagedTree === true) {
|
|
430
|
+
// Linux generic launches are never detached. Bubblewrap owns the private
|
|
431
|
+
// PID namespace and runs with --die-with-parent/--new-session, so killing
|
|
432
|
+
// the Broker child reaps the complete sandbox tree.
|
|
433
|
+
child.kill("SIGTERM");
|
|
434
|
+
} else if (process.platform === "win32") {
|
|
354
435
|
if (child.pid) {
|
|
355
436
|
const tk = _runBackgroundTaskkill(child.pid);
|
|
356
437
|
const fallbackDirectKill = () => {
|
|
@@ -425,7 +506,9 @@ function _killTaskSync(task) {
|
|
|
425
506
|
const child = task?.child;
|
|
426
507
|
if (!child || child.killed || task?.status !== "running") return false;
|
|
427
508
|
try {
|
|
428
|
-
if (
|
|
509
|
+
if (task.sandboxManagedTree === true) {
|
|
510
|
+
child.kill("SIGKILL");
|
|
511
|
+
} else if (process.platform === "win32") {
|
|
429
512
|
if (child.pid) {
|
|
430
513
|
const killed = _runBackgroundTaskkill(child.pid, { sync: true });
|
|
431
514
|
if (killed.error || killed.status !== 0) {
|
|
@@ -3562,6 +3645,7 @@ async function executeToolInner(
|
|
|
3562
3645
|
pluginBinSandboxExecutionContract =
|
|
3563
3646
|
pluginBin.createPluginSandboxExecutionContract(
|
|
3564
3647
|
pluginBinInvocation,
|
|
3648
|
+
{ sync: args.run_in_background !== true },
|
|
3565
3649
|
);
|
|
3566
3650
|
} catch (error) {
|
|
3567
3651
|
if (error?.pluginBinFailClosed) throw error;
|
|
@@ -3644,9 +3728,33 @@ async function executeToolInner(
|
|
|
3644
3728
|
policy: { decision: "deny", via: "sandbox" },
|
|
3645
3729
|
});
|
|
3646
3730
|
}
|
|
3731
|
+
const backgroundPlatform =
|
|
3732
|
+
typeof _backgroundProcessDeps.platform === "function"
|
|
3733
|
+
? _backgroundProcessDeps.platform()
|
|
3734
|
+
: process.platform;
|
|
3735
|
+
const pinnedBackgroundBoundaries = [
|
|
3736
|
+
...(pluginBinSandboxPolicy?.requiredBoundaries || []),
|
|
3737
|
+
];
|
|
3738
|
+
const hasPinnedBackgroundPolicy = pinnedBackgroundBoundaries.length > 0;
|
|
3739
|
+
const linuxGenericStrongBackground =
|
|
3740
|
+
backgroundPlatform === "linux" &&
|
|
3741
|
+
!pluginBinInvocation &&
|
|
3742
|
+
pinnedBackgroundBoundaries.some(
|
|
3743
|
+
(boundary) => boundary === "filesystem" || boundary === "network",
|
|
3744
|
+
);
|
|
3745
|
+
const linuxDirectPluginStrongBackground =
|
|
3746
|
+
backgroundPlatform === "linux" &&
|
|
3747
|
+
pluginBinInvocation !== null &&
|
|
3748
|
+
pluginBinSandboxExecutionContract !== null &&
|
|
3749
|
+
pinnedBackgroundBoundaries.some(
|
|
3750
|
+
(boundary) => boundary === "filesystem" || boundary === "network",
|
|
3751
|
+
);
|
|
3647
3752
|
if (
|
|
3648
|
-
|
|
3649
|
-
|
|
3753
|
+
hasPinnedBackgroundPolicy &&
|
|
3754
|
+
(backgroundPlatform === "win32" ||
|
|
3755
|
+
(backgroundPlatform === "linux" &&
|
|
3756
|
+
!linuxGenericStrongBackground &&
|
|
3757
|
+
!linuxDirectPluginStrongBackground))
|
|
3650
3758
|
) {
|
|
3651
3759
|
return attachDescriptor({
|
|
3652
3760
|
error:
|
|
@@ -3661,6 +3769,84 @@ async function executeToolInner(
|
|
|
3661
3769
|
approval: approvalOutcome,
|
|
3662
3770
|
});
|
|
3663
3771
|
}
|
|
3772
|
+
let linuxGenericBackgroundLaunch = null;
|
|
3773
|
+
if (linuxGenericStrongBackground) {
|
|
3774
|
+
const { workspaceRoot, workingDirectory } =
|
|
3775
|
+
resolveBackgroundShellWorkspacePaths(
|
|
3776
|
+
cwd,
|
|
3777
|
+
args.cwd,
|
|
3778
|
+
pluginBinSandboxPolicy,
|
|
3779
|
+
);
|
|
3780
|
+
const file = "/bin/sh";
|
|
3781
|
+
const launchArgs = ["-c", args.command];
|
|
3782
|
+
const options = {
|
|
3783
|
+
cwd: workingDirectory,
|
|
3784
|
+
shell: false,
|
|
3785
|
+
windowsHide: true,
|
|
3786
|
+
env: applyCredentialProxy({
|
|
3787
|
+
...process.env,
|
|
3788
|
+
CLAUDECODE: "1",
|
|
3789
|
+
...(sessionId
|
|
3790
|
+
? {
|
|
3791
|
+
CC_SESSION_ID: String(sessionId),
|
|
3792
|
+
CLAUDE_CODE_SESSION_ID: String(sessionId),
|
|
3793
|
+
}
|
|
3794
|
+
: {}),
|
|
3795
|
+
}).env,
|
|
3796
|
+
detached: false,
|
|
3797
|
+
origin: "tool:run_shell",
|
|
3798
|
+
policy: "allow",
|
|
3799
|
+
scope: "agent",
|
|
3800
|
+
sandboxPolicy: pluginBinSandboxPolicy,
|
|
3801
|
+
};
|
|
3802
|
+
const issuer =
|
|
3803
|
+
_backgroundProcessDeps.issueLinuxWorkspaceSandboxExecutionContract;
|
|
3804
|
+
if (typeof issuer !== "function") {
|
|
3805
|
+
throw createBackgroundShellSandboxFailure(
|
|
3806
|
+
"background_contract_issuer_unavailable",
|
|
3807
|
+
"Linux background shell sandbox contract issuer is unavailable",
|
|
3808
|
+
pluginBinSandboxPolicy,
|
|
3809
|
+
);
|
|
3810
|
+
}
|
|
3811
|
+
let sandboxExecutionContract;
|
|
3812
|
+
try {
|
|
3813
|
+
sandboxExecutionContract = issuer(
|
|
3814
|
+
file,
|
|
3815
|
+
launchArgs,
|
|
3816
|
+
options,
|
|
3817
|
+
workspaceRoot,
|
|
3818
|
+
{ sync: false },
|
|
3819
|
+
);
|
|
3820
|
+
} catch (error) {
|
|
3821
|
+
if (
|
|
3822
|
+
error?.sandboxFailClosed === true ||
|
|
3823
|
+
error?.code === "ERR_PROCESS_SANDBOX_BOUNDARY_UNSATISFIED"
|
|
3824
|
+
) {
|
|
3825
|
+
throw error;
|
|
3826
|
+
}
|
|
3827
|
+
throw createBackgroundShellSandboxFailure(
|
|
3828
|
+
"background_contract_issuance_failed",
|
|
3829
|
+
`Linux background shell sandbox contract could not be issued: ${error?.message || String(error)}`,
|
|
3830
|
+
pluginBinSandboxPolicy,
|
|
3831
|
+
error,
|
|
3832
|
+
);
|
|
3833
|
+
}
|
|
3834
|
+
if (!sandboxExecutionContract) {
|
|
3835
|
+
throw createBackgroundShellSandboxFailure(
|
|
3836
|
+
"background_contract_unavailable",
|
|
3837
|
+
"Linux background shell sandbox contract issuer returned no authority",
|
|
3838
|
+
pluginBinSandboxPolicy,
|
|
3839
|
+
);
|
|
3840
|
+
}
|
|
3841
|
+
linuxGenericBackgroundLaunch = {
|
|
3842
|
+
file,
|
|
3843
|
+
args: launchArgs,
|
|
3844
|
+
options: {
|
|
3845
|
+
...options,
|
|
3846
|
+
sandboxExecutionContract,
|
|
3847
|
+
},
|
|
3848
|
+
};
|
|
3849
|
+
}
|
|
3664
3850
|
// Free memory from idle background tasks before adding another, so a
|
|
3665
3851
|
// long agent run can't accumulate forgotten dev servers (no-op unless
|
|
3666
3852
|
// the machine is actually under memory pressure).
|
|
@@ -3669,7 +3855,11 @@ async function executeToolInner(
|
|
|
3669
3855
|
const task = {
|
|
3670
3856
|
id,
|
|
3671
3857
|
command: args.command,
|
|
3672
|
-
cwd:
|
|
3858
|
+
cwd:
|
|
3859
|
+
linuxGenericBackgroundLaunch?.options.cwd ||
|
|
3860
|
+
(linuxDirectPluginStrongBackground
|
|
3861
|
+
? pluginBinSandboxExecutionContract.workingDirectory
|
|
3862
|
+
: args.cwd || cwd),
|
|
3673
3863
|
status: "running",
|
|
3674
3864
|
exitCode: null,
|
|
3675
3865
|
signal: null,
|
|
@@ -3680,44 +3870,61 @@ async function executeToolInner(
|
|
|
3680
3870
|
out: _newBgStream(),
|
|
3681
3871
|
err: _newBgStream(),
|
|
3682
3872
|
child: null,
|
|
3873
|
+
sandboxManagedTree:
|
|
3874
|
+
linuxGenericBackgroundLaunch !== null ||
|
|
3875
|
+
linuxDirectPluginStrongBackground,
|
|
3683
3876
|
};
|
|
3684
3877
|
try {
|
|
3685
|
-
|
|
3686
|
-
|
|
3687
|
-
|
|
3688
|
-
|
|
3689
|
-
|
|
3690
|
-
|
|
3691
|
-
|
|
3692
|
-
|
|
3693
|
-
|
|
3694
|
-
|
|
3695
|
-
|
|
3696
|
-
|
|
3697
|
-
|
|
3698
|
-
|
|
3699
|
-
|
|
3700
|
-
|
|
3701
|
-
|
|
3702
|
-
|
|
3703
|
-
|
|
3704
|
-
|
|
3705
|
-
|
|
3706
|
-
|
|
3707
|
-
|
|
3708
|
-
|
|
3709
|
-
|
|
3878
|
+
// The strong route already has its exact contract-bound options.
|
|
3879
|
+
// Construct legacy options only for legacy/direct-Plugin launches.
|
|
3880
|
+
const bgSpawnOpts = linuxGenericBackgroundLaunch
|
|
3881
|
+
? null
|
|
3882
|
+
: {
|
|
3883
|
+
cwd: task.cwd,
|
|
3884
|
+
shell: shellInv.useDefaultShell,
|
|
3885
|
+
windowsHide: true,
|
|
3886
|
+
// Same agent-identity env as the foreground path: CLAUDECODE marks
|
|
3887
|
+
// "running under the agent"; the session id correlates work to the
|
|
3888
|
+
// run (CC_SESSION_ID + CLAUDE_CODE_SESSION_ID for Claude-Code parity).
|
|
3889
|
+
// Credential proxy (opt-in, CC_CREDENTIAL_PROXY): keeps the agent's
|
|
3890
|
+
// real long-lived secrets out of the spawned command's env — a
|
|
3891
|
+
// no-op (same object) when disabled. See credential-proxy.js.
|
|
3892
|
+
env: applyCredentialProxy({
|
|
3893
|
+
...process.env,
|
|
3894
|
+
CLAUDECODE: "1",
|
|
3895
|
+
...(sessionId
|
|
3896
|
+
? {
|
|
3897
|
+
CC_SESSION_ID: String(sessionId),
|
|
3898
|
+
CLAUDE_CODE_SESSION_ID: String(sessionId),
|
|
3899
|
+
}
|
|
3900
|
+
: {}),
|
|
3901
|
+
}).env,
|
|
3902
|
+
// POSIX: own process group so check_shell{kill}/teardown can signal
|
|
3903
|
+
// the whole tree (shell + its grandchild command). No-op on Windows
|
|
3904
|
+
// where the tree is killed via taskkill /T instead.
|
|
3905
|
+
detached:
|
|
3906
|
+
process.platform !== "win32" &&
|
|
3907
|
+
!linuxDirectPluginStrongBackground,
|
|
3908
|
+
};
|
|
3710
3909
|
// PowerShell route: explicit argv (shell:false above); default route
|
|
3711
3910
|
// is the historical spawn(command, {shell:true}) byte-for-byte.
|
|
3712
|
-
const brokerOpts =
|
|
3713
|
-
|
|
3714
|
-
|
|
3715
|
-
|
|
3716
|
-
|
|
3717
|
-
|
|
3718
|
-
|
|
3911
|
+
const brokerOpts = bgSpawnOpts
|
|
3912
|
+
? {
|
|
3913
|
+
...bgSpawnOpts,
|
|
3914
|
+
origin: processOrigin,
|
|
3915
|
+
policy: "allow",
|
|
3916
|
+
scope: "agent",
|
|
3917
|
+
...processProvenance,
|
|
3918
|
+
}
|
|
3919
|
+
: null;
|
|
3719
3920
|
let child;
|
|
3720
|
-
if (
|
|
3921
|
+
if (linuxGenericBackgroundLaunch) {
|
|
3922
|
+
child = _backgroundProcessDeps.run(
|
|
3923
|
+
linuxGenericBackgroundLaunch.file,
|
|
3924
|
+
linuxGenericBackgroundLaunch.args,
|
|
3925
|
+
linuxGenericBackgroundLaunch.options,
|
|
3926
|
+
);
|
|
3927
|
+
} else if (pluginBinInvocation) {
|
|
3721
3928
|
reattestPluginBinInvocation(pluginBinInvocation);
|
|
3722
3929
|
pluginBinResult.plugin_bin.launch_identity_reattested = true;
|
|
3723
3930
|
child = broker.spawn(
|
|
@@ -3774,6 +3981,33 @@ async function executeToolInner(
|
|
|
3774
3981
|
_releaseBgChildHandles(task);
|
|
3775
3982
|
});
|
|
3776
3983
|
} catch (err) {
|
|
3984
|
+
if (
|
|
3985
|
+
linuxGenericBackgroundLaunch ||
|
|
3986
|
+
linuxDirectPluginStrongBackground
|
|
3987
|
+
) {
|
|
3988
|
+
if (task.child && !task.child.killed) {
|
|
3989
|
+
try {
|
|
3990
|
+
task.child.kill("SIGKILL");
|
|
3991
|
+
} catch {
|
|
3992
|
+
// Preserve the setup failure; the bwrap supervisor also has
|
|
3993
|
+
// --die-with-parent as a final process-lifetime backstop.
|
|
3994
|
+
}
|
|
3995
|
+
_releaseBgChildHandles(task);
|
|
3996
|
+
}
|
|
3997
|
+
if (
|
|
3998
|
+
err?.sandboxFailClosed === true ||
|
|
3999
|
+
(typeof err?.code === "string" &&
|
|
4000
|
+
err.code.startsWith("ERR_PROCESS_SANDBOX"))
|
|
4001
|
+
) {
|
|
4002
|
+
throw err;
|
|
4003
|
+
}
|
|
4004
|
+
throw createBackgroundShellSandboxFailure(
|
|
4005
|
+
"background_sandbox_launch_failed",
|
|
4006
|
+
`Linux background shell sandbox launch failed: ${err?.message || String(err)}`,
|
|
4007
|
+
pluginBinSandboxPolicy,
|
|
4008
|
+
err,
|
|
4009
|
+
);
|
|
4010
|
+
}
|
|
3777
4011
|
task.status = "error";
|
|
3778
4012
|
task.error = String(err?.message || err).substring(0, 2000);
|
|
3779
4013
|
task.endedAt = new Date().toISOString();
|
|
@@ -68,6 +68,7 @@ import {
|
|
|
68
68
|
executeHooksV2Event,
|
|
69
69
|
resolvePromptExpansion,
|
|
70
70
|
} from "../lib/hooks-v2-producers.js";
|
|
71
|
+
import { runWithHostHooksV2Workspace } from "../lib/hooks-v2-workspace-context.js";
|
|
71
72
|
import { CLISkillLoader } from "../lib/skill-loader.js";
|
|
72
73
|
import { expandFileRefsAsync } from "./file-ref-expander.js";
|
|
73
74
|
import { composeSystemPrompt } from "./system-prompt.js";
|
|
@@ -325,7 +326,9 @@ export function applyForkSession(opts = {}, store = {}) {
|
|
|
325
326
|
* @param {string[]} [options.allowedTools]
|
|
326
327
|
* @param {string[]} [options.disallowedTools]
|
|
327
328
|
* @param {number} [options.maxTurns] Cap on agent loop iterations.
|
|
328
|
-
* @param {string} [options.cwd]
|
|
329
|
+
* @param {string} [options.cwd] Trusted CLI-host workspace
|
|
330
|
+
* input. Never populate this from
|
|
331
|
+
* model/plugin/hook/event payloads.
|
|
329
332
|
* @param {string[]} [options.additionalDirectories] Extra workspace roots
|
|
330
333
|
* (--add-dir): absolute dirs the
|
|
331
334
|
* agent may read/search/edit.
|
|
@@ -341,6 +344,13 @@ export function applyForkSession(opts = {}, store = {}) {
|
|
|
341
344
|
* @returns {Promise<{ exitCode:number, result:string, isError:boolean }>}
|
|
342
345
|
*/
|
|
343
346
|
export async function runAgentHeadless(options = {}, deps = {}) {
|
|
347
|
+
const trustedWorkspaceRoot = options.cwd || process.cwd();
|
|
348
|
+
return runWithHostHooksV2Workspace(trustedWorkspaceRoot, () =>
|
|
349
|
+
runAgentHeadlessInWorkspace(options, deps),
|
|
350
|
+
);
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
async function runAgentHeadlessInWorkspace(options = {}, deps = {}) {
|
|
344
354
|
const prompt = (options.prompt || "").trim();
|
|
345
355
|
if (!prompt) {
|
|
346
356
|
throw new Error(
|
|
@@ -1433,11 +1443,19 @@ export async function runAgentHeadless(options = {}, deps = {}) {
|
|
|
1433
1443
|
}
|
|
1434
1444
|
}
|
|
1435
1445
|
|
|
1436
|
-
//
|
|
1437
|
-
//
|
|
1438
|
-
//
|
|
1446
|
+
// Attach an OpenTelemetry recorder when either the legacy --otlp file sink or
|
|
1447
|
+
// the process-level Collector exporter is enabled. Both sinks consume the
|
|
1448
|
+
// same privacy-gated spans; the default path remains zero cost.
|
|
1439
1449
|
let _otlpRecorder = null;
|
|
1440
|
-
|
|
1450
|
+
let _collectorEnabled = false;
|
|
1451
|
+
try {
|
|
1452
|
+
const { isOtlpCollectorEnabled } =
|
|
1453
|
+
await import("../lib/observability/index.js");
|
|
1454
|
+
_collectorEnabled = isOtlpCollectorEnabled();
|
|
1455
|
+
} catch {
|
|
1456
|
+
_collectorEnabled = false;
|
|
1457
|
+
}
|
|
1458
|
+
if (options.otlp || _collectorEnabled) {
|
|
1441
1459
|
try {
|
|
1442
1460
|
const { TelemetryRecorder } =
|
|
1443
1461
|
await import("../lib/telemetry/span-recorder.js");
|
|
@@ -2141,7 +2159,12 @@ export async function runAgentHeadless(options = {}, deps = {}) {
|
|
|
2141
2159
|
usage.cache_creation_input_tokens +=
|
|
2142
2160
|
event.usage?.cache_creation_input_tokens || 0;
|
|
2143
2161
|
}
|
|
2144
|
-
emitStream({
|
|
2162
|
+
emitStream({
|
|
2163
|
+
type: "token_usage",
|
|
2164
|
+
provider: event.provider,
|
|
2165
|
+
model: event.model,
|
|
2166
|
+
usage: event.usage,
|
|
2167
|
+
});
|
|
2145
2168
|
if (costBudget) {
|
|
2146
2169
|
costBudget.add({
|
|
2147
2170
|
provider: event.provider,
|
|
@@ -2699,24 +2722,35 @@ export async function runAgentHeadless(options = {}, deps = {}) {
|
|
|
2699
2722
|
writeOut(finalText + (finalText.endsWith("\n") ? "" : "\n"));
|
|
2700
2723
|
}
|
|
2701
2724
|
|
|
2702
|
-
//
|
|
2703
|
-
//
|
|
2704
|
-
if (_otlpRecorder
|
|
2705
|
-
|
|
2706
|
-
|
|
2707
|
-
|
|
2708
|
-
|
|
2709
|
-
|
|
2710
|
-
|
|
2711
|
-
|
|
2712
|
-
if (!isStream) {
|
|
2713
|
-
const sum = _otlpRecorder.summary();
|
|
2714
|
-
process.stderr.write(
|
|
2715
|
-
`[otlp] ${sum.spanCount} span(s) → ${options.otlp}\n`,
|
|
2725
|
+
// Export once to each configured sink. Collector enqueue is durable and
|
|
2726
|
+
// best-effort; the process lifecycle force-flushes it before exit.
|
|
2727
|
+
if (_otlpRecorder) {
|
|
2728
|
+
if (options.otlp) {
|
|
2729
|
+
try {
|
|
2730
|
+
const fsp = await import("node:fs");
|
|
2731
|
+
fsp.writeFileSync(
|
|
2732
|
+
options.otlp,
|
|
2733
|
+
JSON.stringify(_otlpRecorder.toOtlp(), null, 2),
|
|
2734
|
+
"utf-8",
|
|
2716
2735
|
);
|
|
2736
|
+
if (!isStream) {
|
|
2737
|
+
const sum = _otlpRecorder.summary();
|
|
2738
|
+
process.stderr.write(
|
|
2739
|
+
`[otlp] ${sum.spanCount} span(s) → ${options.otlp}\n`,
|
|
2740
|
+
);
|
|
2741
|
+
}
|
|
2742
|
+
} catch (err) {
|
|
2743
|
+
process.stderr.write(`[otlp] export failed: ${err.message}\n`);
|
|
2744
|
+
}
|
|
2745
|
+
}
|
|
2746
|
+
if (_collectorEnabled) {
|
|
2747
|
+
try {
|
|
2748
|
+
const { exportTelemetryRecorder } =
|
|
2749
|
+
await import("../lib/observability/index.js");
|
|
2750
|
+
exportTelemetryRecorder(_otlpRecorder);
|
|
2751
|
+
} catch {
|
|
2752
|
+
// Telemetry is observational only and never changes the agent result.
|
|
2717
2753
|
}
|
|
2718
|
-
} catch (err) {
|
|
2719
|
-
process.stderr.write(`[otlp] export failed: ${err.message}\n`);
|
|
2720
2754
|
}
|
|
2721
2755
|
}
|
|
2722
2756
|
|
|
@@ -30,6 +30,7 @@ import {
|
|
|
30
30
|
executeHooksV2Event,
|
|
31
31
|
resolvePromptExpansion,
|
|
32
32
|
} from "../lib/hooks-v2-producers.js";
|
|
33
|
+
import { runWithHostHooksV2Workspace } from "../lib/hooks-v2-workspace-context.js";
|
|
33
34
|
import { bootstrap } from "./bootstrap.js";
|
|
34
35
|
import { buildSystemPrompt, agentLoop as coreAgentLoop } from "./agent-core.js";
|
|
35
36
|
import { composeSystemPrompt } from "./system-prompt.js";
|
|
@@ -996,6 +997,13 @@ async function runTurn(
|
|
|
996
997
|
* @returns {Promise<{exitCode:number, turns:number}>}
|
|
997
998
|
*/
|
|
998
999
|
export async function runAgentHeadlessStream(options = {}, deps = {}) {
|
|
1000
|
+
const trustedWorkspaceRoot = options.cwd || process.cwd();
|
|
1001
|
+
return runWithHostHooksV2Workspace(trustedWorkspaceRoot, () =>
|
|
1002
|
+
runAgentHeadlessStreamInWorkspace(options, deps),
|
|
1003
|
+
);
|
|
1004
|
+
}
|
|
1005
|
+
|
|
1006
|
+
async function runAgentHeadlessStreamInWorkspace(options = {}, deps = {}) {
|
|
999
1007
|
const model = options.model || "qwen2.5:7b";
|
|
1000
1008
|
const provider = options.provider || "ollama";
|
|
1001
1009
|
const baseUrl = options.baseUrl || "http://localhost:11434";
|
|
@@ -20,6 +20,7 @@ import {
|
|
|
20
20
|
openBackgroundLogFile,
|
|
21
21
|
readBackgroundAgentState,
|
|
22
22
|
removeJobFile,
|
|
23
|
+
stopBackgroundAgentChildTree,
|
|
23
24
|
writeBackgroundAgentState,
|
|
24
25
|
} from "../lib/background-agent-supervisor.js";
|
|
25
26
|
import { startBackgroundSessionServer } from "../lib/background-session-transport.js";
|
|
@@ -409,17 +410,10 @@ async function main() {
|
|
|
409
410
|
},
|
|
410
411
|
onStop: () => {
|
|
411
412
|
if (!child) return;
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
process.kill(-child.pid, "SIGTERM");
|
|
417
|
-
} catch {
|
|
418
|
-
child.kill("SIGTERM");
|
|
419
|
-
}
|
|
420
|
-
} else {
|
|
421
|
-
child.kill("SIGTERM");
|
|
422
|
-
}
|
|
413
|
+
// The agent child is detached into its own group on POSIX; Windows
|
|
414
|
+
// requires brokered taskkill /T /F so tool grandchildren cannot
|
|
415
|
+
// survive an attached-session stop.
|
|
416
|
+
stopBackgroundAgentChildTree(child.pid);
|
|
423
417
|
},
|
|
424
418
|
onClientChange: (count) => {
|
|
425
419
|
// A UI/terminal may attach after the request was created. Re-broadcast
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{I as w,P as l,J as u,U as s,R as n,c as i,K as v,Q as _,V as g,b as o}from"./vendor-Bn1JzzAn.js";import{_ as S}from"./index-Ci3y1ZAv.js";import"./icons-DG5UD-6K.js";const k={__name:"OrderTableRenderer",props:{event:{type:Object,required:!0}},setup(p,{expose:r}){r();const a=p,e=o(()=>a.event.content||{}),d=o(()=>a.event.extra||{}),m=o(()=>d.value.merchant||e.value.merchant||e.value.counterparty||"—"),c=o(()=>e.value.title||e.value.name||e.value.itemName||e.value.text||"—"),y=o(()=>{const t=e.value.amount??e.value.price??e.value.total;return t==null?"—":`${e.value.currency||"¥"} ${typeof t=="number"?t.toFixed(2):t}`}),T=o(()=>d.value.orderNo||e.value.orderNo||e.value.orderId),f=o(()=>e.value.status||e.value.state),b=o(()=>{const t=(f.value||"").toLowerCase();return t.includes("成功")||t.includes("succe")||t.includes("paid")?"green":t.includes("退")||t.includes("refund")?"orange":t.includes("失败")||t.includes("fail")?"red":"default"}),h=o(()=>{if(!a.event.occurredAt)return"";const t=new Date(a.event.occurredAt);return`${t.getFullYear()}-${String(t.getMonth()+1).padStart(2,"0")}-${String(t.getDate()).padStart(2,"0")} ${String(t.getHours()).padStart(2,"0")}:${String(t.getMinutes()).padStart(2,"0")}`}),x={props:a,c:e,e:d,merchantText:m,itemText:c,amountText:y,orderNo:T,statusText:f,statusColor:b,formattedTime:h,computed:o};return Object.defineProperty(x,"__isScriptSetup",{enumerable:!1,value:!0}),x}},N={class:"order-card"},C={class:"head"},O={class:"time"},V={class:"row"},R={class:"val"},B={class:"row"},D={class:"val"},I={class:"row amount-row"},j={class:"val amount"},A={key:0,class:"row"},E={class:"val mono"},F={key:1,class:"row"};function K(p,r,a,e,d,m){const c=w("a-tag");return l(),u("div",N,[s("div",C,[s("span",O,n(e.formattedTime),1),i(c,{color:"gold"},{default:v(()=>[_(n(a.event.source.adapter),1)]),_:1}),i(c,null,{default:v(()=>[_(n(a.event.subtype),1)]),_:1})]),s("div",V,[r[0]||(r[0]=s("span",{class:"key"},"商户",-1)),s("span",R,n(e.merchantText),1)]),s("div",B,[r[1]||(r[1]=s("span",{class:"key"},"商品/项目",-1)),s("span",D,n(e.itemText),1)]),s("div",I,[r[2]||(r[2]=s("span",{class:"key"},"金额",-1)),s("span",j,n(e.amountText),1)]),e.orderNo?(l(),u("div",A,[r[3]||(r[3]=s("span",{class:"key"},"单号",-1)),s("span",E,n(e.orderNo),1)])):g("v-if",!0),e.statusText?(l(),u("div",F,[r[4]||(r[4]=s("span",{class:"key"},"状态",-1)),i(c,{color:e.statusColor},{default:v(()=>[_(n(e.statusText),1)]),_:1},8,["color"])])):g("v-if",!0)])}const J=S(k,[["render",K],["__scopeId","data-v-5ed5524d"],["__file","/tmp/cc-web-panel-EZK4no/repo/packages/web-panel/src/components/pdh/renderers/OrderTableRenderer.vue"]]);export{J as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{I as i,J as I,U,R as s,Q as r,c as t,K as a,V as _,S as x,o as oe,b as ee,r as u,P as p,F as ne,a2 as ge}from"./vendor-Bn1JzzAn.js";import{_ as we,b as re,u as ie,d}from"./index-Ci3y1ZAv.js";import{u as de}from"./useShellMode-CgR0wCYM.js";import{aN as ke,aO as Fe,aP as be,f as je,a5 as Ce,a8 as xe,at as Oe,R as Se}from"./icons-DG5UD-6K.js";const Pe={__name:"Projects",setup(se,{expose:l}){l();const{t:te}=re(),e=ie(),{isEmbedded:W}=de();async function w(o,f,ye,ae=8e3){if(W){const Y=await e.sendRaw({...f,type:o},ae);if(!Y?.ok){const $=Y?.error;throw new Error(typeof $=="string"?$:$?.message||`${o} failed`)}return Y.result}return e.executeJson(ye,ae)}const B=u(!1),y=u([]),O=u(""),S=u(""),P=u(!1),v=u(null),h=u([]),k=u(!1),E=u(!1),L=u(!1),F=u({name:"",description:"",type:"document",rootPath:""}),z=[{title:"ID",key:"id",width:110},{title:"名称",key:"name"},{title:"类型",key:"project_type",width:120},{title:"状态",key:"status",width:100},{title:"同步",key:"sync_status",width:100},{title:"更新",key:"updated_at",width:160},{title:"操作",key:"actions",width:180,fixed:"right"}],V=ee(()=>{const o={active:0,draft:0,completed:0,archived:0};for(const f of y.value)o[f.status]!==void 0&&(o[f.status]+=1);return o}),J=ee(()=>y.value.filter(o=>!(O.value&&o.status!==O.value||S.value&&!o.name.toLowerCase().includes(S.value.toLowerCase()))));function g(o){switch(o){case"active":return"green";case"draft":return"default";case"completed":return"cyan";case"archived":return"gold";default:return"default"}}function K(o){switch(o){case"synced":return"green";case"pending":return"orange";case"conflict":return"red";case"error":return"red";default:return"default"}}function Q(o){return!o&&o!==0?"-":new Date(typeof o=="number"?o:parseInt(o,10)).toLocaleString("zh-CN",{hour12:!1})}async function C(){B.value=!0;try{const o=await w("project.list",{limit:500},"project list --limit 500 --json",1e4);y.value=Array.isArray(o?.projects)?o.projects:Array.isArray(o)?o:[]}catch(o){d.error("加载失败: "+(o.message||o)),y.value=[]}finally{B.value=!1}}function Z(o){return{onClick:()=>M(o)}}async function M(o){v.value=o,P.value=!0,k.value=!0,h.value=[];try{const f=await w("project.listFiles",{projectId:o.id,limit:200},`project list-files ${o.id} --json`,8e3);h.value=Array.isArray(f?.files)?f.files:[]}catch{h.value=[]}finally{k.value=!1}}async function G(o){try{(await w("project.delete",{id:o.id},`project delete ${o.id} --json`,8e3))?.ok?(d.success(`已删除项目 '${o.name}'`),P.value=!1,await C()):d.error("删除失败")}catch(f){d.error(f.message||String(f))}}function H(){F.value={name:"",description:"",type:"document",rootPath:""},E.value=!0}async function T(){if(!F.value.name.trim()){d.warning("请输入项目名称");return}L.value=!0;try{const o=await w("project.init",{name:F.value.name.trim(),description:F.value.description||null,projectType:F.value.type,rootPath:F.value.rootPath||null},`project init "${F.value.name.trim()}" --type ${F.value.type} --json`,8e3);o?.id?(d.success(`已创建项目 '${o.name}'`),E.value=!1,await C()):d.error("创建失败")}catch(o){d.error(o.message||String(o))}finally{L.value=!1}}const b=u(!1),D=u(!1),j=u({path:"",content:""}),A=u(!1),m=u(!1),R=u({path:""}),n=u(!1),c=u(null),q=u(""),X=u(!1);function ue(){j.value={path:"",content:""},b.value=!0}function ce(){R.value={path:""},A.value=!0}async function N(){if(v.value){k.value=!0;try{const o=await w("project.listFiles",{projectId:v.value.id,limit:200},`project list-files ${v.value.id} --json`,8e3);h.value=Array.isArray(o?.files)?o.files:[]}catch(o){d.error("刷新文件失败: "+(o.message||o))}finally{k.value=!1}}}async function fe(){if(!j.value.path.trim()){d.warning("请输入文件路径");return}if(v.value){D.value=!0;try{const o=await w("project.createFile",{projectId:v.value.id,filePath:j.value.path.trim(),content:j.value.content||""},`project create-file ${v.value.id} "${j.value.path.trim()}" --json`,8e3);o?.id?(d.success(`已创建文件 '${o.file_name}'`),b.value=!1,await N(),await C()):d.error("创建文件失败")}catch(o){d.error(o.message||String(o))}finally{D.value=!1}}}async function pe(){if(!R.value.path.trim()){d.warning("请输入文件夹路径");return}if(v.value){m.value=!0;try{const o=await w("project.createFolder",{projectId:v.value.id,folderPath:R.value.path.trim()},`project create-folder ${v.value.id} "${R.value.path.trim()}" --json`,8e3);o?.id?(d.success(`已创建文件夹 '${o.file_name}'`),A.value=!1,await N(),await C()):d.error("创建文件夹失败")}catch(o){d.error(o.message||String(o))}finally{m.value=!1}}}async function ve(o){try{(await w("project.deleteFile",{fileId:o.id},`project delete-file ${o.id} --json`,8e3))?.deleted?(d.success(`已删除 '${o.file_name}'`),await N(),await C()):d.error("删除失败")}catch(f){d.error(f.message||String(f))}}async function me(o){if(o.is_folder){d.info("文件夹无内容可编辑");return}try{const f=await w("project.getFile",{fileId:o.id},`project get-file ${o.id} --json`,8e3);c.value=o,q.value=f?.content||"",n.value=!0}catch(f){d.error("读取文件失败: "+(f.message||f))}}async function _e(){if(c.value){X.value=!0;try{(await w("project.writeFile",{fileId:c.value.id,content:q.value},`project write-file ${c.value.id} --json`,8e3))?.id?(d.success("已保存"),n.value=!1,await N()):d.error("保存失败")}catch(o){d.error(o.message||String(o))}finally{X.value=!1}}}oe(()=>{C()});const le={t:te,ws:e,isEmbedded:W,callProjectTopic:w,loading:B,projects:y,statusFilter:O,nameFilter:S,detailOpen:P,detail:v,files:h,filesLoading:k,createOpen:E,creating:L,newProject:F,columns:z,countByStatus:V,filteredProjects:J,statusColor:g,syncColor:K,formatTime:Q,loadAll:C,onRowClick:Z,openDetail:M,onDelete:G,onShowCreate:H,onCreate:T,createFileOpen:b,creatingFile:D,newFile:j,createFolderOpen:A,creatingFolder:m,newFolder:R,editFileOpen:n,editingFile:c,editFileContent:q,savingFile:X,openCreateFile:ue,openCreateFolder:ce,refreshFiles:N,onCreateFile:fe,onCreateFolder:pe,onDeleteFile:ve,openEditFile:me,onSaveFile:_e,ref:u,computed:ee,onMounted:oe,get ReloadOutlined(){return Se},get PlusOutlined(){return Oe},get FolderOutlined(){return xe},get FileTextOutlined(){return Ce},get CheckCircleOutlined(){return je},get CheckSquareOutlined(){return be},get FileAddOutlined(){return Fe},get FolderAddOutlined(){return ke},get message(){return d},get useI18n(){return re},get useWsStore(){return ie},get useShellMode(){return de}};return Object.defineProperty(le,"__isScriptSetup",{enumerable:!1,value:!0}),le}},ze={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},Ae={class:"page-title"},Ie={class:"page-sub"},Ue={class:"filter-bar",style:{"margin-bottom":"12px",display:"flex",gap:"12px","align-items":"center"}},he={key:0,style:{"font-size":"12px",color:"#888"}},De={key:0,style:{color:"#888","font-size":"12px"}},Re={key:0},Te={key:1,style:{color:"#888"}},Be=["onClick"],Ee={key:0,style:{color:"#888","font-size":"12px"}};function Le(se,l,te,e,W,w){const B=i("router-link"),y=i("a-button"),O=i("a-space"),S=i("a-statistic"),P=i("a-card"),v=i("a-col"),h=i("a-row"),k=i("a-radio-button"),E=i("a-radio-group"),L=i("a-input-search"),F=i("a-alert"),z=i("a-tag"),V=i("a-popconfirm"),J=i("a-table"),g=i("a-descriptions-item"),K=i("a-descriptions"),Q=i("a-divider"),C=i("a-empty"),Z=i("a-list-item"),M=i("a-list"),G=i("a-spin"),H=i("a-drawer"),T=i("a-input"),b=i("a-form-item"),D=i("a-textarea"),j=i("a-form"),A=i("a-modal"),m=i("a-select-option"),R=i("a-select");return p(),I("div",null,[U("div",ze,[U("div",null,[U("h2",Ae,s(e.t("projects.title")),1),U("p",Ie,[l[17]||(l[17]=r("桌面 / CLI / 手机 三端共享同一份项目数据,Phase 3d sync 自动同步 (",-1)),t(B,{to:"/project-init"},{default:a(()=>[...l[16]||(l[16]=[r("项目初始化 / 环境设置",-1)])]),_:1}),l[18]||(l[18]=r(")",-1))])]),t(O,null,{default:a(()=>[t(y,{loading:e.loading,onClick:e.loadAll},{icon:a(()=>[t(e.ReloadOutlined)]),default:a(()=>[l[19]||(l[19]=r(" 刷新 ",-1))]),_:1},8,["loading"]),t(y,{type:"primary",onClick:e.onShowCreate},{icon:a(()=>[t(e.PlusOutlined)]),default:a(()=>[l[20]||(l[20]=r(" 新建项目 ",-1))]),_:1})]),_:1})]),_(" Stats "),t(h,{gutter:[16,16],style:{"margin-bottom":"20px"}},{default:a(()=>[t(v,{xs:12,sm:8,lg:6},{default:a(()=>[t(P,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[t(S,{title:"总项目",value:e.projects.length,"value-style":{color:"#1677ff",fontSize:"20px"}},{prefix:a(()=>[t(e.FolderOutlined)]),_:1},8,["value"])]),_:1})]),_:1}),t(v,{xs:12,sm:8,lg:6},{default:a(()=>[t(P,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[t(S,{title:"活跃",value:e.countByStatus.active,"value-style":{color:"#52c41a",fontSize:"20px"}},{prefix:a(()=>[t(e.CheckCircleOutlined)]),_:1},8,["value"])]),_:1})]),_:1}),t(v,{xs:12,sm:8,lg:6},{default:a(()=>[t(P,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[t(S,{title:"草稿",value:e.countByStatus.draft,"value-style":{color:"#8c8c8c",fontSize:"20px"}},{prefix:a(()=>[t(e.FileTextOutlined)]),_:1},8,["value"])]),_:1})]),_:1}),t(v,{xs:12,sm:8,lg:6},{default:a(()=>[t(P,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[t(S,{title:"已完成",value:e.countByStatus.completed,"value-style":{color:"#13c2c2",fontSize:"20px"}},{prefix:a(()=>[t(e.CheckSquareOutlined)]),_:1},8,["value"])]),_:1})]),_:1})]),_:1}),_(" Filter "),U("div",Ue,[t(E,{value:e.statusFilter,"onUpdate:value":l[0]||(l[0]=n=>e.statusFilter=n),size:"small","button-style":"solid"},{default:a(()=>[t(k,{value:""},{default:a(()=>[...l[21]||(l[21]=[r("全部",-1)])]),_:1}),t(k,{value:"active"},{default:a(()=>[...l[22]||(l[22]=[r("活跃",-1)])]),_:1}),t(k,{value:"draft"},{default:a(()=>[...l[23]||(l[23]=[r("草稿",-1)])]),_:1}),t(k,{value:"completed"},{default:a(()=>[...l[24]||(l[24]=[r("已完成",-1)])]),_:1}),t(k,{value:"archived"},{default:a(()=>[...l[25]||(l[25]=[r("已归档",-1)])]),_:1})]),_:1},8,["value"]),t(L,{value:e.nameFilter,"onUpdate:value":l[1]||(l[1]=n=>e.nameFilter=n),placeholder:"按名称过滤",style:{"max-width":"260px"},"allow-clear":""},null,8,["value"])]),!e.projects.length&&!e.loading?(p(),x(F,{key:0,type:"info",message:"还没有项目",description:'运行 `cc project init <name>` 或点击右上角"新建项目"按钮创建。桌面 / CLI / 手机三端共享同一份数据。',"show-icon":"",style:{"margin-bottom":"16px"}})):_("v-if",!0),e.projects.length||e.loading?(p(),x(J,{key:1,columns:e.columns,"data-source":e.filteredProjects,loading:e.loading,pagination:{pageSize:20,showSizeChanger:!0},"row-key":"id","custom-row":e.onRowClick},{bodyCell:a(({column:n,record:c})=>[n.key==="id"?(p(),I("code",he,s(c.id.slice(0,8))+"…",1)):n.key==="name"?(p(),I(ne,{key:1},[U("strong",null,s(c.name),1),c.description?(p(),I("div",De,s(c.description),1)):_("v-if",!0)],64)):n.key==="project_type"?(p(),x(z,{key:2},{default:a(()=>[r(s(c.project_type),1)]),_:2},1024)):n.key==="status"?(p(),x(z,{key:3,color:e.statusColor(c.status)},{default:a(()=>[r(s(c.status),1)]),_:2},1032,["color"])):n.key==="sync_status"?(p(),x(z,{key:4,color:e.syncColor(c.sync_status)},{default:a(()=>[r(s(c.sync_status||"unknown"),1)]),_:2},1032,["color"])):n.key==="updated_at"?(p(),I(ne,{key:5},[r(s(e.formatTime(c.updated_at)),1)],64)):n.key==="actions"?(p(),x(O,{key:6,onClick:l[2]||(l[2]=ge(()=>{},["stop"]))},{default:a(()=>[t(y,{size:"small",onClick:q=>e.openDetail(c)},{default:a(()=>[...l[26]||(l[26]=[r("详情",-1)])]),_:1},8,["onClick"]),t(V,{title:`删除项目 '${c.name}' ?`,"ok-text":"删除","ok-type":"danger","cancel-text":"取消",onConfirm:q=>e.onDelete(c)},{default:a(()=>[t(y,{size:"small",danger:""},{default:a(()=>[...l[27]||(l[27]=[r("删除",-1)])]),_:1})]),_:1},8,["title","onConfirm"])]),_:2},1024)):_("v-if",!0)]),_:1},8,["data-source","loading"])):_("v-if",!0),_(" Detail drawer "),t(H,{open:e.detailOpen,"onUpdate:open":l[3]||(l[3]=n=>e.detailOpen=n),title:e.detail?.name||"项目详情",width:"640",placement:"right"},{default:a(()=>[e.detail?(p(),x(K,{key:0,column:1,bordered:"",size:"small"},{default:a(()=>[t(g,{label:"ID"},{default:a(()=>[U("code",null,s(e.detail.id),1)]),_:1}),t(g,{label:"名称"},{default:a(()=>[r(s(e.detail.name),1)]),_:1}),t(g,{label:"描述"},{default:a(()=>[r(s(e.detail.description||"-"),1)]),_:1}),t(g,{label:"类型"},{default:a(()=>[t(z,null,{default:a(()=>[r(s(e.detail.project_type),1)]),_:1})]),_:1}),t(g,{label:"状态"},{default:a(()=>[t(z,{color:e.statusColor(e.detail.status)},{default:a(()=>[r(s(e.detail.status),1)]),_:1},8,["color"])]),_:1}),t(g,{label:"同步状态"},{default:a(()=>[t(z,{color:e.syncColor(e.detail.sync_status)},{default:a(()=>[r(s(e.detail.sync_status||"unknown"),1)]),_:1},8,["color"])]),_:1}),t(g,{label:"用户"},{default:a(()=>[r(s(e.detail.user_id),1)]),_:1}),t(g,{label:"根路径"},{default:a(()=>[e.detail.root_path?(p(),I("code",Re,s(e.detail.root_path),1)):(p(),I("span",Te,"(无)"))]),_:1}),t(g,{label:"文件数"},{default:a(()=>[r(s(e.detail.file_count||0),1)]),_:1}),t(g,{label:"创建"},{default:a(()=>[r(s(e.formatTime(e.detail.created_at)),1)]),_:1}),t(g,{label:"更新"},{default:a(()=>[r(s(e.formatTime(e.detail.updated_at)),1)]),_:1})]),_:1})):_("v-if",!0),t(Q,null,{default:a(()=>[...l[28]||(l[28]=[r("文件",-1)])]),_:1}),_(" Sub-phase 7.3 (2026-05-17): 文件 CRUD toolbar "),t(O,{style:{"margin-bottom":"12px"}},{default:a(()=>[t(y,{size:"small",type:"primary",disabled:!e.detail,onClick:e.openCreateFile},{default:a(()=>[t(e.FileAddOutlined),l[29]||(l[29]=r(" 新建文件 ",-1))]),_:1},8,["disabled"]),t(y,{size:"small",disabled:!e.detail,onClick:e.openCreateFolder},{default:a(()=>[t(e.FolderAddOutlined),l[30]||(l[30]=r(" 新建文件夹 ",-1))]),_:1},8,["disabled"])]),_:1}),t(G,{spinning:e.filesLoading},{default:a(()=>[!e.files.length&&!e.filesLoading?(p(),x(C,{key:0,description:"无文件 (点上方按钮新建)"})):(p(),x(M,{key:1,size:"small","data-source":e.files},{renderItem:a(({item:n})=>[t(Z,null,{extra:a(()=>[t(O,null,{default:a(()=>[n.file_size?(p(),I("span",Ee,s(n.file_size)+" B",1)):_("v-if",!0),t(V,{title:`删除 ${n.is_folder?"文件夹":"文件"} '${n.file_name}' ?`,"ok-text":"删除","ok-type":"danger","cancel-text":"取消",onConfirm:c=>e.onDeleteFile(n)},{default:a(()=>[t(y,{size:"small",danger:""},{default:a(()=>[...l[31]||(l[31]=[r("×",-1)])]),_:1})]),_:1},8,["title","onConfirm"])]),_:2},1024)]),default:a(()=>[U("span",{style:{cursor:"pointer"},onClick:c=>e.openEditFile(n)},s(n.is_folder?"📁":"📄")+" "+s(n.file_path),9,Be)]),_:2},1024)]),_:1},8,["data-source"]))]),_:1},8,["spinning"])]),_:1},8,["open","title"]),_(" Sub-phase 7.3: Create file modal "),t(A,{open:e.createFileOpen,"onUpdate:open":l[6]||(l[6]=n=>e.createFileOpen=n),title:"新建文件","confirm-loading":e.creatingFile,"ok-text":"创建","cancel-text":"取消",onOk:e.onCreateFile},{default:a(()=>[t(j,{layout:"vertical"},{default:a(()=>[t(b,{label:"文件路径(项目内)",required:""},{default:a(()=>[t(T,{value:e.newFile.path,"onUpdate:value":l[4]||(l[4]=n=>e.newFile.path=n),placeholder:"例如 README.md 或 src/main.kt"},null,8,["value"])]),_:1}),t(b,{label:"初始内容(可选)"},{default:a(()=>[t(D,{value:e.newFile.content,"onUpdate:value":l[5]||(l[5]=n=>e.newFile.content=n),rows:6,placeholder:"留空创建空文件"},null,8,["value"])]),_:1})]),_:1})]),_:1},8,["open","confirm-loading"]),_(" Sub-phase 7.3: Create folder modal "),t(A,{open:e.createFolderOpen,"onUpdate:open":l[8]||(l[8]=n=>e.createFolderOpen=n),title:"新建文件夹","confirm-loading":e.creatingFolder,"ok-text":"创建","cancel-text":"取消",onOk:e.onCreateFolder},{default:a(()=>[t(j,{layout:"vertical"},{default:a(()=>[t(b,{label:"文件夹路径(项目内)",required:""},{default:a(()=>[t(T,{value:e.newFolder.path,"onUpdate:value":l[7]||(l[7]=n=>e.newFolder.path=n),placeholder:"例如 src/utils"},null,8,["value"])]),_:1})]),_:1})]),_:1},8,["open","confirm-loading"]),_(" Sub-phase 7.3: Edit file content modal "),t(A,{open:e.editFileOpen,"onUpdate:open":l[10]||(l[10]=n=>e.editFileOpen=n),title:`编辑 ${e.editingFile?.file_name||""}`,"confirm-loading":e.savingFile,"ok-text":"保存","cancel-text":"取消",onOk:e.onSaveFile,width:"720"},{default:a(()=>[t(D,{value:e.editFileContent,"onUpdate:value":l[9]||(l[9]=n=>e.editFileContent=n),rows:18,"auto-size":{minRows:12,maxRows:24},style:{"font-family":"monospace"}},null,8,["value"])]),_:1},8,["open","title","confirm-loading"]),_(" Create modal "),t(A,{open:e.createOpen,"onUpdate:open":l[15]||(l[15]=n=>e.createOpen=n),title:"新建项目","confirm-loading":e.creating,"ok-text":"创建","cancel-text":"取消",onOk:e.onCreate},{default:a(()=>[t(j,{layout:"vertical"},{default:a(()=>[t(b,{label:"项目名称",required:""},{default:a(()=>[t(T,{value:e.newProject.name,"onUpdate:value":l[11]||(l[11]=n=>e.newProject.name=n),placeholder:"例如:旅行计划-上海"},null,8,["value"])]),_:1}),t(b,{label:"描述"},{default:a(()=>[t(D,{value:e.newProject.description,"onUpdate:value":l[12]||(l[12]=n=>e.newProject.description=n),rows:2},null,8,["value"])]),_:1}),t(b,{label:"类型"},{default:a(()=>[t(R,{value:e.newProject.type,"onUpdate:value":l[13]||(l[13]=n=>e.newProject.type=n)},{default:a(()=>[t(m,{value:"document"},{default:a(()=>[...l[32]||(l[32]=[r("文档 (document)",-1)])]),_:1}),t(m,{value:"data"},{default:a(()=>[...l[33]||(l[33]=[r("数据 (data)",-1)])]),_:1}),t(m,{value:"web"},{default:a(()=>[...l[34]||(l[34]=[r("Web",-1)])]),_:1}),t(m,{value:"app"},{default:a(()=>[...l[35]||(l[35]=[r("应用 (app)",-1)])]),_:1}),t(m,{value:"presentation"},{default:a(()=>[...l[36]||(l[36]=[r("演示文稿",-1)])]),_:1}),t(m,{value:"spreadsheet"},{default:a(()=>[...l[37]||(l[37]=[r("表格",-1)])]),_:1}),t(m,{value:"design"},{default:a(()=>[...l[38]||(l[38]=[r("设计",-1)])]),_:1}),t(m,{value:"code"},{default:a(()=>[...l[39]||(l[39]=[r("代码",-1)])]),_:1}),t(m,{value:"workflow"},{default:a(()=>[...l[40]||(l[40]=[r("工作流",-1)])]),_:1}),t(m,{value:"knowledge"},{default:a(()=>[...l[41]||(l[41]=[r("知识库",-1)])]),_:1})]),_:1},8,["value"])]),_:1}),t(b,{label:"根路径 (可选)"},{default:a(()=>[t(T,{value:e.newProject.rootPath,"onUpdate:value":l[14]||(l[14]=n=>e.newProject.rootPath=n),placeholder:"留空则仅元数据"},null,8,["value"])]),_:1})]),_:1})]),_:1},8,["open","confirm-loading"])])}const We=we(Pe,[["render",Le],["__scopeId","data-v-019ac5aa"],["__file","/tmp/cc-web-panel-EZK4no/repo/packages/web-panel/src/views/Projects.vue"]]);export{We as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{E,b as w,r as b,I as m,J as y,U as a,R as g,c as i,K as u,V as h,F as C,Z as L,N as O,o as M,P as p,Q as S,S as R}from"./vendor-Bn1JzzAn.js";import{u as I,_ as q}from"./index-Ci3y1ZAv.js";import{u as N}from"./useShellMode-CgR0wCYM.js";import{p as P}from"./parsers-UEvh_ShA.js";import{u as z}from"./chat-ax7193uU.js";import{aa as V,aq as j,R as B}from"./icons-DG5UD-6K.js";const A=E("skills",()=>{const _=b(!1),t=b([]),n=b(""),e=b("all"),k=w(()=>{const o=new Set(["all"]);return t.value.forEach(l=>{l.category&&o.add(l.category),l.executionMode&&o.add(l.executionMode)}),[...o]}),v=w(()=>{let o=t.value;if(e.value!=="all"&&(o=o.filter(l=>l.category===e.value||l.executionMode===e.value)),n.value){const l=n.value.toLowerCase();o=o.filter(d=>d.name?.toLowerCase().includes(l)||d.description?.toLowerCase().includes(l)||d.title?.toLowerCase().includes(l))}return o});async function f(){const o=I();_.value=!0;try{if(N().isEmbedded){const c=await o.sendRaw({type:"skill.list"},2e4);c?.ok&&Array.isArray(c.result?.skills)?t.value=c.result.skills:(console.error("skill.list custom topic failed:",c?.error),t.value=[]);return}const{output:l}=await o.execute("skill list",2e4),d=P(l);t.value=d}catch(l){console.error("Failed to load skills:",l)}finally{_.value=!1}}return{loading:_,allSkills:t,searchQuery:n,selectedCategory:e,categories:k,filteredSkills:v,loadSkills:f}}),F={__name:"Skills",setup(_,{expose:t}){t();const n=A(),e=z(),k=O(),v=w(()=>n.categories.filter(r=>r!=="all").slice(0,6));function f(r){return{"built-in":"内置","cli-direct":"CLI",agent:"Agent","llm-query":"LLM",hybrid:"混合",workspace:"工作区",marketplace:"市场"}[r]||r}function o(r){return{"cli-direct":"CLI",agent:"Agent","llm-query":"LLM",hybrid:"混合","built-in":"内置"}[r]||r||"未知"}function l(r){return{"cli-direct":"cyan",agent:"purple","llm-query":"blue",hybrid:"orange","built-in":"green"}[r]||"default"}async function d(r){await e.createSession("agent"),k.push("/chat"),setTimeout(()=>{e.currentSessionId&&e.sendMessage(e.currentSessionId,`/skill run ${r}`)},300)}M(()=>{n.allSkills.length||n.loadSkills()});const c={skillsStore:n,chatStore:e,router:k,displayCategories:v,catLabel:f,modeLabel:o,modeColor:l,runSkill:d,computed:w,onMounted:M,get useRouter(){return O},get ReloadOutlined(){return B},get PlayCircleOutlined(){return j},get AppstoreOutlined(){return V},get useSkillsStore(){return A},get useChatStore(){return z}};return Object.defineProperty(c,"__isScriptSetup",{enumerable:!1,value:!0}),c}},Q={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},U={class:"page-sub"},K={style:{display:"flex",gap:"12px","margin-bottom":"20px","flex-wrap":"wrap"}},T={key:0,style:{"text-align":"center",padding:"60px"}},Z={class:"skills-grid"},D={style:{display:"flex","justify-content":"space-between","align-items":"flex-start"}},G={style:{flex:"1","min-width":"0"}},J={style:{"font-weight":"500",color:"#e0e0e0","font-size":"14px","margin-bottom":"4px","font-family":"monospace"}},W={style:{color:"var(--text-secondary)","font-size":"12px","line-height":"1.5"}},H={style:{"margin-left":"12px","flex-shrink":"0"}},X={style:{"margin-top":"10px",display:"flex","justify-content":"flex-end"}},Y={style:{"text-align":"center",padding:"60px",color:"var(--text-muted)"}};function $(_,t,n,e,k,v){const f=m("a-button"),o=m("a-input-search"),l=m("a-radio-button"),d=m("a-radio-group"),c=m("a-spin"),r=m("a-tag"),x=m("a-card");return p(),y("div",null,[a("div",Q,[a("div",null,[t[3]||(t[3]=a("h2",{class:"page-title"},"技能管理",-1)),a("p",U,g(e.skillsStore.allSkills.length)+" 个可用技能",1)]),i(f,{type:"primary",ghost:"",loading:e.skillsStore.loading,onClick:t[0]||(t[0]=s=>e.skillsStore.loadSkills())},{icon:u(()=>[i(e.ReloadOutlined)]),default:u(()=>[t[4]||(t[4]=S(" 刷新 ",-1))]),_:1},8,["loading"])]),h(" Search & Filter "),a("div",K,[i(o,{value:e.skillsStore.searchQuery,"onUpdate:value":t[1]||(t[1]=s=>e.skillsStore.searchQuery=s),placeholder:"搜索技能名称或描述...",style:{width:"300px"},"allow-clear":""},null,8,["value"]),i(d,{value:e.skillsStore.selectedCategory,"onUpdate:value":t[2]||(t[2]=s=>e.skillsStore.selectedCategory=s),"button-style":"solid"},{default:u(()=>[i(l,{value:"all"},{default:u(()=>[...t[5]||(t[5]=[S("全部",-1)])]),_:1}),(p(!0),y(C,null,L(e.displayCategories,s=>(p(),R(l,{key:s,value:s},{default:u(()=>[S(g(e.catLabel(s)),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),h(" Loading State "),e.skillsStore.loading?(p(),y("div",T,[i(c,{size:"large"}),t[6]||(t[6]=a("div",{style:{color:"var(--text-muted)","margin-top":"12px"}},"加载技能中...",-1))])):e.skillsStore.filteredSkills.length?(p(),y(C,{key:1},[h(" Skills Grid "),a("div",Z,[(p(!0),y(C,null,L(e.skillsStore.filteredSkills,s=>(p(),R(x,{key:s.name,class:"skill-card",size:"small",hoverable:"",style:{background:"var(--bg-card)","border-color":"var(--border-color)",cursor:"default"}},{default:u(()=>[a("div",D,[a("div",G,[a("div",J,g(s.name),1),a("div",W,g(s.description||"暂无描述"),1)]),a("div",H,[i(r,{color:e.modeColor(s.executionMode),style:{"font-size":"10px"}},{default:u(()=>[S(g(e.modeLabel(s.executionMode)),1)]),_:2},1032,["color"])])]),a("div",X,[i(f,{size:"small",type:"primary",ghost:"",onClick:ee=>e.runSkill(s.name)},{icon:u(()=>[i(e.PlayCircleOutlined)]),default:u(()=>[t[7]||(t[7]=S(" 运行 ",-1))]),_:1},8,["onClick"])])]),_:2},1024))),128))])],2112)):(p(),y(C,{key:2},[h(" Empty State "),a("div",Y,[i(e.AppstoreOutlined,{style:{"font-size":"48px","margin-bottom":"16px",display:"block"}}),a("div",null,g(e.skillsStore.allSkills.length?"没有匹配的技能":"点击刷新加载技能列表"),1)])],2112))])}const ie=q(F,[["render",$],["__scopeId","data-v-d64d43f5"],["__file","/tmp/cc-web-panel-EZK4no/repo/packages/web-panel/src/views/Skills.vue"]]);export{ie as default};
|