chainlesschain 0.166.14 → 0.166.15
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/package.json +1 -1
- package/src/assets/web-panel/assets/{AIOps-C8SyFhOo.js → AIOps-To-6rimH.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-Dup5gFK0.js → ActionButton-CpdCnTv3.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-8FyOWA7V.js → Analytics-DK7VNES_.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-DBzdU9dg.js → AppLayout-NZ5FvhCx.js} +5 -5
- package/src/assets/web-panel/assets/{Artifacts-C_0Z8gNy.js → Artifacts-NXceQPmN.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-Cf2a-58m.js → Audit-B2d64DH2.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-M7w-2zgB.js → BackgroundAgents-ByYgvEVY.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-CCTHQXoL.js → Backup-BXvQLDvN.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-DjXpeFwJ.js → BaseInput-C4GZk-As.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-cAvchsJU.js → Chat-CvPuohL8.js} +5 -5
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-DvEvxlZv.js → ChatBubbleRenderer-DTftcclX.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-DKs6qvOn.js → Checkbox-C8dQGIqD.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-DlkA7b9X.js → Codegen-DRM6S1W4.js} +1 -1
- package/src/assets/web-panel/assets/{Col-CkfdKhyJ.js → Col-BDM8l-r5.js} +1 -1
- package/src/assets/web-panel/assets/{Community-iNXMHzj6.js → Community-Bvmfi1fX.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-DQxPEd09.js → Compact-DGQTCima.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-CSKvMCjs.js → Compliance-D_0C-2P6.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-CkWqazpD.js → Cowork-3C_q99ok.js} +3 -3
- package/src/assets/web-panel/assets/{Cron-k6W8IzhB.js → Cron-CIiMQ1Hl.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-C8MS1OuY.js → Crosschain-peebGnES.js} +1 -1
- package/src/assets/web-panel/assets/{DID-DJuCcgiQ.js → DID-OkX4KB9T.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-LeThKzp3.js → Dashboard-D9lm0Wxa.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-BvxwgpE4.js → Dropdown-CitActXx.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-n3e_a1M3.js → EmailListRenderer-DSmFkNKV.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-509W6W6v.js → FamilyGuardDashboard-CBWAi8XL.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-xgZReQm0.js → Federation-afj8jDcp.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-jZOhKcQx.js → FormItemContext-Dabt59KY.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-Jo0ULzHv.js → GenericCardRenderer-BQpXA9kj.js} +1 -1
- package/src/assets/web-panel/assets/{Git-BsRcyWQP.js → Git-D2p2Moo1.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-JlpMYTAk.js → Governance-DkFfPykv.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-CUEz872-.js → Inference-C1DKpeN2.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-DgrvvEDU.js → KnowledgeGraph-CjfVg4oQ.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-Df-KY4U3.js → Logs-D-zMvdSf.js} +2 -2
- package/src/assets/web-panel/assets/MarkdownRenderer-jzEpGkbc.js +1 -0
- package/src/assets/web-panel/assets/{Marketplace-kPZDTOeI.js → Marketplace-DfAjJLyS.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-CRRzPqNX.js → McpTools-BGDHQES1.js} +3 -3
- package/src/assets/web-panel/assets/{Memory-D6pNSkg9.js → Memory-BYqrGAPS.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-g-pvtwRC.js → MobileBridge-CQ6FEtty.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-Bzayfrfe.js → MobileProjects-BpMvh5JW.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-B7S3W-XL.js → Mtc-CWH25SrU.js} +2 -2
- package/src/assets/web-panel/assets/{MtcAudit-B8OMEWVb.js → MtcAudit-D6DiLmei.js} +2 -2
- package/src/assets/web-panel/assets/{Multisig-CowRp7GH.js → Multisig-BSxRN4jD.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-BkQNyi4c.js → NLProgramming-C0FDPKT4.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-Cm7gtkKz.js → Notes-VKR78bH-.js} +4 -4
- package/src/assets/web-panel/assets/{NotificationSettings-CbPTVh9m.js → NotificationSettings-DLSklSZB.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-Dswi26mJ.js → OrderTableRenderer-Dpj7D6tC.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-BkjQ9yy7.js → Organization-BB3pB27e.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-DmRFXP7Y.js → Overflow-Cr7bzwcs.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-DQE1toAu.js → P2P-D1fkMMzI.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-BujyoDRG.js → PdhVaultBrowser-BiDEbLNA.js} +5 -5
- package/src/assets/web-panel/assets/{Permissions-xSjfOaiU.js → Permissions-c3Ijv0v4.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-B9ICLqVP.js → PersonalDataHub-BJwbh3P2.js} +4 -4
- package/src/assets/web-panel/assets/{Pipeline-CUNwyN9E.js → Pipeline-C4fhXafB.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-SOoCricX.js → Privacy-DzSx3CD-.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-CSaFul0F.js → ProjectInit-D9fL5fED.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-CueiB_oe.js → ProjectSettings-CB5FVrOR.js} +2 -2
- package/src/assets/web-panel/assets/{Projects-BOeXvU7y.js → Projects-DWhwdgfY.js} +1 -1
- package/src/assets/web-panel/assets/{Providers-CTqf_31h.js → Providers-B9ZH4faS.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-C8ZP31E9.js → QrScannerModal-BLKDHT8_.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-CPgn4713.js → QuickAsk-D1oYUcSY.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-8_e0zw0i.js → Recommend-CC2nmrOD.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-iT7lbGqw.js → RemoteSession-qW9QF4-r.js} +3 -3
- package/src/assets/web-panel/assets/{Reputation-B4q9SUOz.js → Reputation-BDWqfzcr.js} +1 -1
- package/src/assets/web-panel/assets/{Row-CA_nASyL.js → Row-BBV2iCjT.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-Cwb0E3yv.js → RssFeed-CcwrNwZB.js} +3 -3
- package/src/assets/web-panel/assets/{Search-D9iVsOxJ.js → Search-Dr6fZ0D_.js} +1 -1
- package/src/assets/web-panel/assets/{Security-DPLbYchG.js → Security-BPzaoCU6.js} +4 -4
- package/src/assets/web-panel/assets/{Services-DGMVL_LF.js → Services-BoKUU1I_.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-B_6kym0D.js → Skeleton-C8lT8GUg.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-Ds6r0dXB.js → Skills-DPpWeicz.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-BLHAbBhb.js → Sla-UiijzpMU.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-CZuddd14.js → SpeechSettings-DoofrLwS.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-CdBq7oSl.js → SyncSettings-DXnyfTDw.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-DfT60Nyl.js → Tasks-g_WHjKeg.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-RLfsKy2V.js → Templates-DRuCh9g2.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-Cw8xCNLE.js → Tenant-QHIq1pH1.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-BOUkNu4f.js → Terminal-G0fuI216.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-CgGZWaRm.js → TimelineRenderer-4MT7SpGk.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-CpwjVyir.js → Tokens-B5xT5umA.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-DL21H-eb.js → Trigger-D7HPbNgc.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-B3ffFclW.js → Trust-CxH69dU5.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-CkBeb5aI.js → UkeySign-CPPosveH.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-U2iVaE3r.js → VideoEditing-Du5lGwAt.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-CQk2wzYd.js → Wallet-BBIGNESK.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-DYIuIYzT.js → WebAuthn-Cc3HSGmv.js} +3 -3
- package/src/assets/web-panel/assets/{WorkflowEditor-tg1c2mZQ.js → WorkflowEditor-DBoVPNCh.js} +1 -1
- package/src/assets/web-panel/assets/{chat-CtL61spq.js → chat-DHcjgiem.js} +1 -1
- package/src/assets/web-panel/assets/{colors-DKpbeo8s.js → colors-DrRrvJIV.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-gPZsrswt.js → compact-item-BuY_sAoN.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-CfHlwzVr.js → createContext-CepH1Fha.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-DIb8j04q.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-MV47g_6X.js → hasIn-Dh80Ot6o.js} +1 -1
- package/src/assets/web-panel/assets/{index-ExAGPAnX.js → index-0TYLnd11.js} +1 -1
- package/src/assets/web-panel/assets/{index-fYcS7NS0.js → index-9crgJ3Id.js} +1 -1
- package/src/assets/web-panel/assets/{index-Zvkt9xqi.js → index-A5lVwYVq.js} +1 -1
- package/src/assets/web-panel/assets/{index-DU4rZpiK.js → index-B0rvJjId.js} +1 -1
- package/src/assets/web-panel/assets/{index-BQp5M0s1.js → index-B9Gh-SOn.js} +1 -1
- package/src/assets/web-panel/assets/index-BJc3t4PC.js +1 -0
- package/src/assets/web-panel/assets/{index-6G0ETFTW.js → index-BPDEOOlA.js} +1 -1
- package/src/assets/web-panel/assets/{index-DMMvlLp9.js → index-BW9Pycxh.js} +1 -1
- package/src/assets/web-panel/assets/{index-BN-wxSQ8.js → index-BiZQooWK.js} +1 -1
- package/src/assets/web-panel/assets/{index-yxxXlqBA.js → index-BnVIvc15.js} +1 -1
- package/src/assets/web-panel/assets/{index-Df9sWKpl.js → index-BoRy2yup.js} +1 -1
- package/src/assets/web-panel/assets/{index-Ddcpj1El.js → index-BtqigRzf.js} +1 -1
- package/src/assets/web-panel/assets/{index-DGtEBodr.js → index-By0qqC3S.js} +1 -1
- package/src/assets/web-panel/assets/{index-C_B9LiKs.js → index-C10033eO.js} +1 -1
- package/src/assets/web-panel/assets/{index-CmPJpLoD.js → index-C5vhNRqS.js} +1 -1
- package/src/assets/web-panel/assets/{index-bSFrAszw.js → index-CEfVkKIY.js} +1 -1
- package/src/assets/web-panel/assets/{index-BjlPD7GO.js → index-CNQK9DIr.js} +1 -1
- package/src/assets/web-panel/assets/{index-CB1HnbNK.js → index-CUnd5hyp.js} +1 -1
- package/src/assets/web-panel/assets/{index-BOyGUuBE.js → index-CW_23-gU.js} +1 -1
- package/src/assets/web-panel/assets/{index-D1XB5-t5.js → index-CYydOga6.js} +1 -1
- package/src/assets/web-panel/assets/{index-C9RF4ieu.js → index-Ca5d64IH.js} +1 -1
- package/src/assets/web-panel/assets/{index-DnZ_zS1M.js → index-CiUx-tkV.js} +1 -1
- package/src/assets/web-panel/assets/index-CkksSUnI.js +1 -0
- package/src/assets/web-panel/assets/{index-xUlgG0Xe.js → index-CnRK8_Dd.js} +1 -1
- package/src/assets/web-panel/assets/{index-BBw52sEl.js → index-Cx21_p3m.js} +1 -1
- package/src/assets/web-panel/assets/{index-DfLyHCWi.js → index-D5_K3GKu.js} +1 -1
- package/src/assets/web-panel/assets/{index-CRv_uMLV.js → index-D6tOVlq-.js} +1 -1
- package/src/assets/web-panel/assets/{index-DsH-i_3d.js → index-D7lstbTh.js} +1 -1
- package/src/assets/web-panel/assets/{index-Rb7CRMw9.js → index-DRy3_beb.js} +1 -1
- package/src/assets/web-panel/assets/{index-D_Pl1GnW.js → index-DUNyTmkS.js} +1 -1
- package/src/assets/web-panel/assets/{index-DIeJmlAA.js → index-DWANFMlq.js} +1 -1
- package/src/assets/web-panel/assets/{index-CzfxTSPW.js → index-DYN49m7k.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cjv0kKCU.js → index-DkZP_QaB.js} +1 -1
- package/src/assets/web-panel/assets/{index-C6nC_DyY.js → index-DuRYBWrj.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dd19vRwy.js → index-DuSUCH7h.js} +1 -1
- package/src/assets/web-panel/assets/{index-CmM9jqwe.js → index-LBkSOwky.js} +1 -1
- package/src/assets/web-panel/assets/{index-srBc9U_s.js → index-NS9dW1F1.js} +1 -1
- package/src/assets/web-panel/assets/{index-C4lF-f_z.js → index-hYaigdGm.js} +1 -1
- package/src/assets/web-panel/assets/{index-C9gtY4nG.js → index-zGH9zH3w.js} +3 -3
- package/src/assets/web-panel/assets/{initDefaultProps-BeOZoSZ4.js → initDefaultProps-nI_X3wKl.js} +1 -1
- package/src/assets/web-panel/assets/{motion-BXE8VMKx.js → motion-LUHbQu_R.js} +1 -1
- package/src/assets/web-panel/assets/{move-I9sdvPGX.js → move-DHI_KvJt.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-d25zrJd0.js → mtc-parser-AYdL_7Mo.js} +1 -1
- package/src/assets/web-panel/assets/{omit-D71V_T4e.js → omit-CtV3HRKa.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-BNZKpIAR.js → pickAttrs-CcJLTOu4.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-jOcgxTTz.js → placementArrow-DHbiLUps.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-pta_O8AU.js → responsiveObserve-BC2DGkWP.js} +1 -1
- package/src/assets/web-panel/assets/{slide-Dlq6om7z.js → slide-B4ga4pPY.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-BnkO_yRv.js → statusUtils-hzphgKfH.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-p8NfWmcG.js → styleChecker-IfN9Bxoi.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-KcjZZ5U7.js → useFlexGapSupport-pcGKJ4pT.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-gqonDMWB.js → useFs-COXhQpTG.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-jIIfE4go.js → usePersonalDataHub-xp9F9szv.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-Dyo7fBrM.js → vnode-BdSQy1Ve.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-6l8BMg9W.js → zoom-CHCt5P55.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/commands/agent.js +62 -11
- package/src/commands/team.js +95 -3
- package/src/data/changelog.json +16 -3
- package/src/harness/worktree-isolator.js +74 -9
- package/src/lib/agent-team/team-graph-runtime-adapter.js +6 -0
- package/src/lib/agent-team/team-runner.js +4 -0
- package/src/lib/agent-team/team-worktree.js +4 -0
- package/src/lib/formal-quality-eval-runtime.js +92 -0
- package/src/lib/process-execution-broker/index.js +32 -0
- package/src/lib/process-execution-broker/platform-sandbox.js +5 -4
- package/src/lib/secure-fs.js +25 -2
- package/src/runtime/agent-core.js +17 -5
- package/src/runtime/headless-runner.js +16 -9
- package/src/assets/web-panel/assets/MarkdownRenderer-BEPDcSwz.js +0 -1
- package/src/assets/web-panel/assets/devWarning-DdqnMhzi.js +0 -1
- package/src/assets/web-panel/assets/index-BcK8o4ke.js +0 -1
- package/src/assets/web-panel/assets/index-DvbAjyYI.js +0 -1
|
@@ -173,7 +173,7 @@ function parseRegisteredWorktrees(output) {
|
|
|
173
173
|
|
|
174
174
|
function readRegisteredWorktrees(repoDir) {
|
|
175
175
|
return parseRegisteredWorktrees(
|
|
176
|
-
|
|
176
|
+
gitExecArgs(["worktree", "list", "--porcelain"], repoDir),
|
|
177
177
|
);
|
|
178
178
|
}
|
|
179
179
|
|
|
@@ -251,10 +251,16 @@ function assertNoSymlinkAncestors(root, target, label) {
|
|
|
251
251
|
}
|
|
252
252
|
}
|
|
253
253
|
|
|
254
|
+
function managedWorktreePathFromContext(context, branchName) {
|
|
255
|
+
return resolve(context.managedRoot, branchName.replace(/\//g, "-"));
|
|
256
|
+
}
|
|
257
|
+
|
|
254
258
|
export function managedWorktreePath(repoDir, branchName) {
|
|
255
259
|
assertSafeGitRef(branchName, "branch name");
|
|
256
|
-
|
|
257
|
-
|
|
260
|
+
return managedWorktreePathFromContext(
|
|
261
|
+
repositoryManagementContext(repoDir),
|
|
262
|
+
branchName,
|
|
263
|
+
);
|
|
258
264
|
}
|
|
259
265
|
|
|
260
266
|
/**
|
|
@@ -262,10 +268,11 @@ export function managedWorktreePath(repoDir, branchName) {
|
|
|
262
268
|
* removal. Managed worktrees are direct children of `<repo>/.worktrees` and,
|
|
263
269
|
* when a branch is known, have exactly the deterministic path created for it.
|
|
264
270
|
*/
|
|
265
|
-
|
|
271
|
+
function assertManagedWorktreePathWithContext(
|
|
266
272
|
repoDir,
|
|
267
273
|
worktreePath,
|
|
268
274
|
{ branchName = null } = {},
|
|
275
|
+
context,
|
|
269
276
|
) {
|
|
270
277
|
if (
|
|
271
278
|
typeof repoDir !== "string" ||
|
|
@@ -280,7 +287,6 @@ export function assertManagedWorktreePath(
|
|
|
280
287
|
assertSafeGitRef(branchName, "branch name");
|
|
281
288
|
}
|
|
282
289
|
|
|
283
|
-
const context = repositoryManagementContext(repoDir);
|
|
284
290
|
const candidate = resolve(worktreePath);
|
|
285
291
|
const candidatePath = canonicalExistingPrefixPath(candidate);
|
|
286
292
|
const candidateIdentity = normalizeFilesystemPath(candidatePath);
|
|
@@ -335,6 +341,19 @@ export function assertManagedWorktreePath(
|
|
|
335
341
|
return candidatePath;
|
|
336
342
|
}
|
|
337
343
|
|
|
344
|
+
export function assertManagedWorktreePath(
|
|
345
|
+
repoDir,
|
|
346
|
+
worktreePath,
|
|
347
|
+
options = {},
|
|
348
|
+
) {
|
|
349
|
+
return assertManagedWorktreePathWithContext(
|
|
350
|
+
repoDir,
|
|
351
|
+
worktreePath,
|
|
352
|
+
options,
|
|
353
|
+
repositoryManagementContext(repoDir),
|
|
354
|
+
);
|
|
355
|
+
}
|
|
356
|
+
|
|
338
357
|
function pathSeparator() {
|
|
339
358
|
return process.platform === "win32" ? "\\" : "/";
|
|
340
359
|
}
|
|
@@ -404,10 +423,11 @@ export function createWorktree(repoDir, branchName, baseBranch, options = {}) {
|
|
|
404
423
|
|
|
405
424
|
const context = repositoryManagementContext(repoDir);
|
|
406
425
|
ensureManagedWorktreeExcluded(context);
|
|
407
|
-
const worktreePath =
|
|
426
|
+
const worktreePath = assertManagedWorktreePathWithContext(
|
|
408
427
|
repoDir,
|
|
409
|
-
|
|
428
|
+
managedWorktreePathFromContext(context, branchName),
|
|
410
429
|
{ branchName },
|
|
430
|
+
context,
|
|
411
431
|
);
|
|
412
432
|
|
|
413
433
|
if (existsSync(worktreePath)) {
|
|
@@ -449,7 +469,12 @@ export function createWorktree(repoDir, branchName, baseBranch, options = {}) {
|
|
|
449
469
|
)
|
|
450
470
|
.trim()
|
|
451
471
|
.toLowerCase();
|
|
452
|
-
|
|
472
|
+
assertManagedWorktreePathWithContext(
|
|
473
|
+
repoDir,
|
|
474
|
+
worktreePath,
|
|
475
|
+
{ branchName },
|
|
476
|
+
repositoryManagementContext(repoDir),
|
|
477
|
+
);
|
|
453
478
|
// Sparse checkout: only materialize the packages this task needs. For a
|
|
454
479
|
// large monorepo this cuts worktree creation time and disk. Cone mode wants
|
|
455
480
|
// directory paths — our sparsePaths are package dirs. Fail-closed on unsafe
|
|
@@ -1067,6 +1092,44 @@ export function previewWorktreeMerge(repoDir, branchName, options = {}) {
|
|
|
1067
1092
|
throw new Error(`Worktree not found for branch: ${branchName}`);
|
|
1068
1093
|
}
|
|
1069
1094
|
|
|
1095
|
+
// Prefer Git's read-only merge-tree for the overwhelmingly common clean
|
|
1096
|
+
// preview. It computes the same recursive merge result without mutating the
|
|
1097
|
+
// task worktree and then running a second process to abort it. A conflict or
|
|
1098
|
+
// an older Git falls back to the established worktree-based path below so
|
|
1099
|
+
// detailed conflict summaries and compatibility remain unchanged.
|
|
1100
|
+
try {
|
|
1101
|
+
const previewTree = gitExecArgs(
|
|
1102
|
+
["merge-tree", "--write-tree", baseBranch, branchName],
|
|
1103
|
+
repoDir,
|
|
1104
|
+
)
|
|
1105
|
+
.split(/\r?\n/u)[0]
|
|
1106
|
+
?.trim();
|
|
1107
|
+
if (/^[a-f0-9]{40,64}$/iu.test(previewTree || "")) {
|
|
1108
|
+
return {
|
|
1109
|
+
success: true,
|
|
1110
|
+
previewOnly: true,
|
|
1111
|
+
strategy,
|
|
1112
|
+
branch: branchName,
|
|
1113
|
+
baseBranch,
|
|
1114
|
+
message: `Merge preview is clean. ${branchName} can be merged into ${baseBranch} without conflicts.`,
|
|
1115
|
+
summary: {
|
|
1116
|
+
conflictedFiles: 0,
|
|
1117
|
+
bothModified: 0,
|
|
1118
|
+
bothAdded: 0,
|
|
1119
|
+
deleteModify: 0,
|
|
1120
|
+
},
|
|
1121
|
+
conflicts: [],
|
|
1122
|
+
suggestions: [
|
|
1123
|
+
`No merge conflicts detected between ${branchName} and ${baseBranch}.`,
|
|
1124
|
+
"You can proceed with the final merge when ready.",
|
|
1125
|
+
],
|
|
1126
|
+
previewEntrypoints: [],
|
|
1127
|
+
};
|
|
1128
|
+
}
|
|
1129
|
+
} catch {
|
|
1130
|
+
// Conflict/unsupported Git: preserve the detailed compatibility path.
|
|
1131
|
+
}
|
|
1132
|
+
|
|
1070
1133
|
_abortMergeIfPresent(worktree.path);
|
|
1071
1134
|
|
|
1072
1135
|
let mergeStarted = false;
|
|
@@ -1626,7 +1689,9 @@ function _resolveBaseBranchForMerge(repoDir, baseBranch) {
|
|
|
1626
1689
|
}
|
|
1627
1690
|
|
|
1628
1691
|
try {
|
|
1629
|
-
return
|
|
1692
|
+
return (
|
|
1693
|
+
gitExecArgs(["rev-parse", "--abbrev-ref", "HEAD"], repoDir) || "HEAD"
|
|
1694
|
+
);
|
|
1630
1695
|
} catch (_e) {
|
|
1631
1696
|
return "HEAD";
|
|
1632
1697
|
}
|
|
@@ -7,6 +7,7 @@ import {
|
|
|
7
7
|
import { GraphEventStore } from "../graph-kernel/event-store.js";
|
|
8
8
|
import { GraphKernel } from "../graph-kernel/runtime.js";
|
|
9
9
|
import { createGraphAuthorityBinding } from "../graph-kernel/authority.js";
|
|
10
|
+
import { reduceGraphTrace } from "../graph-kernel/trace-reducer.js";
|
|
10
11
|
|
|
11
12
|
const IDENTIFIER = /^[A-Za-z0-9][A-Za-z0-9._:/-]{0,159}$/u;
|
|
12
13
|
const DIGEST = /^sha256:[a-f0-9]{64}$/u;
|
|
@@ -1906,6 +1907,11 @@ export class TeamGraphRuntimeAdapter {
|
|
|
1906
1907
|
return this.kernel.getRun(this.runId);
|
|
1907
1908
|
}
|
|
1908
1909
|
|
|
1910
|
+
traceProjection(options = {}) {
|
|
1911
|
+
if (!this.kernel || !this.runId) return null;
|
|
1912
|
+
return reduceGraphTrace(this.kernel.events(this.runId), options);
|
|
1913
|
+
}
|
|
1914
|
+
|
|
1909
1915
|
events(options = {}) {
|
|
1910
1916
|
if (!this.kernel || !this.runId) return [];
|
|
1911
1917
|
return this.kernel.events(this.runId, options);
|
|
@@ -2785,6 +2785,10 @@ export class TeamRunner {
|
|
|
2785
2785
|
key,
|
|
2786
2786
|
holder,
|
|
2787
2787
|
error: failure?.message || String(failure),
|
|
2788
|
+
code: failure?.code || null,
|
|
2789
|
+
exitCode: Number.isInteger(failure?.exitCode)
|
|
2790
|
+
? failure.exitCode
|
|
2791
|
+
: null,
|
|
2788
2792
|
retry: outcome.retry === true,
|
|
2789
2793
|
attempts: outcome.attempts,
|
|
2790
2794
|
interrupted: failure?.code === "TEAM_TASK_HUMAN_INTERRUPTED",
|
|
@@ -1974,6 +1974,10 @@ export class TeamWorktreeCoordinator {
|
|
|
1974
1974
|
...(executionResult?.usageRecords
|
|
1975
1975
|
? { usageRecords: executionResult.usageRecords }
|
|
1976
1976
|
: {}),
|
|
1977
|
+
terminalEvidence: {
|
|
1978
|
+
...(executionResult?.terminalEvidence || {}),
|
|
1979
|
+
commit: commitOid,
|
|
1980
|
+
},
|
|
1977
1981
|
};
|
|
1978
1982
|
};
|
|
1979
1983
|
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import os from "node:os";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
|
|
4
|
+
export const FORMAL_QUALITY_HERMETIC_ENV = "CC_FORMAL_QUALITY_EVAL_HERMETIC";
|
|
5
|
+
export const FORMAL_QUALITY_PROVIDER_ENV = "CC_FORMAL_QUALITY_EVAL_PROVIDER";
|
|
6
|
+
export const FORMAL_QUALITY_ALLOWED_FILES_ENV =
|
|
7
|
+
"CC_FORMAL_QUALITY_EVAL_ALLOWED_FILES";
|
|
8
|
+
export const FORMAL_QUALITY_FILE_TOOLS = Object.freeze([
|
|
9
|
+
"read_file",
|
|
10
|
+
"search_files",
|
|
11
|
+
"list_dir",
|
|
12
|
+
"write_file",
|
|
13
|
+
"edit_file",
|
|
14
|
+
"edit_file_hashed",
|
|
15
|
+
]);
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* The real-model quality harness opts into the already-supported hermetic
|
|
19
|
+
* headless boundary through a launcher-only environment marker. Keep the
|
|
20
|
+
* check exact so inherited or malformed values never change normal CLI runs.
|
|
21
|
+
*/
|
|
22
|
+
export function isFormalQualityHermeticRuntime(environment = process.env) {
|
|
23
|
+
if (environment?.[FORMAL_QUALITY_HERMETIC_ENV] !== "1") return false;
|
|
24
|
+
const configuredHome = String(environment?.CHAINLESSCHAIN_HOME || "").trim();
|
|
25
|
+
if (!configuredHome) return false;
|
|
26
|
+
const temporaryRoot = path.resolve(os.tmpdir());
|
|
27
|
+
const resolvedHome = path.resolve(configuredHome);
|
|
28
|
+
const relation = path.relative(temporaryRoot, resolvedHome);
|
|
29
|
+
return Boolean(
|
|
30
|
+
relation &&
|
|
31
|
+
relation !== ".." &&
|
|
32
|
+
!relation.startsWith(`..${path.sep}`) &&
|
|
33
|
+
!path.isAbsolute(relation),
|
|
34
|
+
);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/** Resolve the provider that the formal harness bound before any model call. */
|
|
38
|
+
export function formalQualityProvider(environment = process.env) {
|
|
39
|
+
if (!isFormalQualityHermeticRuntime(environment)) return null;
|
|
40
|
+
const provider = String(environment?.[FORMAL_QUALITY_PROVIDER_ENV] || "")
|
|
41
|
+
.trim()
|
|
42
|
+
.toLowerCase();
|
|
43
|
+
return provider || null;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function validateAllowedFiles(value) {
|
|
47
|
+
const allowedFiles = Array.isArray(value) ? value : null;
|
|
48
|
+
if (
|
|
49
|
+
!allowedFiles ||
|
|
50
|
+
allowedFiles.length === 0 ||
|
|
51
|
+
allowedFiles.length > 16 ||
|
|
52
|
+
allowedFiles.some(
|
|
53
|
+
(file) =>
|
|
54
|
+
typeof file !== "string" ||
|
|
55
|
+
file.length === 0 ||
|
|
56
|
+
file.includes("\\") ||
|
|
57
|
+
file.includes("\0") ||
|
|
58
|
+
path.posix.isAbsolute(file) ||
|
|
59
|
+
path.posix.normalize(file) !== file ||
|
|
60
|
+
file === "." ||
|
|
61
|
+
file === ".." ||
|
|
62
|
+
file.startsWith("../"),
|
|
63
|
+
) ||
|
|
64
|
+
new Set(allowedFiles).size !== allowedFiles.length
|
|
65
|
+
) {
|
|
66
|
+
throw new Error("formal quality allowed-files binding is invalid");
|
|
67
|
+
}
|
|
68
|
+
return Object.freeze([...allowedFiles]);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/** Resolve the exact task-local file allowlist passed to a formal child. */
|
|
72
|
+
export function formalQualityAllowedFiles(environment = process.env) {
|
|
73
|
+
if (!isFormalQualityHermeticRuntime(environment)) return null;
|
|
74
|
+
let allowedFiles;
|
|
75
|
+
try {
|
|
76
|
+
allowedFiles = JSON.parse(
|
|
77
|
+
String(environment?.[FORMAL_QUALITY_ALLOWED_FILES_ENV] || ""),
|
|
78
|
+
);
|
|
79
|
+
} catch {
|
|
80
|
+
throw new Error("formal quality allowed-files binding is invalid");
|
|
81
|
+
}
|
|
82
|
+
return validateAllowedFiles(allowedFiles);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/** Bind a validated plan allowlist to the child without widening normal runs. */
|
|
86
|
+
export function formalQualityTaskAllowedFiles(
|
|
87
|
+
allowedFiles,
|
|
88
|
+
environment = process.env,
|
|
89
|
+
) {
|
|
90
|
+
if (!isFormalQualityHermeticRuntime(environment)) return null;
|
|
91
|
+
return validateAllowedFiles(allowedFiles);
|
|
92
|
+
}
|
|
@@ -4201,9 +4201,35 @@ class ProcessExecutionBroker extends EventEmitter {
|
|
|
4201
4201
|
args: filteredArgs,
|
|
4202
4202
|
env: filteredEnv,
|
|
4203
4203
|
report: credentialReport,
|
|
4204
|
+
referenceIds: Object.entries(filteredEnv)
|
|
4205
|
+
.filter(
|
|
4206
|
+
([key, value]) =>
|
|
4207
|
+
(key.startsWith("CC_CRED_REF_") ||
|
|
4208
|
+
key.startsWith("CC_CRED_ARG_REF_")) &&
|
|
4209
|
+
typeof value === "string" &&
|
|
4210
|
+
value.startsWith("cc-cred-"),
|
|
4211
|
+
)
|
|
4212
|
+
.map(([, value]) => value),
|
|
4204
4213
|
};
|
|
4205
4214
|
}
|
|
4206
4215
|
|
|
4216
|
+
_revokeCredentialReferences(referenceIds, reason) {
|
|
4217
|
+
if (
|
|
4218
|
+
!Array.isArray(referenceIds) ||
|
|
4219
|
+
typeof this._credentialAgent.revokeCredentialRef !== "function"
|
|
4220
|
+
) {
|
|
4221
|
+
return;
|
|
4222
|
+
}
|
|
4223
|
+
for (const refId of new Set(referenceIds)) {
|
|
4224
|
+
try {
|
|
4225
|
+
this._credentialAgent.revokeCredentialRef(refId, reason);
|
|
4226
|
+
} catch {
|
|
4227
|
+
// Credential cleanup must never replace the authoritative process
|
|
4228
|
+
// result. References remain bounded by their issuance TTL.
|
|
4229
|
+
}
|
|
4230
|
+
}
|
|
4231
|
+
}
|
|
4232
|
+
|
|
4207
4233
|
_createCredentialContext(command, options, executionId, decision) {
|
|
4208
4234
|
if (typeof this._credentialAgent.createBrokerContext !== "function") {
|
|
4209
4235
|
return options.credentialContext;
|
|
@@ -4933,6 +4959,7 @@ class ProcessExecutionBroker extends EventEmitter {
|
|
|
4933
4959
|
options = this._withAmbientProcessContext(command, options);
|
|
4934
4960
|
const executionId = crypto.randomUUID();
|
|
4935
4961
|
const startTime = Date.now();
|
|
4962
|
+
let credentialReferenceIds = [];
|
|
4936
4963
|
const origin = options.origin || "unknown";
|
|
4937
4964
|
const requestedCwd = options.cwd || process.cwd();
|
|
4938
4965
|
options = this._withWorkspaceTransactionBoundaries(options, requestedCwd, {
|
|
@@ -5055,6 +5082,7 @@ class ProcessExecutionBroker extends EventEmitter {
|
|
|
5055
5082
|
);
|
|
5056
5083
|
spawnOpts.env = credentialBoundary.env;
|
|
5057
5084
|
args = credentialBoundary.args;
|
|
5085
|
+
credentialReferenceIds = credentialBoundary.referenceIds;
|
|
5058
5086
|
auditEntry.args = this._auditArgs(args, auditRedactArgIndexes);
|
|
5059
5087
|
this._recordCredentialReport(auditEntry, credentialBoundary.report);
|
|
5060
5088
|
this._stripCredentialControlOptions(spawnOpts);
|
|
@@ -5159,6 +5187,10 @@ class ProcessExecutionBroker extends EventEmitter {
|
|
|
5159
5187
|
throw err;
|
|
5160
5188
|
} finally {
|
|
5161
5189
|
sandboxPlan.cleanup?.();
|
|
5190
|
+
this._revokeCredentialReferences(
|
|
5191
|
+
credentialReferenceIds,
|
|
5192
|
+
"sync-process-settled",
|
|
5193
|
+
);
|
|
5162
5194
|
}
|
|
5163
5195
|
}
|
|
5164
5196
|
|
|
@@ -2719,17 +2719,18 @@ function sameWindowsFileIdentity(left, right) {
|
|
|
2719
2719
|
);
|
|
2720
2720
|
}
|
|
2721
2721
|
|
|
2722
|
-
// Cleanup is authorized by the stable file
|
|
2722
|
+
// Cleanup is authorized by the stable volume/file identity, not by metadata
|
|
2723
2723
|
// that Windows may settle after the helper closes its last write handle. The
|
|
2724
2724
|
// strict identity above remains authoritative while content is read or
|
|
2725
2725
|
// attested; this cleanup-only comparison still rejects a same-path replacement
|
|
2726
|
-
// because that changes the inode
|
|
2726
|
+
// because that changes the inode. Node's Windows birthtime projection can
|
|
2727
|
+
// settle together with size/ctime/mtime, so it is metadata rather than part of
|
|
2728
|
+
// the deletion authority.
|
|
2727
2729
|
function sameWindowsFileObjectIdentity(left, right) {
|
|
2728
2730
|
return (
|
|
2729
2731
|
left.dev === right.dev &&
|
|
2730
2732
|
left.ino === right.ino &&
|
|
2731
|
-
left.mode === right.mode
|
|
2732
|
-
left.birthtimeNs === right.birthtimeNs
|
|
2733
|
+
left.mode === right.mode
|
|
2733
2734
|
);
|
|
2734
2735
|
}
|
|
2735
2736
|
|
package/src/lib/secure-fs.js
CHANGED
|
@@ -605,6 +605,25 @@ export const _deps = {
|
|
|
605
605
|
// tests and repairPrivatePath() always execute and verify the operation.
|
|
606
606
|
const securedWindowsPaths = new Set();
|
|
607
607
|
const WINDOWS_ACL_BATCH_SIZE = 500;
|
|
608
|
+
const WINDOWS_ACL_TIMEOUT_ENV = "CC_SECURE_FS_WINDOWS_ACL_TIMEOUT_MS";
|
|
609
|
+
const MAX_WINDOWS_ACL_TIMEOUT_MS = 5 * 60_000;
|
|
610
|
+
|
|
611
|
+
// Windows hosted runners can need more than the normal 15/30 second allowance
|
|
612
|
+
// to cold-start PowerShell and load the access-control types. A trusted harness
|
|
613
|
+
// may raise (but never lower) that allowance; the cap prevents an inherited
|
|
614
|
+
// environment value from wedging owner-only storage initialization forever.
|
|
615
|
+
export function _resolveWindowsAclTimeout(
|
|
616
|
+
defaultTimeoutMs,
|
|
617
|
+
environment = process.env,
|
|
618
|
+
) {
|
|
619
|
+
const fallback = Math.max(1, Math.floor(Number(defaultTimeoutMs) || 1));
|
|
620
|
+
const configured = Number(environment?.[WINDOWS_ACL_TIMEOUT_ENV]);
|
|
621
|
+
if (!Number.isFinite(configured) || configured <= 0) return fallback;
|
|
622
|
+
return Math.min(
|
|
623
|
+
Math.max(fallback, Math.floor(configured)),
|
|
624
|
+
MAX_WINDOWS_ACL_TIMEOUT_MS,
|
|
625
|
+
);
|
|
626
|
+
}
|
|
608
627
|
|
|
609
628
|
function repairWindowsAclOnce(target, deps, options) {
|
|
610
629
|
const cacheable = !options.deps;
|
|
@@ -630,7 +649,11 @@ function windowsAcl(target, operation, deps) {
|
|
|
630
649
|
target,
|
|
631
650
|
operation,
|
|
632
651
|
],
|
|
633
|
-
{
|
|
652
|
+
{
|
|
653
|
+
encoding: "utf8",
|
|
654
|
+
windowsHide: true,
|
|
655
|
+
timeout: _resolveWindowsAclTimeout(15_000),
|
|
656
|
+
},
|
|
634
657
|
);
|
|
635
658
|
let details = null;
|
|
636
659
|
try {
|
|
@@ -675,7 +698,7 @@ function windowsAclBatch(targets, operation, deps, expectedKind = null) {
|
|
|
675
698
|
...(expectedKind ? { expectedKind } : {}),
|
|
676
699
|
}),
|
|
677
700
|
windowsHide: true,
|
|
678
|
-
timeout:
|
|
701
|
+
timeout: _resolveWindowsAclTimeout(30_000),
|
|
679
702
|
maxBuffer: 4 * 1024 * 1024,
|
|
680
703
|
},
|
|
681
704
|
);
|
|
@@ -746,14 +746,25 @@ export function reapIdleBackgroundShellTasks(deps = {}) {
|
|
|
746
746
|
// Foreground (synchronous) run_shell timeout. Configurable per-call via the
|
|
747
747
|
// optional `timeout` arg; defaults to 60s and is hard-capped at 10 min so a
|
|
748
748
|
// synchronous call can never wedge the loop indefinitely (use run_in_background
|
|
749
|
-
// for genuinely long work).
|
|
749
|
+
// for genuinely long work). Trusted harnesses may set a minimum through the
|
|
750
|
+
// parent-process environment so model-generated tool arguments cannot shorten a
|
|
751
|
+
// benchmark's platform-neutral execution allowance. The unset path preserves
|
|
752
|
+
// the public per-call semantics byte-for-byte.
|
|
750
753
|
const DEFAULT_SHELL_TIMEOUT_MS = 60000;
|
|
751
754
|
const MAX_SHELL_TIMEOUT_MS = 600000;
|
|
752
|
-
function _resolveShellTimeout(raw) {
|
|
753
|
-
|
|
755
|
+
export function _resolveShellTimeout(raw, environment = process.env) {
|
|
756
|
+
const configuredMinimum = Number(environment?.CC_RUN_SHELL_MIN_TIMEOUT_MS);
|
|
757
|
+
const minimum =
|
|
758
|
+
Number.isFinite(configuredMinimum) && configuredMinimum > 0
|
|
759
|
+
? Math.min(Math.floor(configuredMinimum), MAX_SHELL_TIMEOUT_MS)
|
|
760
|
+
: 0;
|
|
761
|
+
if (raw == null) return Math.max(DEFAULT_SHELL_TIMEOUT_MS, minimum);
|
|
754
762
|
const n = Number(raw);
|
|
755
|
-
|
|
756
|
-
|
|
763
|
+
const requested =
|
|
764
|
+
Number.isFinite(n) && n > 0
|
|
765
|
+
? Math.min(Math.floor(n), MAX_SHELL_TIMEOUT_MS)
|
|
766
|
+
: DEFAULT_SHELL_TIMEOUT_MS;
|
|
767
|
+
return Math.max(requested, minimum);
|
|
757
768
|
}
|
|
758
769
|
|
|
759
770
|
/**
|
|
@@ -1325,6 +1336,7 @@ const GUARDED_FILE_MUTATION_TOOLS = new Set([
|
|
|
1325
1336
|
]);
|
|
1326
1337
|
const EXACT_FILE_MUTATION_SCOPE_TOOL_NAMES = new Set([
|
|
1327
1338
|
"read_file",
|
|
1339
|
+
"search_files",
|
|
1328
1340
|
"list_dir",
|
|
1329
1341
|
"write_file",
|
|
1330
1342
|
"edit_file",
|
|
@@ -40,6 +40,10 @@ import {
|
|
|
40
40
|
import { maybeApplyToolSearch } from "./mcp-tool-search.js";
|
|
41
41
|
import { IterationBudget } from "../lib/iteration-budget.js";
|
|
42
42
|
import { HostResourceBudget } from "../lib/host-resource-budget.js";
|
|
43
|
+
import {
|
|
44
|
+
FORMAL_QUALITY_FILE_TOOLS,
|
|
45
|
+
isFormalQualityHermeticRuntime,
|
|
46
|
+
} from "../lib/formal-quality-eval-runtime.js";
|
|
43
47
|
import {
|
|
44
48
|
startSession as jsonlStartSession,
|
|
45
49
|
appendUserMessage as jsonlAppendUserMessage,
|
|
@@ -186,7 +190,6 @@ const HERMETIC_SKILL_LOADER = Object.freeze({
|
|
|
186
190
|
getCacheLedger: () => null,
|
|
187
191
|
getLimits: () => null,
|
|
188
192
|
});
|
|
189
|
-
|
|
190
193
|
// EPIPE guard for `cc agent -p … | head`. Lives in pipe-safety.js (shared with
|
|
191
194
|
// the stream-json driver + REPL); re-exported here for existing importers.
|
|
192
195
|
export { installPipeSafety } from "./pipe-safety.js";
|
|
@@ -850,7 +853,9 @@ async function runAgentHeadlessInWorkspace(
|
|
|
850
853
|
const baseUrl = options.baseUrl || "http://localhost:11434";
|
|
851
854
|
const apiKey = options.apiKey || null;
|
|
852
855
|
const cwd = options.cwd || process.cwd();
|
|
853
|
-
const
|
|
856
|
+
const formalQualityHermetic = isFormalQualityHermeticRuntime(process.env);
|
|
857
|
+
const hermeticExecution =
|
|
858
|
+
options.hermeticExecution === true || formalQualityHermetic;
|
|
854
859
|
if (
|
|
855
860
|
options.fileMutationScope != null &&
|
|
856
861
|
(options.exactToolNames !== true || !hermeticExecution)
|
|
@@ -1220,12 +1225,14 @@ async function runAgentHeadlessInWorkspace(
|
|
|
1220
1225
|
assertManagedPermissionMode(options.permissionMode, managedSettings);
|
|
1221
1226
|
}
|
|
1222
1227
|
const perm = resolvePermissionMode(options.permissionMode);
|
|
1223
|
-
const enabledToolNames =
|
|
1224
|
-
|
|
1225
|
-
|
|
1226
|
-
|
|
1227
|
-
|
|
1228
|
-
|
|
1228
|
+
const enabledToolNames = formalQualityHermetic
|
|
1229
|
+
? [...FORMAL_QUALITY_FILE_TOOLS]
|
|
1230
|
+
: resolveEnabledTools({
|
|
1231
|
+
// An explicit --allowed-tools wins; otherwise a matched command's
|
|
1232
|
+
// `allowed-tools:` frontmatter scopes the run (null when neither applies).
|
|
1233
|
+
allowedTools: options.allowedTools || macroAllowedTools,
|
|
1234
|
+
readOnly: perm.readOnly,
|
|
1235
|
+
});
|
|
1229
1236
|
const disabledTools = options.disallowedTools || [];
|
|
1230
1237
|
|
|
1231
1238
|
// ── Best-effort runtime bootstrap (DB optional, like startAgentRepl) ───
|
|
@@ -1699,7 +1706,7 @@ async function runAgentHeadlessInWorkspace(
|
|
|
1699
1706
|
: options.skillLoader || new CLISkillLoader();
|
|
1700
1707
|
const systemContent = hermeticExecution
|
|
1701
1708
|
? composeSystemPrompt(
|
|
1702
|
-
"You are a hermetic code fixer.
|
|
1709
|
+
"You are a hermetic code fixer. The exposed file tools are the complete tool surface. Inspect and mutate only the exact paths authorized in the user request, then return a concise completion message.",
|
|
1703
1710
|
{ projectMemory: false },
|
|
1704
1711
|
)
|
|
1705
1712
|
: composeSystemPrompt(
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{P as c,J as p,b as s}from"./vendor-Bn1JzzAn.js";import{r as a}from"./markdown-Yo_c6Krv.js";import{_ as d}from"./index-C9gtY4nG.js";const _={__name:"MarkdownRenderer",props:{content:{type:String,default:""}},setup(t,{expose:o}){o();const e=t,r=s(()=>a(e.content||"")),n={props:e,rendered:r,computed:s,get renderMarkdown(){return a}};return Object.defineProperty(n,"__isScriptSetup",{enumerable:!1,value:!0}),n}},i=["innerHTML"];function l(t,o,e,r,n,m){return c(),p("div",{class:"markdown-content",innerHTML:r.rendered},null,8,i)}const w=d(_,[["render",l],["__scopeId","data-v-0b0b9f63"],["__file","/tmp/cc-web-panel-eI5lXL/repo/packages/web-panel/src/components/MarkdownRenderer.vue"]]);export{w as M};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{Q as r}from"./index-C9gtY4nG.js";const o=((n,a,e)=>{r(n,`[ant-design-vue: ${a}] ${e}`)});export{o as d};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{C as o}from"./Col-CkfdKhyJ.js";import{a0 as t}from"./index-C9gtY4nG.js";import"./vendor-Bn1JzzAn.js";import"./index-BQp5M0s1.js";import"./icons-DG5UD-6K.js";const s=t(o);export{s as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{A as o}from"./Row-CA_nASyL.js";import{a0 as t}from"./index-C9gtY4nG.js";import"./vendor-Bn1JzzAn.js";import"./responsiveObserve-pta_O8AU.js";import"./useFlexGapSupport-KcjZZ5U7.js";import"./styleChecker-p8NfWmcG.js";import"./index-BQp5M0s1.js";import"./icons-DG5UD-6K.js";const l=t(o);export{l as default};
|