@chibitek/chibi 0.1.169 → 0.1.171

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (99) hide show
  1. package/dist/assets/{abnfDiagram-O67JEVCF-aQkRN0ee.js → abnfDiagram-O67JEVCF-DrPBKmVh.js} +1 -1
  2. package/dist/assets/{arc-BT7qPVAa.js → arc-BEIChVSB.js} +1 -1
  3. package/dist/assets/{architectureDiagram-NJMV4G6O-oMlARqKW.js → architectureDiagram-NJMV4G6O-Da60nTzs.js} +1 -1
  4. package/dist/assets/{blockDiagram-BEXU5L5S-CKUrb4js.js → blockDiagram-BEXU5L5S-_NelwIQj.js} +1 -1
  5. package/dist/assets/{c4Diagram-YGBWAQC7-BkL5cRIA.js → c4Diagram-YGBWAQC7-DUdkQ3dy.js} +1 -1
  6. package/dist/assets/channel-DEJSSlVQ.js +1 -0
  7. package/dist/assets/{chunk-2Q5K7J3B-BMitkm2s.js → chunk-2Q5K7J3B-BQgYAptM.js} +1 -1
  8. package/dist/assets/{chunk-3FUC2YCW-DOhVN2ed.js → chunk-3FUC2YCW-XXOXwcoW.js} +2 -2
  9. package/dist/assets/{chunk-5VM5RSS4-BFkFo_ng.js → chunk-5VM5RSS4-CUyMXCSt.js} +1 -1
  10. package/dist/assets/{chunk-GTNCS2PH-QbxYUf3Q.js → chunk-GTNCS2PH-BwctbINm.js} +1 -1
  11. package/dist/assets/{chunk-GWA4HPMP-BZChfTYw.js → chunk-GWA4HPMP-DQ0bZK59.js} +1 -1
  12. package/dist/assets/{chunk-JWPE2WC7-BXpmYglA.js → chunk-JWPE2WC7-BADCk9AK.js} +1 -1
  13. package/dist/assets/{chunk-NETBCI7D-CIZTrz1i.js → chunk-NETBCI7D-CoJxabSR.js} +1 -1
  14. package/dist/assets/{chunk-WEXAMYUT-FhqQ0sO0.js → chunk-WEXAMYUT-fupByVJn.js} +1 -1
  15. package/dist/assets/{chunk-XXDRQBXY-5ThtmFbP.js → chunk-XXDRQBXY-BavbGHGi.js} +1 -1
  16. package/dist/assets/{classDiagram-v2-NBCMYWYE-BzObC5Qw.js → classDiagram-v2-NBCMYWYE-B5wfUNKJ.js} +1 -1
  17. package/dist/assets/{cose-bilkent-JH36ORCC-BASV9Okv.js → cose-bilkent-JH36ORCC-DlYFmKDe.js} +1 -1
  18. package/dist/assets/{cynefin-OW5HDTMX-B0zQYMFh.js → cynefin-OW5HDTMX-Y0U-21MH.js} +1 -1
  19. package/dist/assets/{cynefinDiagram-VND7K2PF-DMEO1cHA.js → cynefinDiagram-VND7K2PF-D1Fh1sU0.js} +1 -1
  20. package/dist/assets/{dagre-6A5THRUB-BG04TSi_.js → dagre-6A5THRUB-BNU-Trog.js} +1 -1
  21. package/dist/assets/{diagram-22UHCM2B-CfpVNMhg.js → diagram-22UHCM2B-Bjie4nDQ.js} +1 -1
  22. package/dist/assets/{diagram-3UASUU5V-DG9L4I1L.js → diagram-3UASUU5V-Qnbrq1T5.js} +1 -1
  23. package/dist/assets/{diagram-ATOU4E4O-Db7Bf63S.js → diagram-ATOU4E4O-CNJasPCN.js} +1 -1
  24. package/dist/assets/{diagram-CDSNMT55-Cdzv1tJn.js → diagram-CDSNMT55-BAzGZBKX.js} +1 -1
  25. package/dist/assets/{diagram-MLGK6HIB-BBMeXGKE.js → diagram-MLGK6HIB-I8ACRaw-.js} +1 -1
  26. package/dist/assets/{diagram-MPIPVDR6-BAQ22zk3.js → diagram-MPIPVDR6-nLlrAEPz.js} +1 -1
  27. package/dist/assets/{ebnfDiagram-ZINNZB2B-BDZgSFSF.js → ebnfDiagram-ZINNZB2B-DF9BG3pH.js} +1 -1
  28. package/dist/assets/{elk-276RUBZZ-Bx4-nN8N.js → elk-276RUBZZ-C1AJYKMV.js} +1 -1
  29. package/dist/assets/{erDiagram-OPXOYQCR-D2Pn-cqm.js → erDiagram-OPXOYQCR-MNNcRrPy.js} +1 -1
  30. package/dist/assets/{flowDiagram-KWPJA3E3-hsbvL3Ow.js → flowDiagram-KWPJA3E3-C7mfBfgt.js} +1 -1
  31. package/dist/assets/{ganttDiagram-FUAMR5RP-DBUgYe4p.js → ganttDiagram-FUAMR5RP-a9zNyDbb.js} +1 -1
  32. package/dist/assets/{gitGraphDiagram-X574FWY7-ChGeSINg.js → gitGraphDiagram-X574FWY7-OL8NhUsO.js} +1 -1
  33. package/dist/assets/{index-ByXr4FRl.js → index-DojGBgbN.js} +167 -164
  34. package/dist/assets/{index-Ch93Ygtq.js → index-xypOVpVT.js} +1 -1
  35. package/dist/assets/{infoDiagram-VRGFBTTK-DY2EeC-A.js → infoDiagram-VRGFBTTK-CF-3pzUZ.js} +1 -1
  36. package/dist/assets/{ishikawaDiagram-OU5B5YK6-BznYuY04.js → ishikawaDiagram-OU5B5YK6-B2HqD-sv.js} +1 -1
  37. package/dist/assets/{journeyDiagram-ZHPQQLJL-CX74ZLbW.js → journeyDiagram-ZHPQQLJL-84gzOTb9.js} +1 -1
  38. package/dist/assets/{kanban-definition-PNTS6WVX-0DPavB-t.js → kanban-definition-PNTS6WVX-D7Ee23QC.js} +1 -1
  39. package/dist/assets/{linear-BHeqbvM8.js → linear-CdAXsmfc.js} +1 -1
  40. package/dist/assets/{mermaid.core-Dm-Ny6a0.js → mermaid.core-CE_M1v1e.js} +5 -5
  41. package/dist/assets/{mindmap-definition-NLK3R4M7-BPrMElav.js → mindmap-definition-NLK3R4M7-KSTIET9y.js} +1 -1
  42. package/dist/assets/{pegDiagram-GJSIUBJH-CaD7wyyX.js → pegDiagram-GJSIUBJH-C7ogvddb.js} +1 -1
  43. package/dist/assets/{pieDiagram-5QR66LMP-lbSp8R4K.js → pieDiagram-5QR66LMP-Bp1CgCrM.js} +1 -1
  44. package/dist/assets/{quadrantDiagram-O4NWA36T-Bs3Sn2of.js → quadrantDiagram-O4NWA36T-Bw7aN9Lh.js} +1 -1
  45. package/dist/assets/{railroadDiagram-XR7U4H2S-C88ykXCV.js → railroadDiagram-XR7U4H2S-Dij4U4NY.js} +1 -1
  46. package/dist/assets/{requirementDiagram-PLB6GJNP-mgIQnORW.js → requirementDiagram-PLB6GJNP-DOxTQvCl.js} +1 -1
  47. package/dist/assets/{sankeyDiagram-IPEJSGJF-K5esEw-m.js → sankeyDiagram-IPEJSGJF-DPCUmNbV.js} +1 -1
  48. package/dist/assets/{sequenceDiagram-PO4LG4MO-D5v8PJqQ.js → sequenceDiagram-PO4LG4MO-DPjC8zGe.js} +1 -1
  49. package/dist/assets/{sizeCapture-INFHLROL-BHBBDTEI.js → sizeCapture-INFHLROL-WlmsNlh-.js} +1 -1
  50. package/dist/assets/{stateDiagram-v2-GCMORJYK-CeRdNmKQ.js → stateDiagram-v2-GCMORJYK-BwMPiapI.js} +1 -1
  51. package/dist/assets/{swimlanes-2SLR337P-D8CbMCI8.js → swimlanes-2SLR337P-Cyja7ZPb.js} +1 -1
  52. package/dist/assets/swimlanesDiagram-TC7HE7FX-Dh25zxzq.js +8 -0
  53. package/dist/assets/{timeline-definition-EJHVYXUP-CMG02UV1.js → timeline-definition-EJHVYXUP-BehkSauz.js} +1 -1
  54. package/dist/assets/{usecaseDiagram-POWQR4AR-Bm8h6ijK.js → usecaseDiagram-POWQR4AR-koUjcmpW.js} +1 -1
  55. package/dist/assets/{vennDiagram-UO4OBE2U-Dk9tFjlM.js → vennDiagram-UO4OBE2U-Ch8TXIpy.js} +1 -1
  56. package/dist/assets/{wardleyDiagram-VNRHLVJA-61vrb2Ft.js → wardleyDiagram-VNRHLVJA-Dm5kC4c2.js} +1 -1
  57. package/dist/assets/{xychartDiagram-PMCCYNJV-C7uO44ng.js → xychartDiagram-PMCCYNJV-YA-1zyQz.js} +1 -1
  58. package/dist/handbook/atomic-handbook.html +1 -1
  59. package/dist/index.html +1 -1
  60. package/dist-server/companion/src/routes.js +28 -1
  61. package/dist-server/container-mcp.js +1 -0
  62. package/dist-server/hooks/plan-hook.js +22 -0
  63. package/dist-server/index.js +38538 -37905
  64. package/dist-server/local-computer.js +1 -0
  65. package/dist-server/openmausbot.js +389 -303
  66. package/dist-server/pair-cli.js +389 -303
  67. package/dist-server/proxy-paths.js +1 -0
  68. package/dist-server/server/atomic-engine-release.js +13 -13
  69. package/dist-server/server/bot-work-modes.js +212 -0
  70. package/dist-server/server/config.js +6 -5
  71. package/dist-server/server/drivers/acp/core.js +6 -4
  72. package/dist-server/server/drivers/acp/custom.js +51 -37
  73. package/dist-server/server/drivers/builtIn.js +2 -1
  74. package/dist-server/server/drivers/chat-mcp-tools.js +1 -0
  75. package/dist-server/server/drivers/claude.js +28 -25
  76. package/dist-server/server/drivers/codex-approval-presets.js +34 -0
  77. package/dist-server/server/drivers/codex.js +11 -35
  78. package/dist-server/server/drivers/openai-chat.js +4 -3
  79. package/dist-server/server/hooks/plan-hook.js +17 -0
  80. package/dist-server/server/index.js +92 -175
  81. package/dist-server/server/mcp-interactive-probe.js +60 -0
  82. package/dist-server/server/mcp-remote-bridge.js +13 -6
  83. package/dist-server/server/message-file.js +28 -11
  84. package/dist-server/server/plan-policy.js +14 -0
  85. package/dist-server/server/proxy-paths.js +1 -0
  86. package/dist-server/server/remote-desktop.js +142 -0
  87. package/dist-server/server/routes/message-file.js +115 -0
  88. package/dist-server/server/shared-deliverables.js +109 -0
  89. package/dist-server/server/skill-learn.js +4 -0
  90. package/dist-server/server/store.js +4 -4
  91. package/dist-server/server/subscription-bots.js +3 -2
  92. package/dist-server/shared/approval-mode.js +3 -1
  93. package/dist-server/shared/engine-choices.js +1 -1
  94. package/dist-server/shared/provider-accounts.js +5 -5
  95. package/dist-server/shared/skill-command.js +16 -0
  96. package/dist-server/vps-container-mcp.js +1 -0
  97. package/package.json +1 -1
  98. package/dist/assets/channel-BZDQCBTd.js +0 -1
  99. package/dist/assets/swimlanesDiagram-TC7HE7FX-CQHcTGnI.js +0 -8
