chainlesschain 0.166.84 → 0.166.85
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/README.md +9 -4
- package/package.json +1 -1
- package/src/assets/linux-subreaper/linux-arm64/manifest.json +1 -1
- package/src/assets/linux-subreaper/linux-x64/manifest.json +1 -1
- package/src/assets/web-panel/assets/{AIOps-OYLnAlB5.js → AIOps-Cgo7OFpi.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-uc9kbLR6.js → ActionButton-lUMnE2Ln.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-BH901FG0.js → Analytics-CsvKzTot.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-qypKb8GL.js → AppLayout-C2z1h1Pv.js} +4 -4
- package/src/assets/web-panel/assets/{Artifacts-Q-uPWyLY.js → Artifacts-C5Q0ZhNb.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-B8hMGMim.js → Audit-DXnfPKsI.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-BSs8rJL_.js → BackgroundAgents-DjbGcLm3.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-2YMU_nCd.js → Backup-9bVrKvXE.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-DyMppTuT.js → BaseInput-bx5ri7BD.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-B5QGMaDO.js → Chat-CCFmeUMY.js} +5 -5
- package/src/assets/web-panel/assets/ChatBubbleRenderer-ClqsIfTT.js +1 -0
- package/src/assets/web-panel/assets/{Checkbox-DAvtgEGd.js → Checkbox-ei7MQXe9.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-BSChEVM3.js → Codegen-CXgBJ9iu.js} +1 -1
- package/src/assets/web-panel/assets/{Col-G0zYohIP.js → Col-DMkMsizS.js} +1 -1
- package/src/assets/web-panel/assets/{Community-CzCN0B_p.js → Community-CvpB_UFR.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-DrIN3G8z.js → Compact-gay5hbFX.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-CIsLa64Z.js → Compliance-dG8JQyRL.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-CGYoafsB.js → Cowork-BA3xfaTW.js} +4 -4
- package/src/assets/web-panel/assets/{Cron-DJ1JPXuH.js → Cron-D1_HsxyY.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-B-IqVFJl.js → Crosschain-DZqoqoy5.js} +1 -1
- package/src/assets/web-panel/assets/{DID-CAAczPz_.js → DID-Cwnr8hCO.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-Dkpel8VE.js → Dashboard-CxevypiI.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-ETNBf8-Z.js → Dropdown-Bs7-yWgr.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-CJGDyjVD.js → EmailListRenderer-CcEs2Puo.js} +1 -1
- package/src/assets/web-panel/assets/{EvolutionSettings-CL_hvVYe.js → EvolutionSettings-C9ipBzAQ.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-iexOh6Dh.js → FamilyGuardDashboard-Dt6--mGn.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-DnDHvV5D.js → Federation-CD0JN5FF.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-DLCDJjUp.js → FormItemContext-POypz3Xv.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-CaCgXCjS.js → GenericCardRenderer-Dv9f-0F5.js} +1 -1
- package/src/assets/web-panel/assets/{Git-BVm-euUF.js → Git-BbTh5Atv.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-DPnUvLWr.js → Governance-C71dgoir.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-5qCWSYKl.js → Inference-DwSHxbJB.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-DXdv2oEh.js → KnowledgeGraph-Cx1oQYQZ.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-BF2f7bBA.js → Logs-BAJWe00o.js} +2 -2
- package/src/assets/web-panel/assets/MarkdownRenderer-CD8a7lHT.js +1 -0
- package/src/assets/web-panel/assets/{Marketplace-Bp-0Y7Ng.js → Marketplace-fwuY7P7Y.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-dm-Xdi63.js → McpTools-Di4693uc.js} +2 -2
- package/src/assets/web-panel/assets/{Memory-TBHK031z.js → Memory-Cz3L-GUB.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-BTILAlds.js → MobileBridge-BuXKIkSb.js} +1 -1
- package/src/assets/web-panel/assets/MobileProjects-Bk-lK4Um.js +1 -0
- package/src/assets/web-panel/assets/{Mtc-BvyWkmRw.js → Mtc-LnACMFd0.js} +5 -5
- package/src/assets/web-panel/assets/{MtcAudit-D7ksLoNa.js → MtcAudit-BZy7yE0t.js} +2 -2
- package/src/assets/web-panel/assets/{Multisig-Dpzu7X1t.js → Multisig-BFG5iVrE.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-DZ0ADHSB.js → NLProgramming-DgXi04vJ.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-hIdkmRug.js → Notes-BAj0Kgg4.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-R3jyP6Vf.js → NotificationSettings-AixrsHw5.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-d1zrFkqx.js → OrderTableRenderer-Dwqk3FlG.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-DoA5WMcc.js → Organization-UNCBC3ux.js} +2 -2
- package/src/assets/web-panel/assets/{Overflow-DHjIloAQ.js → Overflow-Drh8oAFT.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-2TMon_Wy.js → P2P-bc2q0xEB.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-DEUxGSWO.js → PdhVaultBrowser-BGwKxcDM.js} +5 -5
- package/src/assets/web-panel/assets/{Permissions-CxKcZ-8X.js → Permissions-DOnUxUzu.js} +3 -3
- package/src/assets/web-panel/assets/{PersonalDataHub-CcYtkHqc.js → PersonalDataHub-B3qPZkrr.js} +4 -4
- package/src/assets/web-panel/assets/{Pipeline-BxwOuq22.js → Pipeline-B6hfa4-i.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-VIx9pdsH.js → Privacy-Bun3c35F.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-COjp_erK.js → ProjectInit-CCObdzk9.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-x9NrZU80.js → ProjectSettings-C6lKrSXY.js} +2 -2
- package/src/assets/web-panel/assets/{Projects-DMgkw7QJ.js → Projects-DYcta7MZ.js} +1 -1
- package/src/assets/web-panel/assets/{Providers-B_fR7Y7Y.js → Providers-BtykxKCe.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-BUvzrn3V.js → QrScannerModal-D9CDyroY.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-C0sJwLy2.js → QuickAsk-CJauCxXx.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-CJC7Wpce.js → Recommend-BbiYZofR.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-B62J6ZP0.js → RemoteSession-BymCrgFW.js} +2 -2
- package/src/assets/web-panel/assets/{Reputation-4f48kVBn.js → Reputation-BWrGpMpF.js} +1 -1
- package/src/assets/web-panel/assets/{Row-EzEMaYoV.js → Row-9pOYIhiW.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-Dy0wD83j.js → RssFeed-D3bQJ4qB.js} +3 -3
- package/src/assets/web-panel/assets/{Search-GeVRHQND.js → Search-BpKOOFE0.js} +1 -1
- package/src/assets/web-panel/assets/{Security-omLr1J7w.js → Security-DC6C0NSz.js} +4 -4
- package/src/assets/web-panel/assets/{Services-DmGPaDAs.js → Services-Lkf1046J.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-CAla21Gm.js → Skeleton-eCQ_SsDb.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-QqEyIKOI.js → Skills-BvDSQ3-d.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-Cwi15-pZ.js → Sla-BQbKy8XJ.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-Cs8Zi1J8.js → SpeechSettings-DHsRx-XA.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-ipuJsDKP.js → SyncSettings-CC281X_J.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-BbVAg9Z7.js → Tasks-CHHSWHom.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-slUp9yXF.js → Templates-Cr2vC0tg.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-6edCSG5K.js → Tenant-DeYO5pIG.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-DKq84G3h.js → Terminal-DBNgbfPr.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-Dg0Aw6se.js → TimelineRenderer-MoxgaF3x.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-D63h7qYd.js → Tokens-CT2QfAN7.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-F7gTP_gv.js → Trigger-DPUnomxs.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-zw8Zqp8k.js → Trust-DnufuaTx.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-C-YBUmod.js → UkeySign-CJ6iOdPs.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-AhVxTgmC.js → VideoEditing-xBWkH8bL.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-C58zxjIg.js → Wallet-WYV-4hMR.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-D-n-rlfI.js → WebAuthn-DJ5Mhd9L.js} +2 -2
- package/src/assets/web-panel/assets/{WorkflowEditor-Ddc8gGD4.js → WorkflowEditor-B__UdOjN.js} +1 -1
- package/src/assets/web-panel/assets/{chat-C66V_U7w.js → chat-CLlmBVhp.js} +1 -1
- package/src/assets/web-panel/assets/{colors-BcJyVZRj.js → colors-B8zoPQYm.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-UgUXWcgP.js → compact-item-CvJ-dUsH.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-oxEKHKYP.js → createContext-LAtMm8SC.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-DgZ4fdGI.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-CbqzrKQO.js → hasIn-CLYvg42H.js} +1 -1
- package/src/assets/web-panel/assets/{index-CuZupgUw.js → index-09YzRb6Z.js} +3 -3
- package/src/assets/web-panel/assets/{index-7lSY8B9T.js → index-4rr5jFOL.js} +1 -1
- package/src/assets/web-panel/assets/{index-CH13yc9x.js → index-B02qgCao.js} +1 -1
- package/src/assets/web-panel/assets/{index-DR4YKlLt.js → index-B1hHp9_M.js} +1 -1
- package/src/assets/web-panel/assets/{index-BdFgUn1S.js → index-B6zlMzZz.js} +1 -1
- package/src/assets/web-panel/assets/{index-D3xNhHF3.js → index-BCzyJ1xS.js} +1 -1
- package/src/assets/web-panel/assets/{index-DO-5vgTW.js → index-BGrQ2uEl.js} +1 -1
- package/src/assets/web-panel/assets/{index-CUmYwZyf.js → index-BM2HqHdT.js} +1 -1
- package/src/assets/web-panel/assets/{index-DWFNv_EG.js → index-BUVrYDNV.js} +1 -1
- package/src/assets/web-panel/assets/{index-BT2PZ9df.js → index-B_RPWP_5.js} +1 -1
- package/src/assets/web-panel/assets/{index-C6X26RJu.js → index-BkcQJvsz.js} +1 -1
- package/src/assets/web-panel/assets/{index-BZ7mv_oS.js → index-Bu7-I2L4.js} +1 -1
- package/src/assets/web-panel/assets/{index-BMOY4PSW.js → index-C2KFnUsv.js} +1 -1
- package/src/assets/web-panel/assets/{index-B-h0Jgtj.js → index-C3uD5H7u.js} +1 -1
- package/src/assets/web-panel/assets/{index-D8rgeCoC.js → index-C5v7cEtm.js} +1 -1
- package/src/assets/web-panel/assets/{index-Ov77O9mH.js → index-C6PETyel.js} +1 -1
- package/src/assets/web-panel/assets/{index-BrWZmUdA.js → index-CUcE6rIa.js} +1 -1
- package/src/assets/web-panel/assets/{index-CJluGB2F.js → index-CVDcRQuX.js} +1 -1
- package/src/assets/web-panel/assets/{index-Crqqbu-W.js → index-C_dq-6_3.js} +1 -1
- package/src/assets/web-panel/assets/{index-BpqJNeIj.js → index-CnLXLaEF.js} +1 -1
- package/src/assets/web-panel/assets/{index-DBEL07sa.js → index-Cpda0SAz.js} +1 -1
- package/src/assets/web-panel/assets/{index-UpN_kC9R.js → index-Cv7vwX3z.js} +1 -1
- package/src/assets/web-panel/assets/{index-CM2S5TJZ.js → index-CxJ4NPVq.js} +1 -1
- package/src/assets/web-panel/assets/{index-SzGgAqai.js → index-D0Z13xcZ.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bu1A2sXy.js → index-DDm9m4vC.js} +1 -1
- package/src/assets/web-panel/assets/{index-DMbJ06sF.js → index-DHq2Of6z.js} +1 -1
- package/src/assets/web-panel/assets/{index-C-p9hhAz.js → index-DNQUdPam.js} +1 -1
- package/src/assets/web-panel/assets/{index-BQlGMcZ9.js → index-DX0aHEHL.js} +1 -1
- package/src/assets/web-panel/assets/{index-DRrxJygS.js → index-DX99e8Xy.js} +1 -1
- package/src/assets/web-panel/assets/{index-C3j9jTfB.js → index-DYW4Z3y-.js} +1 -1
- package/src/assets/web-panel/assets/{index-CrG-1Kqs.js → index-DfOOACfd.js} +1 -1
- package/src/assets/web-panel/assets/{index-DAIuMvVR.js → index-Di9vKira.js} +1 -1
- package/src/assets/web-panel/assets/{index-RnxuL8wM.js → index-DpeV-6y4.js} +1 -1
- package/src/assets/web-panel/assets/{index-BNIq0NAn.js → index-GR3omApz.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bmhw_Ler.js → index-f1ptYBMr.js} +1 -1
- package/src/assets/web-panel/assets/{index-YvNh1UdB.js → index-iJ6s24bA.js} +1 -1
- package/src/assets/web-panel/assets/index-jLEdASOV.js +1 -0
- package/src/assets/web-panel/assets/index-jesGo4rl.js +1 -0
- package/src/assets/web-panel/assets/{index-Bp9rfr-P.js → index-oX216HRH.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-BK9ncFiF.js → initDefaultProps-QD-koeaw.js} +1 -1
- package/src/assets/web-panel/assets/{motion-BxzXi1Pe.js → motion-CTItLW4-.js} +1 -1
- package/src/assets/web-panel/assets/{move-CRmwRuah.js → move-CGsdTOdN.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-BQq5_Znx.js → mtc-parser-C1kW_CNU.js} +1 -1
- package/src/assets/web-panel/assets/{omit-Ch4VNY2j.js → omit-B4PilaYy.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-CUioBhrz.js → pickAttrs-DBGUE12e.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-Hj3o1CrW.js → placementArrow-DZxCLjuo.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-PfqJrlkI.js → responsiveObserve-CZjQiocN.js} +1 -1
- package/src/assets/web-panel/assets/{slide-BXcnR-Lu.js → slide-Btz5hh2_.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-C74a-ofo.js → statusUtils-CfuxuLIt.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-Bq57I3ls.js → styleChecker-DdO0Obo_.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-ITPUjcDw.js → useFlexGapSupport-CxftJ-Zs.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-DzPuXDIS.js → useFs-pVJChh6K.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-DYSgt9L5.js → usePersonalDataHub-wv7Q0uNE.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-NPs_EJEk.js → vnode-DVOVfAqC.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-DZzO6KVS.js → zoom-B5tebZuT.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/commands/permissions.js +27 -2
- package/src/data/changelog.json +13 -0
- package/src/lib/background-interaction-resolver.js +4 -0
- package/src/lib/context-memory-kernel/durable-memory-port.js +68 -15
- package/src/lib/packer/pack-update-applier.js +28 -9
- package/src/lib/packer/pkg-config-generator.js +119 -2
- package/src/lib/packer/pkg-runner.js +7 -0
- package/src/lib/packer/pkg-targets.js +83 -0
- package/src/lib/packer/web-panel-builder.js +7 -0
- package/src/lib/permission-authority.js +13 -5
- package/src/lib/process-execution-broker/index.js +11 -0
- package/src/lib/process-execution-broker/linux-subreaper-helper.js +87 -13
- package/src/lib/process-execution-broker/packer-build-policy.js +31 -0
- package/src/lib/process-execution-broker/platform-sandbox.js +11 -3
- package/src/lib/scoped-permission-store.js +15 -5
- package/src/lib/settings-loader.cjs +45 -8
- package/src/assets/web-panel/assets/ChatBubbleRenderer-B8ts_JnN.js +0 -1
- package/src/assets/web-panel/assets/MarkdownRenderer-qNJS3ygh.js +0 -1
- package/src/assets/web-panel/assets/MobileProjects-DC0Clgzs.js +0 -1
- package/src/assets/web-panel/assets/devWarning-BoDvrsgY.js +0 -1
- package/src/assets/web-panel/assets/index-BhqRbl5P.js +0 -1
- package/src/assets/web-panel/assets/index-DreT6MIR.js +0 -1
|
@@ -10,7 +10,8 @@ import {
|
|
|
10
10
|
|
|
11
11
|
const {
|
|
12
12
|
applyManagedPermissionPolicy,
|
|
13
|
-
|
|
13
|
+
inspectSettingsSources,
|
|
14
|
+
projectSettingsObservation,
|
|
14
15
|
getSettingsPermissionRevision,
|
|
15
16
|
subscribeSettingsPermissionRevision,
|
|
16
17
|
} = settingsLoader;
|
|
@@ -47,9 +48,14 @@ const combinedAuthority = Object.freeze({
|
|
|
47
48
|
});
|
|
48
49
|
|
|
49
50
|
function freezeSnapshot(value) {
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
51
|
+
const pending = [value];
|
|
52
|
+
const seen = new WeakSet();
|
|
53
|
+
while (pending.length) {
|
|
54
|
+
const current = pending.pop();
|
|
55
|
+
if (!current || typeof current !== "object" || seen.has(current)) continue;
|
|
56
|
+
seen.add(current);
|
|
57
|
+
for (const child of Object.values(current)) pending.push(child);
|
|
58
|
+
Object.freeze(current);
|
|
53
59
|
}
|
|
54
60
|
return value;
|
|
55
61
|
}
|
|
@@ -83,12 +89,13 @@ export function loadPermissionAuthority({
|
|
|
83
89
|
} = {}) {
|
|
84
90
|
const settingsRevision = getSettingsPermissionRevision();
|
|
85
91
|
const scopedRevision = baseRules ? null : getScopedPermissionRevision();
|
|
86
|
-
const
|
|
92
|
+
const settingsObservation = inspectSettingsSources({
|
|
87
93
|
cwd,
|
|
88
94
|
settingsFile,
|
|
89
95
|
managedSettingsFile,
|
|
90
96
|
env,
|
|
91
97
|
});
|
|
98
|
+
const loaded = projectSettingsObservation(settingsObservation, { env });
|
|
92
99
|
const sources = baseRules ? {} : { ...loaded.sources };
|
|
93
100
|
let rules = baseRules
|
|
94
101
|
? applyManagedPermissionPolicy(baseRules, loaded.managed, sources)
|
|
@@ -143,6 +150,7 @@ export function loadPermissionAuthority({
|
|
|
143
150
|
scoped,
|
|
144
151
|
hasRules: hasRules(rules),
|
|
145
152
|
settingsRevision,
|
|
153
|
+
settingsObservation,
|
|
146
154
|
...(scopedRevision ? { scopedRevision } : {}),
|
|
147
155
|
});
|
|
148
156
|
}
|
|
@@ -86,11 +86,13 @@ import {
|
|
|
86
86
|
mcpStdioCapsuleNativeCodePolicyDigest,
|
|
87
87
|
} from "../mcp-stdio-native-code-policy.js";
|
|
88
88
|
|
|
89
|
+
import { isPackerBuildPolicy } from "./packer-build-policy.js";
|
|
89
90
|
const SUPPORTED_SANDBOX_BOUNDARIES = new Set(Object.values(SANDBOX_BOUNDARIES));
|
|
90
91
|
const SUPPORTED_SANDBOX_PROFILES = new Set([
|
|
91
92
|
"default",
|
|
92
93
|
"strict",
|
|
93
94
|
"network-only",
|
|
95
|
+
"build",
|
|
94
96
|
]);
|
|
95
97
|
// Broker-private admission state. Public runtime-probe fields are audit
|
|
96
98
|
// evidence, not authority to invoke a privileged post-spawn closure.
|
|
@@ -1590,6 +1592,15 @@ class ProcessExecutionBroker extends EventEmitter {
|
|
|
1590
1592
|
}
|
|
1591
1593
|
|
|
1592
1594
|
const profile = rawPolicy?.profile ?? null;
|
|
1595
|
+
if (
|
|
1596
|
+
profile === "build" &&
|
|
1597
|
+
!isPackerBuildPolicy(rawPolicy, options, launch)
|
|
1598
|
+
) {
|
|
1599
|
+
throw this._sandboxBoundaryError(
|
|
1600
|
+
"untrusted_build_sandbox_policy",
|
|
1601
|
+
"The build CPU budget requires an original packer policy for this origin and scope",
|
|
1602
|
+
);
|
|
1603
|
+
}
|
|
1593
1604
|
if (profile !== null && !SUPPORTED_SANDBOX_PROFILES.has(profile)) {
|
|
1594
1605
|
throw this._sandboxBoundaryError(
|
|
1595
1606
|
"invalid_sandbox_profile",
|
|
@@ -67,10 +67,77 @@ function compilerPath() {
|
|
|
67
67
|
return compiler;
|
|
68
68
|
}
|
|
69
69
|
|
|
70
|
+
function isPkgRuntime() {
|
|
71
|
+
if (!process.pkg) return false;
|
|
72
|
+
// The location is derived only from this module and pkg's bootstrap, never
|
|
73
|
+
// from cwd, executable siblings, environment variables or caller paths.
|
|
74
|
+
if (
|
|
75
|
+
typeof process.pkg.defaultEntrypoint !== "string" ||
|
|
76
|
+
!process.pkg.defaultEntrypoint.startsWith("/snapshot/") ||
|
|
77
|
+
!fileURLToPath(import.meta.url).startsWith("/snapshot/")
|
|
78
|
+
)
|
|
79
|
+
throw failure("invalid-standalone-runtime");
|
|
80
|
+
return true;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
function readPkgAsset(file, maximum) {
|
|
84
|
+
// pkg's snapshot descriptors refer to /dev/null in the kernel and are read
|
|
85
|
+
// through its immutable payload reader. They are NOT native directory FDs.
|
|
86
|
+
// Reject real files mounted under a snapshot-looking pathname as well as
|
|
87
|
+
// symlink aliases; a pathname prefix alone never establishes this identity.
|
|
88
|
+
if (fs.realpathSync(file) !== file || fs.lstatSync(file).isSymbolicLink())
|
|
89
|
+
throw failure("invalid-standalone-asset");
|
|
90
|
+
const fd = fs.openSync(file, fs.constants.O_RDONLY);
|
|
91
|
+
try {
|
|
92
|
+
if (fs.readlinkSync(`/proc/self/fd/${fd}`) !== "/dev/null")
|
|
93
|
+
throw failure("standalone-asset-not-embedded");
|
|
94
|
+
const stat = fs.fstatSync(fd);
|
|
95
|
+
if (
|
|
96
|
+
!stat.isFile() ||
|
|
97
|
+
stat.size < 1 ||
|
|
98
|
+
stat.size > maximum ||
|
|
99
|
+
stat.nlink !== 0 ||
|
|
100
|
+
stat.ino !== 0 ||
|
|
101
|
+
stat.dev !== 0
|
|
102
|
+
)
|
|
103
|
+
throw failure("invalid-standalone-asset");
|
|
104
|
+
// readFileSync(path) reads the embedded payload directly. pkg readSync(fd)
|
|
105
|
+
// can instead read a decompressed external cache when compression is on.
|
|
106
|
+
// Never trust those cache bytes as supervision executable content.
|
|
107
|
+
const bytes = fs.readFileSync(file);
|
|
108
|
+
if (
|
|
109
|
+
!Buffer.isBuffer(bytes) ||
|
|
110
|
+
bytes.length !== stat.size ||
|
|
111
|
+
bytes.length > maximum
|
|
112
|
+
)
|
|
113
|
+
throw failure("invalid-standalone-asset");
|
|
114
|
+
return bytes;
|
|
115
|
+
} finally {
|
|
116
|
+
fs.closeSync(fd);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
70
120
|
function packagedImage() {
|
|
71
121
|
const root = fileURLToPath(
|
|
72
122
|
new URL("../../assets/linux-subreaper/", import.meta.url),
|
|
73
123
|
);
|
|
124
|
+
if (isPkgRuntime()) {
|
|
125
|
+
const directory = path.join(root, `linux-${process.arch}`);
|
|
126
|
+
const manifest = readPkgAsset(
|
|
127
|
+
path.join(directory, "manifest.json"),
|
|
128
|
+
MAX_SUBREAPER_MANIFEST_BYTES,
|
|
129
|
+
);
|
|
130
|
+
const bytes = readPkgAsset(
|
|
131
|
+
path.join(directory, "supervisor"),
|
|
132
|
+
MAX_IMAGE_BYTES,
|
|
133
|
+
);
|
|
134
|
+
return {
|
|
135
|
+
bytes,
|
|
136
|
+
identity: validateLinuxSubreaperArtifact(manifest, bytes, {
|
|
137
|
+
arch: process.arch,
|
|
138
|
+
}),
|
|
139
|
+
};
|
|
140
|
+
}
|
|
74
141
|
// Only source checkouts with no packaged directory may use the development
|
|
75
142
|
// compiler path. A partial/corrupt installed payload must never fall back.
|
|
76
143
|
try {
|
|
@@ -135,23 +202,28 @@ function compileImage(spawnSync) {
|
|
|
135
202
|
const source = fileURLToPath(
|
|
136
203
|
new URL("./linux-subreaper-supervisor.c", import.meta.url),
|
|
137
204
|
);
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
205
|
+
const packed = isPkgRuntime();
|
|
206
|
+
let sourceSnapshot;
|
|
207
|
+
if (packed) {
|
|
208
|
+
sourceSnapshot = readPkgAsset(source, MAX_SOURCE_BYTES);
|
|
209
|
+
} else {
|
|
210
|
+
sourceFd = fs.openSync(
|
|
211
|
+
source,
|
|
212
|
+
fs.constants.O_RDONLY | fs.constants.O_NOFOLLOW,
|
|
213
|
+
);
|
|
214
|
+
const snapshot = readDescriptor(sourceFd, MAX_SOURCE_BYTES);
|
|
215
|
+
if (snapshot.stat.nlink !== 1n) throw failure("source-digest-mismatch");
|
|
216
|
+
sourceSnapshot = snapshot.bytes;
|
|
217
|
+
fs.closeSync(sourceFd);
|
|
218
|
+
sourceFd = null;
|
|
219
|
+
}
|
|
143
220
|
// npm/git may transport text with CRLF. Compile the exact canonical bytes
|
|
144
221
|
// that the source digest commits to, passed on stdin rather than reopened.
|
|
145
222
|
const sourceBytes = Buffer.from(
|
|
146
|
-
|
|
223
|
+
sourceSnapshot.toString("utf8").replace(/\r\n/g, "\n"),
|
|
147
224
|
);
|
|
148
|
-
if (
|
|
149
|
-
snapshot.stat.nlink !== 1n ||
|
|
150
|
-
sha(sourceBytes) !== LINUX_SUBREAPER_SOURCE_DIGEST
|
|
151
|
-
)
|
|
225
|
+
if (sha(sourceBytes) !== LINUX_SUBREAPER_SOURCE_DIGEST)
|
|
152
226
|
throw failure("source-digest-mismatch");
|
|
153
|
-
fs.closeSync(sourceFd);
|
|
154
|
-
sourceFd = null;
|
|
155
227
|
const packaged = packagedImage();
|
|
156
228
|
const compiler = packaged ? null : compilerPath();
|
|
157
229
|
temporaryRoot = fs.mkdtempSync(
|
|
@@ -253,7 +325,9 @@ function compileImage(spawnSync) {
|
|
|
253
325
|
// Do not expose compiler stdout/stderr, paths, environment, or native argv.
|
|
254
326
|
throw failure(
|
|
255
327
|
error.code === "ENOENT"
|
|
256
|
-
?
|
|
328
|
+
? process.pkg
|
|
329
|
+
? "standalone-asset-missing"
|
|
330
|
+
: "system-compiler-or-source-missing"
|
|
257
331
|
: "native-build-setup-failed",
|
|
258
332
|
);
|
|
259
333
|
} finally {
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
// In-process identity, not a JSON profile name, admits the packer's larger
|
|
2
|
+
// finite CPU budget. This grants no process permission: the broker's ordinary
|
|
3
|
+
// deny/prompt checks and strict-mode override still apply.
|
|
4
|
+
const policies = new WeakMap();
|
|
5
|
+
const origins = new Set(["packer:pkg", "packer:web-panel-build"]);
|
|
6
|
+
|
|
7
|
+
export const PACKER_BUILD_TIMEOUT_MS = 900_000;
|
|
8
|
+
|
|
9
|
+
export function createPackerBuildPolicy(origin) {
|
|
10
|
+
if (!origins.has(origin)) throw new Error("Unknown packer build origin");
|
|
11
|
+
const policy = Object.freeze({ profile: "build" });
|
|
12
|
+
policies.set(policy, origin);
|
|
13
|
+
return policy;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export function isPackerBuildPolicy(policy, options, launch = {}) {
|
|
17
|
+
const { origin, scope, shell, detached, timeout, killSignal } = options;
|
|
18
|
+
return (
|
|
19
|
+
scope === "pack" &&
|
|
20
|
+
origins.has(origin) &&
|
|
21
|
+
policies.get(policy) === origin &&
|
|
22
|
+
launch.sync === true &&
|
|
23
|
+
launch.pty !== true &&
|
|
24
|
+
shell === false &&
|
|
25
|
+
(detached === undefined || detached === false) &&
|
|
26
|
+
Number.isSafeInteger(timeout) &&
|
|
27
|
+
timeout > 0 &&
|
|
28
|
+
timeout <= PACKER_BUILD_TIMEOUT_MS &&
|
|
29
|
+
killSignal === "SIGKILL"
|
|
30
|
+
);
|
|
31
|
+
}
|
|
@@ -2128,7 +2128,7 @@ export function applyMacSandbox(
|
|
|
2128
2128
|
// non-strict mode records the unavailable primitive and executes the
|
|
2129
2129
|
// original invocation, while strict mode fails closed. Explicit strict or
|
|
2130
2130
|
// network-only profiles still opt in to the sandbox-exec wrapper below.
|
|
2131
|
-
if ((sandboxOpts.profileName || "default")
|
|
2131
|
+
if (["default", "build"].includes(sandboxOpts.profileName || "default")) {
|
|
2132
2132
|
return createSandboxPlan({
|
|
2133
2133
|
...base,
|
|
2134
2134
|
reason: "macos_default_profile_requires_explicit_policy",
|
|
@@ -9969,8 +9969,16 @@ export function applySandbox(
|
|
|
9969
9969
|
};
|
|
9970
9970
|
|
|
9971
9971
|
const profile = {
|
|
9972
|
-
...(
|
|
9973
|
-
|
|
9972
|
+
...(profileName === "build"
|
|
9973
|
+
? {
|
|
9974
|
+
...profiles.default,
|
|
9975
|
+
limits: { ...profiles.default.limits, cpu: 600 },
|
|
9976
|
+
}
|
|
9977
|
+
: profiles[profileName] || profiles.default),
|
|
9978
|
+
profileName:
|
|
9979
|
+
profileName === "build" || profiles[profileName]
|
|
9980
|
+
? profileName
|
|
9981
|
+
: "default",
|
|
9974
9982
|
requiredBoundaries: sandboxRequest.requiredBoundaries,
|
|
9975
9983
|
sync: sandboxRequest.sync,
|
|
9976
9984
|
pty: sandboxRequest.pty,
|
|
@@ -143,7 +143,7 @@ function validateRecord(record, seenIds) {
|
|
|
143
143
|
seenIds.has(record.id) ||
|
|
144
144
|
!DECISIONS.has(record.decision) ||
|
|
145
145
|
!parseRule(record.rule) ||
|
|
146
|
-
!Number.
|
|
146
|
+
!Number.isSafeInteger(record.revision) ||
|
|
147
147
|
record.revision < 1 ||
|
|
148
148
|
!Number.isFinite(record.createdAt) ||
|
|
149
149
|
!Number.isFinite(record.expiresAt) ||
|
|
@@ -165,7 +165,7 @@ function validateState(value, workspace) {
|
|
|
165
165
|
!value ||
|
|
166
166
|
value.schema !== STATE_SCHEMA ||
|
|
167
167
|
value.schemaVersion !== STATE_SCHEMA_VERSION ||
|
|
168
|
-
!Number.
|
|
168
|
+
!Number.isSafeInteger(value.generation) ||
|
|
169
169
|
value.generation < 0 ||
|
|
170
170
|
!value.workspace ||
|
|
171
171
|
value.workspace.id !== workspace.id ||
|
|
@@ -188,6 +188,16 @@ function statusFor(record, now) {
|
|
|
188
188
|
return "active";
|
|
189
189
|
}
|
|
190
190
|
|
|
191
|
+
function nextVersion(value, label) {
|
|
192
|
+
if (value === Number.MAX_SAFE_INTEGER) {
|
|
193
|
+
throw scopedPermissionError(
|
|
194
|
+
SCOPED_PERMISSION_ERROR_CODES.INVALID,
|
|
195
|
+
`Scoped permission ${label} is exhausted`,
|
|
196
|
+
);
|
|
197
|
+
}
|
|
198
|
+
return value + 1;
|
|
199
|
+
}
|
|
200
|
+
|
|
191
201
|
function projectRecord(record, now, filePath) {
|
|
192
202
|
return Object.freeze({
|
|
193
203
|
...structuredClone(record),
|
|
@@ -412,7 +422,7 @@ export class ScopedPermissionStore {
|
|
|
412
422
|
reason: normalizedReason,
|
|
413
423
|
};
|
|
414
424
|
Object.assign(draft, current, {
|
|
415
|
-
generation: current.generation
|
|
425
|
+
generation: nextVersion(current.generation, "generation"),
|
|
416
426
|
updatedAt: now,
|
|
417
427
|
rules: [...retained, created],
|
|
418
428
|
});
|
|
@@ -462,13 +472,13 @@ export class ScopedPermissionStore {
|
|
|
462
472
|
}
|
|
463
473
|
revoked = {
|
|
464
474
|
...record,
|
|
465
|
-
revision: record.revision
|
|
475
|
+
revision: nextVersion(record.revision, "revision"),
|
|
466
476
|
revokedAt: now,
|
|
467
477
|
};
|
|
468
478
|
const rules = [...current.rules];
|
|
469
479
|
rules[index] = revoked;
|
|
470
480
|
Object.assign(draft, current, {
|
|
471
|
-
generation: current.generation
|
|
481
|
+
generation: nextVersion(current.generation, "generation"),
|
|
472
482
|
updatedAt: now,
|
|
473
483
|
rules,
|
|
474
484
|
});
|
|
@@ -50,6 +50,7 @@ const _deps = {
|
|
|
50
50
|
writeSecurityStore: (...args) => securityStore().writeSecurityStore(...args),
|
|
51
51
|
withFileLock: (...args) => lockHelper()(...args),
|
|
52
52
|
};
|
|
53
|
+
const settingsObservations = new WeakSet();
|
|
53
54
|
|
|
54
55
|
// A process-wide owner deliberately revokes unrelated projects too. Matching
|
|
55
56
|
// only contributing paths misses absent files, parent discovery and aliases.
|
|
@@ -173,7 +174,7 @@ function inspectSettingsSources(opts = {}) {
|
|
|
173
174
|
...settingsPaths(cwd, opts.settingsFile),
|
|
174
175
|
managedSettingsPath(opts),
|
|
175
176
|
];
|
|
176
|
-
|
|
177
|
+
const observation = Object.freeze({
|
|
177
178
|
schema: "chainlesschain.settings-source-observation/v1",
|
|
178
179
|
cwd,
|
|
179
180
|
sources: observeSettingsSources(candidates, {
|
|
@@ -181,6 +182,8 @@ function inspectSettingsSources(opts = {}) {
|
|
|
181
182
|
maxBytes: opts.maxBytes,
|
|
182
183
|
}),
|
|
183
184
|
});
|
|
185
|
+
settingsObservations.add(observation);
|
|
186
|
+
return observation;
|
|
184
187
|
}
|
|
185
188
|
|
|
186
189
|
/** Organization-controlled settings file. This layer is always highest. */
|
|
@@ -273,13 +276,50 @@ function loadSettings(opts = {}) {
|
|
|
273
276
|
const cwd = opts.cwd || process.cwd();
|
|
274
277
|
const env = opts.env || process.env;
|
|
275
278
|
const onWarn = opts.onWarn;
|
|
279
|
+
function* layers() {
|
|
280
|
+
for (const file of settingsPaths(cwd, opts.settingsFile)) {
|
|
281
|
+
yield { file, settings: readSettingsFile(file, { onWarn }) };
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
return mergePermissionSettings(layers(), env, () =>
|
|
285
|
+
loadManagedSettings({
|
|
286
|
+
env,
|
|
287
|
+
managedSettingsFile: opts.managedSettingsFile,
|
|
288
|
+
onWarn,
|
|
289
|
+
}),
|
|
290
|
+
);
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
/**
|
|
294
|
+
* Project the exact JSON trees read and hashed by inspectSettingsSources.
|
|
295
|
+
* No path discovery or filesystem read occurs here. The final source has the
|
|
296
|
+
* managed role even when an earlier explicit/user/project source has the same
|
|
297
|
+
* path; retaining both positions preserves precedence and provenance.
|
|
298
|
+
*
|
|
299
|
+
* This is a byte-bound projection, not a fresh authority check or an atomic
|
|
300
|
+
* inventory snapshot. Environment inputs retain their existing sampling rules.
|
|
301
|
+
*/
|
|
302
|
+
function projectSettingsObservation(observation, { env = {} } = {}) {
|
|
303
|
+
if (!settingsObservations.has(observation)) {
|
|
304
|
+
throw new TypeError("A strict settings source observation is required");
|
|
305
|
+
}
|
|
306
|
+
const managed = observation.sources[observation.sources.length - 1];
|
|
307
|
+
return mergePermissionSettings(
|
|
308
|
+
observation.sources.slice(0, -1).map((source) => ({
|
|
309
|
+
file: source.logicalPath,
|
|
310
|
+
settings: source.settings,
|
|
311
|
+
})),
|
|
312
|
+
env,
|
|
313
|
+
() => ({ file: managed.logicalPath, settings: managed.settings }),
|
|
314
|
+
);
|
|
315
|
+
}
|
|
276
316
|
|
|
317
|
+
function mergePermissionSettings(layers, env, readManaged) {
|
|
277
318
|
let rules = emptyRules();
|
|
278
319
|
const sources = {};
|
|
279
320
|
const files = [];
|
|
280
321
|
|
|
281
|
-
for (const file of
|
|
282
|
-
const data = readSettingsFile(file, { onWarn });
|
|
322
|
+
for (const { file, settings: data } of layers) {
|
|
283
323
|
if (!data) continue;
|
|
284
324
|
const perms =
|
|
285
325
|
data.permissions && typeof data.permissions === "object"
|
|
@@ -308,11 +348,7 @@ function loadSettings(opts = {}) {
|
|
|
308
348
|
}
|
|
309
349
|
if (envContributed) files.push("<env>");
|
|
310
350
|
|
|
311
|
-
const managedLoaded =
|
|
312
|
-
env,
|
|
313
|
-
managedSettingsFile: opts.managedSettingsFile,
|
|
314
|
-
onWarn,
|
|
315
|
-
});
|
|
351
|
+
const managedLoaded = readManaged();
|
|
316
352
|
if (managedLoaded.settings) {
|
|
317
353
|
rules = applyManagedPermissionPolicy(
|
|
318
354
|
rules,
|
|
@@ -662,6 +698,7 @@ function readStringArraySetting(key, opts = {}) {
|
|
|
662
698
|
|
|
663
699
|
module.exports = {
|
|
664
700
|
inspectSettingsSources,
|
|
701
|
+
projectSettingsObservation,
|
|
665
702
|
loadSettings,
|
|
666
703
|
loadSettingsConfig,
|
|
667
704
|
readSettingsFile,
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{I as v,P as u,J as S,U as s,R as a,S as y,K as C,Q as x,V as w,_ as B,b as n}from"./vendor-Bn1JzzAn.js";import{_ as k}from"./index-CuZupgUw.js";import"./icons-DG5UD-6K.js";const N={__name:"ChatBubbleRenderer",props:{event:{type:Object,required:!0}},setup(c,{expose:d}){d();const t=c,r=n(()=>{const e=t.event.content||{};return e.text||e.body||e.message||e.title||JSON.stringify(e).slice(0,200)}),i=n(()=>{const e=t.event.content||{};return e.from||e.sender||e.senderName||t.event.actor||"(unknown)"}),l=n(()=>{const e=(t.event.actor||"").toLowerCase();return e.includes("self")||e==="me"||e.endsWith("_self")}),o=n(()=>{const e=t.event.source.adapter||"";return e.startsWith("messaging-qq")?"magenta":e==="wechat"?"green":"blue"}),m=n(()=>{if(!t.event.occurredAt)return"";try{const e=new Date(t.event.occurredAt),p=e.getFullYear(),f=String(e.getMonth()+1).padStart(2,"0"),g=String(e.getDate()).padStart(2,"0"),b=String(e.getHours()).padStart(2,"0"),h=String(e.getMinutes()).padStart(2,"0");return`${p}-${f}-${g} ${b}:${h}`}catch{return""}}),_={props:t,messageText:r,actorLabel:i,isMine:l,adapterColor:o,formattedTime:m,computed:n};return Object.defineProperty(_,"__isScriptSetup",{enumerable:!1,value:!0}),_}},T={class:"bubble"},M={class:"meta"},R={class:"actor"},V={class:"time"},q={class:"body"};function D(c,d,t,r,i,l){const o=v("a-tag");return u(),S("div",{class:B(["chat-row",{mine:r.isMine}])},[s("div",T,[s("div",M,[s("span",R,a(r.actorLabel),1),s("span",V,a(r.formattedTime),1)]),s("div",q,a(r.messageText),1),t.event.source.adapter?(u(),y(o,{key:0,class:"src",color:r.adapterColor},{default:C(()=>[x(a(t.event.source.adapter),1)]),_:1},8,["color"])):w("v-if",!0)])],2)}const j=k(N,[["render",D],["__scopeId","data-v-49238629"],["__file","/tmp/cc-web-panel-eIdfn0/repo/packages/web-panel/src/components/pdh/renderers/ChatBubbleRenderer.vue"]]);export{j as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{P as c,J as d,b as s}from"./vendor-Bn1JzzAn.js";import{r as a}from"./markdown-Yo_c6Krv.js";import{_ as p}from"./index-CuZupgUw.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 m(t,o,e,r,n,u){return c(),d("div",{class:"markdown-content",innerHTML:r.rendered},null,8,i)}const w=p(_,[["render",m],["__scopeId","data-v-0b0b9f63"],["__file","/tmp/cc-web-panel-eIdfn0/repo/packages/web-panel/src/components/MarkdownRenderer.vue"]]);export{w as M};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{I as n,J as g,c as l,K as r,N as u,P as h,U as o,R as t,Q as b}from"./vendor-Bn1JzzAn.js";import{_ as v,b as m}from"./index-CuZupgUw.js";import{a8 as y,M}from"./icons-DG5UD-6K.js";const B={__name:"MobileProjects",setup(p,{expose:i}){i();const c=u(),{t:e}=m();function a(){c.push("/projects")}function _(){c.push("/mobile-bridge")}const s={router:c,t:e,goToProjects:a,goToMobileBridge:_,get useRouter(){return u},get useI18n(){return m},get MobileOutlined(){return M},get FolderOutlined(){return y}};return Object.defineProperty(s,"__isScriptSetup",{enumerable:!1,value:!0}),s}},x={class:"mobile-projects-placeholder"},O={class:"title"},k={class:"subtitle"},w={class:"explainer"};function T(p,i,c,e,a,_){const s=n("a-alert"),d=n("a-button"),f=n("a-space"),P=n("a-empty"),j=n("a-card");return h(),g("div",x,[l(j,null,{default:r(()=>[l(P,{description:!1},{image:r(()=>[l(e.MobileOutlined,{style:{fontSize:"64px",color:"#bfbfbf"}})]),default:r(()=>[o("h2",O,t(e.t("mobileProjects.title")),1),o("p",k,t(e.t("mobileProjects.subtitle")),1),l(s,{message:e.t("mobileProjects.v02Banner"),type:"info","show-icon":"",class:"banner"},null,8,["message"]),o("div",w,[o("h3",null,t(e.t("mobileProjects.currentDirection")),1),o("p",null,t(e.t("mobileProjects.currentDirectionBody")),1),o("ul",null,[o("li",null,t(e.t("mobileProjects.stepPhone")),1),o("li",null,t(e.t("mobileProjects.stepTap")),1),o("li",null,t(e.t("mobileProjects.stepPull")),1)]),o("h3",null,t(e.t("mobileProjects.reverseDirection")),1),o("p",null,t(e.t("mobileProjects.reverseDirectionBody")),1)]),l(f,{class:"actions"},{default:r(()=>[l(d,{type:"primary",onClick:e.goToProjects},{default:r(()=>[l(e.FolderOutlined),b(" "+t(e.t("mobileProjects.viewLocalProjects")),1)]),_:1}),l(d,{onClick:e.goToMobileBridge},{default:r(()=>[l(e.MobileOutlined),b(" "+t(e.t("mobileProjects.checkBridge")),1)]),_:1})]),_:1})]),_:1})]),_:1})])}const N=v(B,[["render",T],["__scopeId","data-v-9262cc45"],["__file","/tmp/cc-web-panel-eIdfn0/repo/packages/web-panel/src/views/MobileProjects.vue"]]);export{N as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{Q as r}from"./index-CuZupgUw.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-G0zYohIP.js";import{a0 as t}from"./index-CuZupgUw.js";import"./vendor-Bn1JzzAn.js";import"./index-BZ7mv_oS.js";import"./icons-DG5UD-6K.js";const s=t(o);export{s as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{A as o}from"./Row-EzEMaYoV.js";import{a0 as t}from"./index-CuZupgUw.js";import"./vendor-Bn1JzzAn.js";import"./responsiveObserve-PfqJrlkI.js";import"./useFlexGapSupport-ITPUjcDw.js";import"./styleChecker-Bq57I3ls.js";import"./index-BZ7mv_oS.js";import"./icons-DG5UD-6K.js";const l=t(o);export{l as default};
|