@@ -1,3 +1,4 @@
1
+ import { namedApprovalParams } from "./codex-approval-presets.js";
1
2
  import { codexToolSurfaceArgs } from "./codex-tool-surface.js";
2
3
  import { codexImage } from "./codex-image.js";
3
4
  // Official Codex app-server over newline-delimited JSON-RPC on stdio.
@@ -183,40 +184,6 @@ function additionalPermissionSummary(permissions, reason) {
183
184
  const plainRecord = (value) => value && typeof value === "object" && !Array.isArray(value)
184
185
  ? value
185
186
  : null;
186
- /** Codex persists these values on its native thread. Keep them explicit on
187
- * start, resume, and every turn so switching modes cannot leave a more
188
- * permissive sandbox/reviewer stuck to the next request. */
189
- /** Ask and Edits both run Codex's workspace-write sandbox with the person as
190
- * reviewer: Codex has no narrower "edits only" mode, so the selector never
191
- * offers Edits for it (supportsApprovalMode) and a stray value asks. */
192
- function namedApprovalParams(mode) {
193
- if (mode === "full") {
194
- return {
195
- thread: {
196
- approvalPolicy: "never",
197
- approvalsReviewer: "user",
198
- sandbox: "danger-full-access",
199
- },
200
- turn: {
201
- approvalPolicy: "never",
202
- approvalsReviewer: "user",
203
- sandboxPolicy: { type: "dangerFullAccess" },
204
- },
205
- };
206
- }
207
- return {
208
- thread: {
209
- approvalPolicy: "on-request",
210
- approvalsReviewer: mode === "auto" ? "auto_review" : "user",
211
- sandbox: "workspace-write",
212
- },
213
- turn: {
214
- approvalPolicy: "on-request",
215
- approvalsReviewer: mode === "auto" ? "auto_review" : "user",
216
- sandboxPolicy: { type: "workspaceWrite" },
217
- },
218
- };
219
- }
220
187
  /** Linked repos besides the working folder become extra writable roots of
221
188
  * Codex's workspace-write sandbox (the app-server's equivalent of the CLI's
222
189
  * --add-dir). Full access already reaches them; read-only and a named
@@ -559,6 +526,9 @@ export const CodexDriver = {
559
526
  // instance's legacy fullAuto setting. Harness turns always send an
560
527
  // explicit mode, which takes precedence.
561
528
  const approvalMode = turn.approvalMode ?? (config.fullAuto ? "full" : "ask");
529
+ // Plan has no MCP/harness tools, even when a user opted into native MCP.
530
+ if (approvalMode === "plan")
531
+ turn = { ...turn, integrations: undefined, mcpFromUserConfig: false };
562
532
  // The person's servers this turn mounts. One that would clobber a
563
533
  // harness-owned variable is left out, not fatal: the rest still mount.
564
534
  const customServers = {};
@@ -627,7 +597,7 @@ export const CodexDriver = {
627
597
  // The harness's own mounts above are never switched off by this.
628
598
  if (!turn.mcpFromUserConfig) {
629
599
  const harnessMounts = new Set(["openmausbot_connectors", "atomic_accounts", "agents", "computer", "browser", "openmausbot_phone"]);
630
- appServerArgs.push(...codexUserMcpOffArgs(new Map([...declaredInCodexConfig].filter(([name]) => !harnessMounts.has(name)))));
600
+ appServerArgs.push(...codexUserMcpOffArgs(new Map([...declaredInCodexConfig].filter(([name]) => approvalMode === "plan" || !harnessMounts.has(name)))));
631
601
  // Same rule for the person's plugins (a `git ls-remote` per Git
632
602
  // marketplace at every start) and personal skills (listed in the
633
603
  // model's context on every call). Sign-in is untouched.
@@ -656,6 +626,8 @@ export const CodexDriver = {
656
626
  const prefix = "mcp_servers.openmausbot_phone";
657
627
  appServerArgs.push("-c", `${prefix}.command=${JSON.stringify(bridge.command)}`, "-c", `${prefix}.args=${JSON.stringify(bridge.args)}`, "-c", `${prefix}.env_vars=${JSON.stringify(Object.keys(bridge.env))}`, "-c", `${prefix}.default_tools_approval_mode="auto"`);
658
628
  }
629
+ if (approvalMode === "plan")
630
+ appServerArgs.push("-c", 'web_search="disabled"', "-c", "features.apps=false", "-c", "features.multi_agent=false");
659
631
  const child = spawnCli(config.cli, appServerArgs, {
660
632
  cwd: childCwd,
661
633
  env,
@@ -925,6 +897,10 @@ export const CodexDriver = {
925
897
  : isAdditionalPermission
926
898
  ? { permissions: allow ? grantedPermissions(params.permissions) : {}, scope: "turn" }
927
899
  : { decision: allow ? (legacy ? "approved" : "accept") : legacy ? "denied" : "decline" };
900
+ if (approvalMode === "plan" && isPermission) {
901
+ send({ jsonrpc: "2.0", id: msg.id, result: permissionResult(false) });
902
+ return;
903
+ }
928
904
  if (autoAcceptPermissions && isPermission && !serverConfirm) {
929
905
  return send({
930
906
  jsonrpc: "2.0",
@@ -1,3 +1,4 @@
1
+ import { PLAN_REFUSAL } from "../plan-policy.js";
1
2
  import { newEventId, newId } from "../contracts.js";
2
3
  import { redactSecretsInText } from "../redact.js";
3
4
  import { toolDetailPreview } from "../tool-summary.js";
@@ -423,8 +424,8 @@ export function createOpenAIChatRuntime(options) {
423
424
  // so it is honoured here: without it every single tool call on
424
425
  // an OpenAI-compatible engine stops for a card, and a Chief's
425
426
  // delegated Full access cannot help either.
426
- const allowed = turn.approvalMode === "full"
427
- || await approval.ask(call.function.name, inputPreview ?? "This tool has no arguments.", tools.customTool?.(call.function.name));
427
+ const allowed = (turn.approvalMode !== "plan" || tools.planReadOnly?.(call.function.name) === true) && (turn.approvalMode === "full"
428
+ || await approval.ask(call.function.name, inputPreview ?? "This tool has no arguments.", tools.customTool?.(call.function.name)));
428
429
  abort.signal.throwIfAborted();
429
430
  emit({ ...base(turn.threadId, turnId), type: "item.started", itemType: "tool", itemId: call.id,
430
431
  title: call.function.name, ...(inputPreview ? { input: inputPreview } : {}),
@@ -444,7 +445,7 @@ export function createOpenAIChatRuntime(options) {
444
445
  }
445
446
  else {
446
447
  denials.push(call.function.name);
447
- result = { ok: false, text: "Permission denied or expired; the tool was not executed." };
448
+ result = { ok: false, text: turn.approvalMode === "plan" && tools.planReadOnly?.(call.function.name) !== true ? PLAN_REFUSAL : "Permission denied or expired; the tool was not executed." };
448
449
  }
449
450
  }
450
451
  catch (error) {
@@ -0,0 +1,17 @@
1
+ // Atomic Engineering, 2026-10-31. Claude PreToolUse Plan guard.
2
+ import { readFileSync } from "node:fs";
3
+ import { planToolAllowed, PLAN_REFUSAL } from "../plan-policy.js";
4
+ try {
5
+ const event = JSON.parse(readFileSync(0, "utf8"));
6
+ if (event.hook_event_name === "PreToolUse" && planToolAllowed(event.tool_name)) {
7
+ // No permission override: reads still obey Claude's normal access checks.
8
+ }
9
+ else {
10
+ process.stderr.write(PLAN_REFUSAL);
11
+ process.exitCode = 2;
12
+ }
13
+ }
14
+ catch {
15
+ process.stderr.write(PLAN_REFUSAL);
16
+ process.exitCode = 2;
17
+ }