@rryando/arcs 4.2.0 → 5.0.0
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 +2 -2
- package/dist/cli/arcs-flash.d.ts +1 -1
- package/dist/cli/arcs-flash.d.ts.map +1 -1
- package/dist/cli/arcs-flash.js +6 -6
- package/dist/cli/arcs-flash.js.map +1 -1
- package/dist/cli/arcs-orchestrate.d.ts +1 -1
- package/dist/cli/arcs-orchestrate.d.ts.map +1 -1
- package/dist/cli/arcs-orchestrate.js +4 -2
- package/dist/cli/arcs-orchestrate.js.map +1 -1
- package/dist/cli/commands/index.d.ts +1 -1
- package/dist/cli/commands/index.d.ts.map +1 -1
- package/dist/cli/commands/index.js +1 -1
- package/dist/cli/commands/index.js.map +1 -1
- package/dist/cli/commands/project.js +1 -30
- package/dist/cli/commands/project.js.map +1 -1
- package/dist/cli/commands/proposal-doc.d.ts +2 -0
- package/dist/cli/commands/proposal-doc.d.ts.map +1 -0
- package/dist/cli/commands/proposal-doc.js +382 -0
- package/dist/cli/commands/proposal-doc.js.map +1 -0
- package/dist/cli/commands/web.js +4 -10
- package/dist/cli/commands/web.js.map +1 -1
- package/dist/cli/dag-commands.d.ts +9 -0
- package/dist/cli/dag-commands.d.ts.map +1 -1
- package/dist/cli/dag-commands.js +35 -25
- package/dist/cli/dag-commands.js.map +1 -1
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +12 -23
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/orchestrator-shared-blocks.d.ts +12 -10
- package/dist/cli/orchestrator-shared-blocks.d.ts.map +1 -1
- package/dist/cli/orchestrator-shared-blocks.js +46 -28
- package/dist/cli/orchestrator-shared-blocks.js.map +1 -1
- package/dist/utils/session-store.d.ts +24 -2
- package/dist/utils/session-store.d.ts.map +1 -1
- package/dist/utils/session-store.js +16 -7
- package/dist/utils/session-store.js.map +1 -1
- package/dist/utils/storage-utils.d.ts +1 -1
- package/dist/utils/storage-utils.d.ts.map +1 -1
- package/dist/utils/storage-utils.js +1 -1
- package/dist/utils/storage-utils.js.map +1 -1
- package/dist/web-client/assets/{GraphCanvas-BPDgvsyT.js → GraphCanvas-BYZE4sO9.js} +1 -1
- package/dist/web-client/assets/{MarkdownEditor-D7TLp78z.js → MarkdownEditor-BKx6M1cw.js} +1 -1
- package/dist/web-client/assets/{abnfDiagram-VRR7QNED-CyuP2N9t.js → abnfDiagram-VRR7QNED-D4kt0l2y.js} +1 -1
- package/dist/web-client/assets/architecture-TIHT7OUA-CIdGE6VO.js +1 -0
- package/dist/web-client/assets/{architectureDiagram-ZJ3FMSHR-DZ0ul9QX.js → architectureDiagram-ZJ3FMSHR-bu29SJFS.js} +1 -1
- package/dist/web-client/assets/{blockDiagram-677ZJIJ3-LLGzlc9l.js → blockDiagram-677ZJIJ3-hsu7mXKw.js} +1 -1
- package/dist/web-client/assets/{c4Diagram-LMCZKHZV-CViu3CTc.js → c4Diagram-LMCZKHZV-DMllRlT_.js} +1 -1
- package/dist/web-client/assets/channel-CBg-s-ZD.js +1 -0
- package/dist/web-client/assets/{chunk-32BRIVSS-Bw_IuJCM.js → chunk-32BRIVSS-BSzwj5eM.js} +1 -1
- package/dist/web-client/assets/{chunk-52WLFC77-C29h440W.js → chunk-52WLFC77-RDdZn6yY.js} +1 -1
- package/dist/web-client/assets/{chunk-C7G6YPKG-hhOrvw5w.js → chunk-C7G6YPKG-DQr--txT.js} +1 -1
- package/dist/web-client/assets/{chunk-EX3LRPZG-COMzol-M.js → chunk-EX3LRPZG-Bb8nc4z4.js} +1 -1
- package/dist/web-client/assets/{chunk-FWX5IMBZ-6vdX9EUn.js → chunk-FWX5IMBZ-QvBpOcOg.js} +2 -2
- package/dist/web-client/assets/{chunk-HOUHSVGY-DWDW6sxp.js → chunk-HOUHSVGY-B0mX_yjc.js} +1 -1
- package/dist/web-client/assets/{chunk-ICXQ74PX-BdMYglo2.js → chunk-ICXQ74PX-BmJSQqOH.js} +1 -1
- package/dist/web-client/assets/{chunk-MOJQB5TN-C0LAX_dC.js → chunk-MOJQB5TN-BrEI4GGn.js} +1 -1
- package/dist/web-client/assets/{chunk-OGEWGWER-CBx8MB7f.js → chunk-OGEWGWER-CrqDPOWP.js} +1 -1
- package/dist/web-client/assets/{chunk-PUDLZKDR-DKssR1nf.js → chunk-PUDLZKDR-DfPKldpG.js} +1 -1
- package/dist/web-client/assets/{chunk-Q4XR5HBZ-B3kcxFE-.js → chunk-Q4XR5HBZ-ekATI9aV.js} +1 -1
- package/dist/web-client/assets/{chunk-V7JOEXUC-CAlymndy.js → chunk-V7JOEXUC-C5APsP1t.js} +1 -1
- package/dist/web-client/assets/{chunk-VAUOI2AC-BowfsmTW.js → chunk-VAUOI2AC-BhfSWJZI.js} +1 -1
- package/dist/web-client/assets/{chunk-VR4S4FIN-BBOydgvt.js → chunk-VR4S4FIN-BGa-44J7.js} +1 -1
- package/dist/web-client/assets/{chunk-WYO6CB5R-DcymFbES.js → chunk-WYO6CB5R-By1K0guW.js} +1 -1
- package/dist/web-client/assets/{chunk-ZGVPDNZ5--uKFP-Lr.js → chunk-ZGVPDNZ5-Vnzpc76F.js} +1 -1
- package/dist/web-client/assets/classDiagram-OUVF2IWQ-ciwDjhUR.js +1 -0
- package/dist/web-client/assets/classDiagram-v2-EOCWNBFH-ciwDjhUR.js +1 -0
- package/dist/web-client/assets/{cynefin-VYW2F7L2-CjboUOMA.js → cynefin-VYW2F7L2-C6MOMOOz.js} +1 -1
- package/dist/web-client/assets/{cynefinDiagram-TSTJHNR4-BcxygBP7.js → cynefinDiagram-TSTJHNR4-Cseyu79b.js} +1 -1
- package/dist/web-client/assets/{dagre-VKFMJZFB-D-tiERQE.js → dagre-VKFMJZFB-CQJlIuNh.js} +1 -1
- package/dist/web-client/assets/{diagram-FQU43EPY-ChPXczaS.js → diagram-FQU43EPY-DpqDxhq4.js} +1 -1
- package/dist/web-client/assets/{diagram-G47NLZAW-CVL3Y91h.js → diagram-G47NLZAW-C11fYYaF.js} +1 -1
- package/dist/web-client/assets/{diagram-NH7WQ7WH-DsaNA9Lh.js → diagram-NH7WQ7WH-BiG-uRAF.js} +1 -1
- package/dist/web-client/assets/{diagram-OA4YK3LP-CXhrhdhU.js → diagram-OA4YK3LP-CIXWWjq-.js} +1 -1
- package/dist/web-client/assets/{diagram-WEI45ONY-BTVPnk4E.js → diagram-WEI45ONY-C3OgIWu9.js} +1 -1
- package/dist/web-client/assets/{ebnfDiagram-CCIWWBDH-BAyrRBtM.js → ebnfDiagram-CCIWWBDH-BHF_NA3_.js} +1 -1
- package/dist/web-client/assets/{erDiagram-Q63AITRT-Qm24Wepm.js → erDiagram-Q63AITRT-CUOJCrLy.js} +1 -1
- package/dist/web-client/assets/eventmodeling-45OFAUF4-DxfboL1J.js +1 -0
- package/dist/web-client/assets/flowDiagram-23GEKE2U-C3NzpTtI.js +1 -0
- package/dist/web-client/assets/{ganttDiagram-NO4QXBWP-D8h7l3XJ.js → ganttDiagram-NO4QXBWP-D_4BMJ-g.js} +1 -1
- package/dist/web-client/assets/{gitGraph-TEB2WS4Q-DIBml1SB.js → gitGraph-TEB2WS4Q-CBuaZBId.js} +1 -1
- package/dist/web-client/assets/{gitGraphDiagram-IHSO6WYX-CtkYoXjn.js → gitGraphDiagram-IHSO6WYX-BbztsGuO.js} +1 -1
- package/dist/web-client/assets/index-B1KVIr80.css +2 -0
- package/dist/web-client/assets/{index-DOSH4Q9H.js → index-BWd2fBNL.js} +38 -38
- package/dist/web-client/assets/{info-DKCQHKI2-DLEUtV5Q.js → info-DKCQHKI2-Bzi0Xjro.js} +1 -1
- package/dist/web-client/assets/{infoDiagram-FWYZ7A6U-BJQ7aQux.js → infoDiagram-FWYZ7A6U-BkeEKcr0.js} +1 -1
- package/dist/web-client/assets/{ishikawaDiagram-FXEZZL3T-BPM11FvG.js → ishikawaDiagram-FXEZZL3T-CVusWu0p.js} +1 -1
- package/dist/web-client/assets/{journeyDiagram-5HDEW3XC-C0aX2z3c.js → journeyDiagram-5HDEW3XC-BUxu71zw.js} +1 -1
- package/dist/web-client/assets/{kanban-definition-HUTT4EX6-C56F29Ib.js → kanban-definition-HUTT4EX6-BE8Hv4Kd.js} +1 -1
- package/dist/web-client/assets/{line-BLFHLF2N.js → line-CiAoINJS.js} +1 -1
- package/dist/web-client/assets/{mermaid-parser.core-BLC8FhgU.js → mermaid-parser.core-BW47khiS.js} +3 -3
- package/dist/web-client/assets/{mermaid.core-BBqkKuXt.js → mermaid.core-DP--Jl9R.js} +3 -3
- package/dist/web-client/assets/{mindmap-definition-LN4V7U3C-aVZbsoPc.js → mindmap-definition-LN4V7U3C-CvWJUqdq.js} +1 -1
- package/dist/web-client/assets/{packet-7NZHBO7P-D4aqSQfB.js → packet-7NZHBO7P-XtzX9SaQ.js} +1 -1
- package/dist/web-client/assets/{pegDiagram-2B236MQR-DjfyNI0U.js → pegDiagram-2B236MQR-XNo0K1ct.js} +1 -1
- package/dist/web-client/assets/{pie-RZYD4A2V-ChCwYsYj.js → pie-RZYD4A2V-B1eUd9yt.js} +1 -1
- package/dist/web-client/assets/{pieDiagram-ENE6RG2P-BeHLKkXC.js → pieDiagram-ENE6RG2P-CRSb5z-4.js} +1 -1
- package/dist/web-client/assets/{quadrantDiagram-ABIIQ3AL-stga3gvq.js → quadrantDiagram-ABIIQ3AL-DziMaQxE.js} +1 -1
- package/dist/web-client/assets/{radar-I7S5WNFK-DOGheiwT.js → radar-I7S5WNFK-BpRqZH2g.js} +1 -1
- package/dist/web-client/assets/{railroad-3IZDKUUU-_JnU7M6L.js → railroad-3IZDKUUU-FDIHW04k.js} +1 -1
- package/dist/web-client/assets/railroad-abnf-AHOZXSZD-BKj6JAhH.js +1 -0
- package/dist/web-client/assets/railroad-ebnf-EBAXGLYW-ChDM1OBv.js +1 -0
- package/dist/web-client/assets/railroad-peg-LSFZ7HO6-DvwA2e0i.js +1 -0
- package/dist/web-client/assets/{railroadDiagram-RFXS5EU6-C0CkMsOd.js → railroadDiagram-RFXS5EU6-Cs7EVBaz.js} +1 -1
- package/dist/web-client/assets/{requirementDiagram-TGXJPOKE-DuImwoRD.js → requirementDiagram-TGXJPOKE-B9_Lj1ga.js} +1 -1
- package/dist/web-client/assets/{sankeyDiagram-HTMAVEWB-kprq0XF9.js → sankeyDiagram-HTMAVEWB-DuTJTiy0.js} +1 -1
- package/dist/web-client/assets/{sequenceDiagram-DBY2YBRQ-DiXKJMF6.js → sequenceDiagram-DBY2YBRQ-vOCU5UoE.js} +1 -1
- package/dist/web-client/assets/{stateDiagram-2N3HPSRC-D5qbVStE.js → stateDiagram-2N3HPSRC-rxAnfzWn.js} +1 -1
- package/dist/web-client/assets/stateDiagram-v2-6OUMAXLB-B3EvQPEe.js +1 -0
- package/dist/web-client/assets/{swimlanes-5IMT3BWC-DCbw389c.js → swimlanes-5IMT3BWC-gdVZUnPe.js} +1 -1
- package/dist/web-client/assets/swimlanesDiagram-G3AALYLV-WcOXuCPg.js +8 -0
- package/dist/web-client/assets/{timeline-definition-FHXFAJF6-CQeaYN_9.js → timeline-definition-FHXFAJF6-Do68JyGy.js} +1 -1
- package/dist/web-client/assets/{treeView-QDETBFTQ-Cf7Sq3qo.js → treeView-QDETBFTQ-CdZkmg80.js} +1 -1
- package/dist/web-client/assets/{treemap-6X3UGDF4-BovzvoTU.js → treemap-6X3UGDF4-ub54fmpW.js} +1 -1
- package/dist/web-client/assets/{vennDiagram-L72KCM5P-CZsJy139.js → vennDiagram-L72KCM5P-D-r8NBEp.js} +1 -1
- package/dist/web-client/assets/{wardley-OPB4EBWU-DJ7MS6XZ.js → wardley-OPB4EBWU-CTleH1-J.js} +1 -1
- package/dist/web-client/assets/{wardleyDiagram-EHGQE667-rqhcmsbM.js → wardleyDiagram-EHGQE667-BU8Kw39F.js} +1 -1
- package/dist/web-client/assets/{xychartDiagram-FW5EYKEG-HuK4Seps.js → xychartDiagram-FW5EYKEG-CfNnag6i.js} +1 -1
- package/dist/web-client/index.html +2 -2
- package/dist/web-server/app.d.ts.map +1 -1
- package/dist/web-server/app.js +1 -7
- package/dist/web-server/app.js.map +1 -1
- package/dist/web-server/claude-runner.d.ts +11 -4
- package/dist/web-server/claude-runner.d.ts.map +1 -1
- package/dist/web-server/claude-runner.js +10 -14
- package/dist/web-server/claude-runner.js.map +1 -1
- package/dist/web-server/index.d.ts.map +1 -1
- package/dist/web-server/index.js +4 -1
- package/dist/web-server/index.js.map +1 -1
- package/dist/web-server/prompt-assembly.d.ts.map +1 -1
- package/dist/web-server/prompt-assembly.js +1 -2
- package/dist/web-server/prompt-assembly.js.map +1 -1
- package/dist/web-server/routes/sessions.d.ts +9 -6
- package/dist/web-server/routes/sessions.d.ts.map +1 -1
- package/dist/web-server/routes/sessions.js +315 -207
- package/dist/web-server/routes/sessions.js.map +1 -1
- package/dist/web-server/run-driver.d.ts +113 -0
- package/dist/web-server/run-driver.d.ts.map +1 -0
- package/dist/web-server/run-driver.js +214 -0
- package/dist/web-server/run-driver.js.map +1 -0
- package/dist/web-server/run-event-log.d.ts +23 -1
- package/dist/web-server/run-event-log.d.ts.map +1 -1
- package/dist/web-server/run-event-log.js +29 -5
- package/dist/web-server/run-event-log.js.map +1 -1
- package/dist/web-server/web-auth.d.ts +3 -5
- package/dist/web-server/web-auth.d.ts.map +1 -1
- package/dist/web-server/web-auth.js +6 -11
- package/dist/web-server/web-auth.js.map +1 -1
- package/dist/web-server/web-token.d.ts +1 -2
- package/dist/web-server/web-token.d.ts.map +1 -1
- package/dist/web-server/web-token.js +1 -2
- package/dist/web-server/web-token.js.map +1 -1
- package/opencode/arcs/bundle-runtime.json +3 -3
- package/opencode/arcs/prompts/arcs-docs.txt +4 -4
- package/opencode/arcs/prompts/arcs-flash.txt +41 -33
- package/opencode/arcs/prompts/arcs-orchestrate-caveman.txt +43 -27
- package/opencode/arcs/prompts/arcs-orchestrate.txt +43 -27
- package/opencode/arcs/prompts/code-reviewer.txt +4 -4
- package/opencode/arcs/prompts/graph-explorer.txt +4 -4
- package/opencode/arcs/prompts/software-engineer.txt +2 -2
- package/opencode/arcs/prompts/tech-architect.txt +4 -4
- package/opencode/arcs/skills/brainstorming/SKILL.md +4 -4
- package/opencode/arcs/skills/enriching-codegraph-proposals/SKILL.md +1 -1
- package/opencode/arcs/skills/implementation/SKILL.md +6 -6
- package/opencode/arcs/skills/init-project/SKILL.md +4 -4
- package/opencode/arcs/skills/systematic-debugging/SKILL.md +2 -2
- package/opencode/arcs/skills/test-driven-development/SKILL.md +3 -3
- package/opencode/arcs/skills/to-diagram/SKILL.md +2 -2
- package/opencode/arcs/skills/writing-knowledge/SKILL.md +2 -2
- package/opencode/arcs/skills/writing-plans/SKILL.md +2 -2
- package/opencode/arcs/skills/writing-proposals/SKILL.md +90 -0
- package/package.json +1 -1
- package/dist/cli/commands/hooks.d.ts +0 -76
- package/dist/cli/commands/hooks.d.ts.map +0 -1
- package/dist/cli/commands/hooks.js +0 -436
- package/dist/cli/commands/hooks.js.map +0 -1
- package/dist/utils/claude-code-hook-install.d.ts +0 -80
- package/dist/utils/claude-code-hook-install.d.ts.map +0 -1
- package/dist/utils/claude-code-hook-install.js +0 -212
- package/dist/utils/claude-code-hook-install.js.map +0 -1
- package/dist/utils/hook-contract.d.ts +0 -36
- package/dist/utils/hook-contract.d.ts.map +0 -1
- package/dist/utils/hook-contract.js +0 -35
- package/dist/utils/hook-contract.js.map +0 -1
- package/dist/utils/hook-token-store.d.ts +0 -63
- package/dist/utils/hook-token-store.d.ts.map +0 -1
- package/dist/utils/hook-token-store.js +0 -88
- package/dist/utils/hook-token-store.js.map +0 -1
- package/dist/web-client/assets/architecture-TIHT7OUA-Bdo2Yvm9.js +0 -1
- package/dist/web-client/assets/channel-DBNmizpo.js +0 -1
- package/dist/web-client/assets/classDiagram-OUVF2IWQ-CB3HiA1_.js +0 -1
- package/dist/web-client/assets/classDiagram-v2-EOCWNBFH-CB3HiA1_.js +0 -1
- package/dist/web-client/assets/eventmodeling-45OFAUF4-DoTBIvl5.js +0 -1
- package/dist/web-client/assets/flowDiagram-23GEKE2U-BEH23L1A.js +0 -1
- package/dist/web-client/assets/index-wSzUPvml.css +0 -2
- package/dist/web-client/assets/railroad-abnf-AHOZXSZD-nhNub7LE.js +0 -1
- package/dist/web-client/assets/railroad-ebnf-EBAXGLYW-BlQYe7Yf.js +0 -1
- package/dist/web-client/assets/railroad-peg-LSFZ7HO6-B3E8pRVN.js +0 -1
- package/dist/web-client/assets/stateDiagram-v2-6OUMAXLB-DWwTAG1r.js +0 -1
- package/dist/web-client/assets/swimlanesDiagram-G3AALYLV-DabrCsjZ.js +0 -8
- package/dist/web-server/hook-auth.d.ts +0 -12
- package/dist/web-server/hook-auth.d.ts.map +0 -1
- package/dist/web-server/hook-auth.js +0 -36
- package/dist/web-server/hook-auth.js.map +0 -1
- package/dist/web-server/routes/hook-events.d.ts +0 -43
- package/dist/web-server/routes/hook-events.d.ts.map +0 -1
- package/dist/web-server/routes/hook-events.js +0 -316
- package/dist/web-server/routes/hook-events.js.map +0 -1
- package/opencode/arcs/skills/install-claude-code-hook/SKILL.md +0 -23
- package/scripts/claude-code-session-hook.mjs +0 -146
|
@@ -1,212 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Consent-gated writer for the Claude Code session-bridge hook.
|
|
3
|
-
*
|
|
4
|
-
* `arcs hooks install-claude-code` deliberately never edits agent configuration
|
|
5
|
-
* — it prints a snippet. This module is the opt-in counterpart: when the user
|
|
6
|
-
* explicitly confirms during `arcs project init`, it merges the same hook entry
|
|
7
|
-
* into the workspace's `.claude/settings.local.json` (local-only: the token is a
|
|
8
|
-
* secret and `settings.local.json` is the git-ignored variant).
|
|
9
|
-
*
|
|
10
|
-
* Two rules the merge must never break:
|
|
11
|
-
* 1. A malformed existing file ABORTS the write. Silently coalescing an
|
|
12
|
-
* unparseable settings file to `{}` would destroy a user's `permissions`
|
|
13
|
-
* block over a stray comma, so parse errors are surfaced, not swallowed.
|
|
14
|
-
* 2. Replacement is keyed on the absolute hook script path, not the project
|
|
15
|
-
* slug. A workspace can be reassigned between ARCS projects, so matching on
|
|
16
|
-
* the script path leaves exactly one current ARCS entry per event instead
|
|
17
|
-
* of accumulating stale ones. Entries belonging to other tools are kept
|
|
18
|
-
* untouched, in place.
|
|
19
|
-
*/
|
|
20
|
-
import { chmod, mkdir, readFile, writeFile } from "node:fs/promises";
|
|
21
|
-
import { dirname, join } from "node:path";
|
|
22
|
-
import * as p from "@clack/prompts";
|
|
23
|
-
import color from "picocolors";
|
|
24
|
-
import { HOOK_EVENTS, provisionHookCommand } from "../cli/commands/hooks.js";
|
|
25
|
-
/** The only file this module ever writes — never `~/.claude/settings.json`. */
|
|
26
|
-
export function claudeSettingsLocalPath(workspacePath) {
|
|
27
|
-
return join(workspacePath, ".claude", "settings.local.json");
|
|
28
|
-
}
|
|
29
|
-
/**
|
|
30
|
-
* `chmod` that tolerates an absent file and nothing else.
|
|
31
|
-
*
|
|
32
|
-
* Used to narrow a settings file BEFORE it is rewritten, where "there is no
|
|
33
|
-
* file yet" is the ordinary fresh-install outcome and not a failure — the
|
|
34
|
-
* write's own `mode` covers that path. Every other errno (EPERM on a file this
|
|
35
|
-
* user does not own, EROFS) means the mode of a token-bearing file is not ours
|
|
36
|
-
* to set, so it propagates and fails the install closed, exactly as the
|
|
37
|
-
* trailing chmod does.
|
|
38
|
-
*/
|
|
39
|
-
async function chmodIfPresent(path, mode) {
|
|
40
|
-
try {
|
|
41
|
-
await chmod(path, mode);
|
|
42
|
-
}
|
|
43
|
-
catch (err) {
|
|
44
|
-
if (err?.code !== "ENOENT")
|
|
45
|
-
throw err;
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
/**
|
|
49
|
-
* Returns a copy of `settings` with the ARCS hook entry registered under every
|
|
50
|
-
* hook event, replacing any prior entry that runs the same `hookScriptPath`.
|
|
51
|
-
* Pure — no I/O, so the merge rules are directly testable.
|
|
52
|
-
*/
|
|
53
|
-
export function mergeHookIntoSettings(settings, hook) {
|
|
54
|
-
const hooks = { ...(settings.hooks ?? {}) };
|
|
55
|
-
for (const event of HOOK_EVENTS) {
|
|
56
|
-
const existing = Array.isArray(hooks[event]) ? hooks[event] : [];
|
|
57
|
-
const preserved = [];
|
|
58
|
-
for (const entry of existing) {
|
|
59
|
-
if (!entry || typeof entry !== "object" || !Array.isArray(entry.hooks)) {
|
|
60
|
-
// Not a shape we understand — leave it exactly as found.
|
|
61
|
-
preserved.push(entry);
|
|
62
|
-
continue;
|
|
63
|
-
}
|
|
64
|
-
// Strip only OUR command, at the inner level: a matcher entry may mix an
|
|
65
|
-
// ARCS hook with another tool's, and that other tool must survive.
|
|
66
|
-
const kept = entry.hooks.filter((h) => !(typeof h?.command === "string" && h.command.includes(hook.hookScriptPath)));
|
|
67
|
-
if (kept.length === 0)
|
|
68
|
-
continue;
|
|
69
|
-
preserved.push({ ...entry, hooks: kept });
|
|
70
|
-
}
|
|
71
|
-
preserved.push({ hooks: [{ type: "command", command: hook.command }] });
|
|
72
|
-
hooks[event] = preserved;
|
|
73
|
-
}
|
|
74
|
-
return { ...settings, hooks };
|
|
75
|
-
}
|
|
76
|
-
/**
|
|
77
|
-
* Reads the workspace's `.claude/settings.local.json` (if any), merges in a
|
|
78
|
-
* freshly provisioned hook, and writes it back owner-only.
|
|
79
|
-
*
|
|
80
|
-
* Throws when the existing file is present but unparseable — nothing is written
|
|
81
|
-
* in that case, so a hand-edited settings file is never clobbered.
|
|
82
|
-
*/
|
|
83
|
-
export async function installClaudeCodeHook(options) {
|
|
84
|
-
const settingsPath = claudeSettingsLocalPath(options.workspacePath);
|
|
85
|
-
let raw;
|
|
86
|
-
try {
|
|
87
|
-
raw = await readFile(settingsPath, "utf-8");
|
|
88
|
-
}
|
|
89
|
-
catch {
|
|
90
|
-
// Absent file — start from an empty settings object.
|
|
91
|
-
}
|
|
92
|
-
let settings = {};
|
|
93
|
-
if (raw !== undefined && raw.trim().length > 0) {
|
|
94
|
-
let parsed;
|
|
95
|
-
try {
|
|
96
|
-
parsed = JSON.parse(raw);
|
|
97
|
-
}
|
|
98
|
-
catch {
|
|
99
|
-
throw new Error(`${settingsPath} exists but is not valid JSON — fix it manually or delete it, ` +
|
|
100
|
-
`then re-run \`arcs hooks install-claude-code ${options.slug}\`. Nothing was written.`);
|
|
101
|
-
}
|
|
102
|
-
if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
|
|
103
|
-
throw new Error(`${settingsPath} is valid JSON but not an object — fix it manually or delete it, ` +
|
|
104
|
-
`then re-run \`arcs hooks install-claude-code ${options.slug}\`. Nothing was written.`);
|
|
105
|
-
}
|
|
106
|
-
settings = parsed;
|
|
107
|
-
}
|
|
108
|
-
const provisioned = await provisionHookCommand({
|
|
109
|
-
projectDir: options.projectDir,
|
|
110
|
-
slug: options.slug,
|
|
111
|
-
serverUrl: options.serverUrl,
|
|
112
|
-
});
|
|
113
|
-
const merged = mergeHookIntoSettings(settings, provisioned);
|
|
114
|
-
await mkdir(dirname(settingsPath), { recursive: true });
|
|
115
|
-
// The merged command embeds `ARCS_HOOK_TOKEN=<value>`, so this file is a
|
|
116
|
-
// SECOND cleartext copy of the hook token — this one in the user's repo
|
|
117
|
-
// rather than under ARCS's own data dir. It is narrowed in three steps
|
|
118
|
-
// because no one of them covers both the fresh and the repair path:
|
|
119
|
-
//
|
|
120
|
-
// 1. chmod BEFORE the write, best-effort. `writeFile` is a direct,
|
|
121
|
-
// non-atomic open(path, "w", mode): when the file already exists the
|
|
122
|
-
// `mode` argument is a no-op and the open merely truncates the inode
|
|
123
|
-
// that is there, so without this step the freshly minted token would be
|
|
124
|
-
// written into a still-0644 inode and sit world-readable for the write
|
|
125
|
-
// plus an await hop. ENOENT is ignored (see chmodIfPresent) because on a
|
|
126
|
-
// fresh install there is nothing to narrow yet. This runs AFTER the
|
|
127
|
-
// strict parse above, so a file that aborts the install keeps its mode
|
|
128
|
-
// as well as its bytes.
|
|
129
|
-
// 2. `mode` on the write itself. It applies only when the open CREATES the
|
|
130
|
-
// inode — which is precisely the fresh path, where it means the inode is
|
|
131
|
-
// 0600 before the token's first byte reaches it and step 1 had nothing
|
|
132
|
-
// to do. (That create-only caveat is exactly the one that does NOT apply
|
|
133
|
-
// to the token store's temp+rename writer, where every write installs a
|
|
134
|
-
// fresh inode — it bites squarely here.)
|
|
135
|
-
// 3. chmod after the write, unconditional. Steps 1 and 2 are each a claim
|
|
136
|
-
// about how THIS writer behaves — one assumes the inode survives the
|
|
137
|
-
// write, the other that the write creates it. Step 3 assumes nothing, so
|
|
138
|
-
// "0600 when this function returns" is a postcondition rather than an
|
|
139
|
-
// inference from the writer's syscalls.
|
|
140
|
-
//
|
|
141
|
-
// What this buys, stated honestly: 0o600 is a cross-user control. It does
|
|
142
|
-
// nothing against a process running as THIS user, and it does not hide the
|
|
143
|
-
// token from `ps` — the value is inlined in the hook command string, so every
|
|
144
|
-
// hook fire still exposes it in the process table. Handing the hook a path
|
|
145
|
-
// (`ARCS_HOOK_TOKEN_FILE=<path>`) instead of the value would close that; the
|
|
146
|
-
// mode only closes the on-disk half. Nor can any mode revoke a descriptor
|
|
147
|
-
// another account already opened on a 0644 file: the write edits that same
|
|
148
|
-
// inode in place, so such a reader follows the file into the new token. All
|
|
149
|
-
// three steps are a floor from this point forward, not a retraction of what
|
|
150
|
-
// was reachable before.
|
|
151
|
-
//
|
|
152
|
-
// The `.claude` DIRECTORY is deliberately left exactly as found. Unlike the
|
|
153
|
-
// hooks dir under ARCS's data dir, which holds nothing but the token, this
|
|
154
|
-
// one holds the user's other Claude Code files, and narrowing it would be a
|
|
155
|
-
// hostile surprise in a directory ARCS does not own.
|
|
156
|
-
await chmodIfPresent(settingsPath, 0o600);
|
|
157
|
-
await writeFile(settingsPath, `${JSON.stringify(merged, null, 2)}\n`, {
|
|
158
|
-
encoding: "utf-8",
|
|
159
|
-
mode: 0o600,
|
|
160
|
-
});
|
|
161
|
-
await chmod(settingsPath, 0o600);
|
|
162
|
-
return {
|
|
163
|
-
settingsPath,
|
|
164
|
-
token: provisioned.token,
|
|
165
|
-
hookScriptPath: provisioned.hookScriptPath,
|
|
166
|
-
serverUrl: provisioned.serverUrl,
|
|
167
|
-
events: [...HOOK_EVENTS],
|
|
168
|
-
};
|
|
169
|
-
}
|
|
170
|
-
/**
|
|
171
|
-
* Interactively offers the hook install during `arcs project init`.
|
|
172
|
-
*
|
|
173
|
-
* Mirrors `promptAndInstallCodegraph`: a note explaining the offer, a confirm
|
|
174
|
-
* defaulting to "no", and a manual-fallback hint when declined. Returns the
|
|
175
|
-
* install result only when a write actually happened; returns `null` on
|
|
176
|
-
* decline, cancel, or failure. Never throws — `arcs project init` succeeding
|
|
177
|
-
* matters more than this offer succeeding.
|
|
178
|
-
*/
|
|
179
|
-
export async function promptAndInstallClaudeCodeHook(options) {
|
|
180
|
-
const settingsPath = claudeSettingsLocalPath(options.workspacePath);
|
|
181
|
-
p.note([
|
|
182
|
-
"The session-bridge hook lets ARCS discover your Claude Code sessions,",
|
|
183
|
-
"stage project context at session start, and mirror transcripts — the",
|
|
184
|
-
"web UI drives work by forking a session into a new ARCS thread.",
|
|
185
|
-
"",
|
|
186
|
-
`Writes ${color.cyan(settingsPath)} only — never your global config.`,
|
|
187
|
-
].join("\n"), "Optional: Claude Code session bridge");
|
|
188
|
-
const shouldInstall = await p.confirm({
|
|
189
|
-
message: "Install the Claude Code session-bridge hook now?",
|
|
190
|
-
initialValue: false,
|
|
191
|
-
});
|
|
192
|
-
if (p.isCancel(shouldInstall) || !shouldInstall) {
|
|
193
|
-
p.log.info(color.dim(`Install later: arcs hooks install-claude-code ${options.slug}`));
|
|
194
|
-
return null;
|
|
195
|
-
}
|
|
196
|
-
try {
|
|
197
|
-
const result = await installClaudeCodeHook(options);
|
|
198
|
-
p.log.success([
|
|
199
|
-
`${color.green("✔")} Hook installed → ${color.cyan(result.settingsPath)}`,
|
|
200
|
-
color.dim("Start a NEW Claude Code session to pick it up — running sessions won't."),
|
|
201
|
-
].join("\n"));
|
|
202
|
-
return result;
|
|
203
|
-
}
|
|
204
|
-
catch (err) {
|
|
205
|
-
p.log.warn([
|
|
206
|
-
`${color.yellow("⚠")} Could not install the hook: ${err instanceof Error ? err.message : String(err)}`,
|
|
207
|
-
color.dim(`Install manually later: arcs hooks install-claude-code ${options.slug}`),
|
|
208
|
-
].join("\n"));
|
|
209
|
-
return null;
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
//# sourceMappingURL=claude-code-hook-install.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"claude-code-hook-install.js","sourceRoot":"","sources":["../../src/utils/claude-code-hook-install.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACrE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AACpC,OAAO,KAAK,MAAM,YAAY,CAAC;AAC/B,OAAO,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AA0B7E,+EAA+E;AAC/E,MAAM,UAAU,uBAAuB,CAAC,aAAqB;IAC3D,OAAO,IAAI,CAAC,aAAa,EAAE,SAAS,EAAE,qBAAqB,CAAC,CAAC;AAC/D,CAAC;AAED;;;;;;;;;GASG;AACH,KAAK,UAAU,cAAc,CAAC,IAAY,EAAE,IAAY;IACtD,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC1B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAK,GAA6B,EAAE,IAAI,KAAK,QAAQ;YAAE,MAAM,GAAG,CAAC;IACnE,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CACnC,QAAwB,EACxB,IAAiD;IAEjD,MAAM,KAAK,GAAuC,EAAE,GAAG,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,CAAC;IAEhF,KAAK,MAAM,KAAK,IAAI,WAAW,EAAE,CAAC;QAChC,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAEjE,MAAM,SAAS,GAAuB,EAAE,CAAC;QACzC,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;YAC7B,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;gBACvE,yDAAyD;gBACzD,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACtB,SAAS;YACX,CAAC;YACD,yEAAyE;YACzE,mEAAmE;YACnE,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAC7B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,OAAO,KAAK,QAAQ,IAAI,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CACpF,CAAC;YACF,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;gBAAE,SAAS;YAChC,SAAS,CAAC,IAAI,CAAC,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5C,CAAC;QAED,SAAS,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;QACxE,KAAK,CAAC,KAAK,CAAC,GAAG,SAAS,CAAC;IAC3B,CAAC;IAED,OAAO,EAAE,GAAG,QAAQ,EAAE,KAAK,EAAE,CAAC;AAChC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,OAK3C;IACC,MAAM,YAAY,GAAG,uBAAuB,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IAEpE,IAAI,GAAuB,CAAC;IAC5B,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IAC9C,CAAC;IAAC,MAAM,CAAC;QACP,qDAAqD;IACvD,CAAC;IAED,IAAI,QAAQ,GAAmB,EAAE,CAAC;IAClC,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/C,IAAI,MAAe,CAAC;QACpB,IAAI,CAAC;YACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC3B,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,KAAK,CACb,GAAG,YAAY,gEAAgE;gBAC7E,gDAAgD,OAAO,CAAC,IAAI,0BAA0B,CACzF,CAAC;QACJ,CAAC;QACD,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3E,MAAM,IAAI,KAAK,CACb,GAAG,YAAY,mEAAmE;gBAChF,gDAAgD,OAAO,CAAC,IAAI,0BAA0B,CACzF,CAAC;QACJ,CAAC;QACD,QAAQ,GAAG,MAAwB,CAAC;IACtC,CAAC;IAED,MAAM,WAAW,GAAG,MAAM,oBAAoB,CAAC;QAC7C,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,SAAS,EAAE,OAAO,CAAC,SAAS;KAC7B,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,qBAAqB,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IAE5D,MAAM,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACxD,yEAAyE;IACzE,wEAAwE;IACxE,uEAAuE;IACvE,oEAAoE;IACpE,EAAE;IACF,qEAAqE;IACrE,0EAA0E;IAC1E,0EAA0E;IAC1E,6EAA6E;IAC7E,4EAA4E;IAC5E,8EAA8E;IAC9E,yEAAyE;IACzE,4EAA4E;IAC5E,6BAA6B;IAC7B,6EAA6E;IAC7E,8EAA8E;IAC9E,4EAA4E;IAC5E,8EAA8E;IAC9E,6EAA6E;IAC7E,8CAA8C;IAC9C,4EAA4E;IAC5E,0EAA0E;IAC1E,8EAA8E;IAC9E,2EAA2E;IAC3E,6CAA6C;IAC7C,EAAE;IACF,0EAA0E;IAC1E,2EAA2E;IAC3E,8EAA8E;IAC9E,2EAA2E;IAC3E,6EAA6E;IAC7E,0EAA0E;IAC1E,2EAA2E;IAC3E,4EAA4E;IAC5E,4EAA4E;IAC5E,wBAAwB;IACxB,EAAE;IACF,4EAA4E;IAC5E,2EAA2E;IAC3E,4EAA4E;IAC5E,qDAAqD;IACrD,MAAM,cAAc,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;IAC1C,MAAM,SAAS,CAAC,YAAY,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;QACpE,QAAQ,EAAE,OAAO;QACjB,IAAI,EAAE,KAAK;KACZ,CAAC,CAAC;IACH,MAAM,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;IAEjC,OAAO;QACL,YAAY;QACZ,KAAK,EAAE,WAAW,CAAC,KAAK;QACxB,cAAc,EAAE,WAAW,CAAC,cAAc;QAC1C,SAAS,EAAE,WAAW,CAAC,SAAS;QAChC,MAAM,EAAE,CAAC,GAAG,WAAW,CAAC;KACzB,CAAC;AACJ,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,8BAA8B,CAAC,OAKpD;IACC,MAAM,YAAY,GAAG,uBAAuB,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IAEpE,CAAC,CAAC,IAAI,CACJ;QACE,uEAAuE;QACvE,sEAAsE;QACtE,iEAAiE;QACjE,EAAE;QACF,UAAU,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,mCAAmC;KACtE,CAAC,IAAI,CAAC,IAAI,CAAC,EACZ,sCAAsC,CACvC,CAAC;IAEF,MAAM,aAAa,GAAG,MAAM,CAAC,CAAC,OAAO,CAAC;QACpC,OAAO,EAAE,kDAAkD;QAC3D,YAAY,EAAE,KAAK;KACpB,CAAC,CAAC;IAEH,IAAI,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;QAChD,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,kDAAkD,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACxF,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,qBAAqB,CAAC,OAAO,CAAC,CAAC;QACpD,CAAC,CAAC,GAAG,CAAC,OAAO,CACX;YACE,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,qBAAqB,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE;YACzE,KAAK,CAAC,GAAG,CAAC,yEAAyE,CAAC;SACrF,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;QACF,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,CAAC,CAAC,GAAG,CAAC,IAAI,CACR;YACE,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,gCAAgC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;YACtG,KAAK,CAAC,GAAG,CAAC,2DAA2D,OAAO,CAAC,IAAI,EAAE,CAAC;SACrF,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The wire contract shared by everything on the Claude Code session bridge:
|
|
3
|
-
* the event names the hook is registered under, and the address it posts to.
|
|
4
|
-
*
|
|
5
|
-
* These values are duplicated across process boundaries by necessity — the
|
|
6
|
-
* server validates them, the installer writes them into settings.json, and
|
|
7
|
-
* `scripts/claude-code-session-hook.mjs` runs standalone under Claude Code with
|
|
8
|
-
* no ARCS import available. Every duplicate that CAN import derives from here;
|
|
9
|
-
* the one that cannot (the `.mjs`, which must stay dependency-free so a broken
|
|
10
|
-
* bridge is inert rather than fatal) keeps its own literals and is pinned to
|
|
11
|
-
* this module by `test/hook-contract-parity.test.ts`, which fails on any
|
|
12
|
-
* divergence in either direction.
|
|
13
|
-
*/
|
|
14
|
-
/**
|
|
15
|
-
* The four Claude Code events the bridge registers for. One script is installed
|
|
16
|
-
* under all of them; it dispatches internally on `hook_event_name`.
|
|
17
|
-
*
|
|
18
|
-
* A readonly tuple so `z.enum()` consumes it directly — the route's validation
|
|
19
|
-
* and the installer's registration can never drift apart. Adding a fifth event
|
|
20
|
-
* here without adding it to the hook script breaks the parity test.
|
|
21
|
-
*/
|
|
22
|
-
export declare const HOOK_EVENTS: readonly ["SessionStart", "UserPromptSubmit", "SessionEnd", "Stop"];
|
|
23
|
-
export type HookEventName = (typeof HOOK_EVENTS)[number];
|
|
24
|
-
/** Loopback only: `arcs web` refuses to bind anything else. */
|
|
25
|
-
export declare const DEFAULT_WEB_HOST = "127.0.0.1";
|
|
26
|
-
/** Default `arcs web` port, and therefore the port every hook is installed with. */
|
|
27
|
-
export declare const DEFAULT_WEB_PORT = 4173;
|
|
28
|
-
/**
|
|
29
|
-
* Where an installed hook posts when `--url` was not given.
|
|
30
|
-
*
|
|
31
|
-
* Baked into the settings.json command string at install time, so changing it
|
|
32
|
-
* only affects hooks installed afterwards — an already-installed hook keeps
|
|
33
|
-
* posting to the URL it was written with.
|
|
34
|
-
*/
|
|
35
|
-
export declare const DEFAULT_SERVER_URL = "http://127.0.0.1:4173";
|
|
36
|
-
//# sourceMappingURL=hook-contract.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"hook-contract.d.ts","sourceRoot":"","sources":["../../src/utils/hook-contract.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH;;;;;;;GAOG;AACH,eAAO,MAAM,WAAW,qEAAsE,CAAC;AAE/F,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC;AAEzD,+DAA+D;AAC/D,eAAO,MAAM,gBAAgB,cAAc,CAAC;AAE5C,oFAAoF;AACpF,eAAO,MAAM,gBAAgB,OAAO,CAAC;AAErC;;;;;;GAMG;AACH,eAAO,MAAM,kBAAkB,0BAAmD,CAAC"}
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The wire contract shared by everything on the Claude Code session bridge:
|
|
3
|
-
* the event names the hook is registered under, and the address it posts to.
|
|
4
|
-
*
|
|
5
|
-
* These values are duplicated across process boundaries by necessity — the
|
|
6
|
-
* server validates them, the installer writes them into settings.json, and
|
|
7
|
-
* `scripts/claude-code-session-hook.mjs` runs standalone under Claude Code with
|
|
8
|
-
* no ARCS import available. Every duplicate that CAN import derives from here;
|
|
9
|
-
* the one that cannot (the `.mjs`, which must stay dependency-free so a broken
|
|
10
|
-
* bridge is inert rather than fatal) keeps its own literals and is pinned to
|
|
11
|
-
* this module by `test/hook-contract-parity.test.ts`, which fails on any
|
|
12
|
-
* divergence in either direction.
|
|
13
|
-
*/
|
|
14
|
-
/**
|
|
15
|
-
* The four Claude Code events the bridge registers for. One script is installed
|
|
16
|
-
* under all of them; it dispatches internally on `hook_event_name`.
|
|
17
|
-
*
|
|
18
|
-
* A readonly tuple so `z.enum()` consumes it directly — the route's validation
|
|
19
|
-
* and the installer's registration can never drift apart. Adding a fifth event
|
|
20
|
-
* here without adding it to the hook script breaks the parity test.
|
|
21
|
-
*/
|
|
22
|
-
export const HOOK_EVENTS = ["SessionStart", "UserPromptSubmit", "SessionEnd", "Stop"];
|
|
23
|
-
/** Loopback only: `arcs web` refuses to bind anything else. */
|
|
24
|
-
export const DEFAULT_WEB_HOST = "127.0.0.1";
|
|
25
|
-
/** Default `arcs web` port, and therefore the port every hook is installed with. */
|
|
26
|
-
export const DEFAULT_WEB_PORT = 4173;
|
|
27
|
-
/**
|
|
28
|
-
* Where an installed hook posts when `--url` was not given.
|
|
29
|
-
*
|
|
30
|
-
* Baked into the settings.json command string at install time, so changing it
|
|
31
|
-
* only affects hooks installed afterwards — an already-installed hook keeps
|
|
32
|
-
* posting to the URL it was written with.
|
|
33
|
-
*/
|
|
34
|
-
export const DEFAULT_SERVER_URL = `http://${DEFAULT_WEB_HOST}:${DEFAULT_WEB_PORT}`;
|
|
35
|
-
//# sourceMappingURL=hook-contract.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"hook-contract.js","sourceRoot":"","sources":["../../src/utils/hook-contract.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,cAAc,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,CAAU,CAAC;AAI/F,+DAA+D;AAC/D,MAAM,CAAC,MAAM,gBAAgB,GAAG,WAAW,CAAC;AAE5C,oFAAoF;AACpF,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,CAAC;AAErC;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,UAAU,gBAAgB,IAAI,gBAAgB,EAAE,CAAC"}
|
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Per-project auth token for the Claude Code session-bridge hook endpoint.
|
|
3
|
-
*
|
|
4
|
-
* Loopback-only is not enough on its own: every process on the machine shares
|
|
5
|
-
* localhost, so any local program could otherwise register sessions, write
|
|
6
|
-
* checkpoints, and hit the SessionStart path — whose answer is injected into a
|
|
7
|
-
* live agent session as `additionalContext`. The token proves the caller is
|
|
8
|
-
* the hook script that `arcs hooks install-claude-code` provisioned for this
|
|
9
|
-
* project.
|
|
10
|
-
*
|
|
11
|
-
* Intentionally not a CRUD store — one token per project, rotated by rerunning
|
|
12
|
-
* the install command. No index, no markdown mirror, no lock (a rotation races
|
|
13
|
-
* only with itself, and the loser simply has to rerun install).
|
|
14
|
-
*/
|
|
15
|
-
export declare function hookTokenPath(projectDir: string): string;
|
|
16
|
-
export declare function readHookToken(projectDir: string): Promise<string | undefined>;
|
|
17
|
-
/**
|
|
18
|
-
* Rotates the on-disk token, owner-only.
|
|
19
|
-
*
|
|
20
|
-
* Unlike the web token there is no in-memory copy to verify against — the hook
|
|
21
|
-
* subprocess re-reads this file at every checkpoint, so the FILE is the
|
|
22
|
-
* credential and its mode is the whole control. `writeJson` stages a temp file
|
|
23
|
-
* and renames it into place with no mode argument, so the token lands 0644
|
|
24
|
-
* (world-readable) on a default umask — and it lands that way on EVERY write,
|
|
25
|
-
* not just the first: the rename swaps in the freshly created temp inode, whose
|
|
26
|
-
* mode came from the umask, and the previous file's mode is discarded with the
|
|
27
|
-
* inode it belonged to. (A mode passed at open() would in fact have covered this
|
|
28
|
-
* writer, precisely because every write creates the destination inode; the
|
|
29
|
-
* "applies only at create" caveat bites a direct non-atomic open(path,"w",mode)
|
|
30
|
-
* over an existing file, which is not this path.) The chmod is nonetheless
|
|
31
|
-
* unconditional rather than conditional on the mode read back, so the 0600
|
|
32
|
-
* guarantee survives a future switch away from the atomic writer.
|
|
33
|
-
*
|
|
34
|
-
* The directory is narrowed too: the staged temp file is a fresh inode born
|
|
35
|
-
* under the umask, so it is briefly world-readable between write and rename.
|
|
36
|
-
* 0o700 on the enclosing directory — which holds nothing but this token —
|
|
37
|
-
* denies another account the traversal needed to reach that window at all.
|
|
38
|
-
*
|
|
39
|
-
* What this buys, stated honestly: 0o600 is a cross-user control. It keeps
|
|
40
|
-
* other UNIX accounts out; it is NOT a defense against a process running as
|
|
41
|
-
* THIS user, which can read the file at any mode. Nor is this the token's only
|
|
42
|
-
* copy — `arcs hooks install-claude-code --write` embeds the same value in the
|
|
43
|
-
* workspace's .claude/settings.local.json, which is now created 0o600 and
|
|
44
|
-
* chmodded 0o600 unconditionally too (claude-code-hook-install.ts), though that
|
|
45
|
-
* copy is inlined into the hook command string and so still leaks to `ps` on
|
|
46
|
-
* every hook fire. So this is a floor on ARCS's own copy, not a guarantee about
|
|
47
|
-
* the secret.
|
|
48
|
-
*
|
|
49
|
-
* A chmod failure propagates and fails the install command. That is
|
|
50
|
-
* deliberate — the caller (`arcs hooks install-claude-code`) has not printed
|
|
51
|
-
* the snippet yet, so the run fails closed and the user reruns to rotate,
|
|
52
|
-
* rather than silently installing a token this process could not protect. The
|
|
53
|
-
* hook's own read path (readHookToken/verifyHookToken) is untouched by this and
|
|
54
|
-
* still never throws.
|
|
55
|
-
*/
|
|
56
|
-
export declare function writeHookToken(projectDir: string, token: string): Promise<void>;
|
|
57
|
-
/**
|
|
58
|
-
* Constant-time token comparison. Returns false when the project has no token
|
|
59
|
-
* provisioned yet, so an uninstalled project cannot be driven by an empty
|
|
60
|
-
* `Authorization` header.
|
|
61
|
-
*/
|
|
62
|
-
export declare function verifyHookToken(projectDir: string, candidate: string): Promise<boolean>;
|
|
63
|
-
//# sourceMappingURL=hook-token-store.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"hook-token-store.d.ts","sourceRoot":"","sources":["../../src/utils/hook-token-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAaH,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAExD;AAED,wBAAsB,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAGnF;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,wBAAsB,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAMrF;AAED;;;;GAIG;AACH,wBAAsB,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAQ7F"}
|
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Per-project auth token for the Claude Code session-bridge hook endpoint.
|
|
3
|
-
*
|
|
4
|
-
* Loopback-only is not enough on its own: every process on the machine shares
|
|
5
|
-
* localhost, so any local program could otherwise register sessions, write
|
|
6
|
-
* checkpoints, and hit the SessionStart path — whose answer is injected into a
|
|
7
|
-
* live agent session as `additionalContext`. The token proves the caller is
|
|
8
|
-
* the hook script that `arcs hooks install-claude-code` provisioned for this
|
|
9
|
-
* project.
|
|
10
|
-
*
|
|
11
|
-
* Intentionally not a CRUD store — one token per project, rotated by rerunning
|
|
12
|
-
* the install command. No index, no markdown mirror, no lock (a rotation races
|
|
13
|
-
* only with itself, and the loser simply has to rerun install).
|
|
14
|
-
*/
|
|
15
|
-
import { timingSafeEqual } from "node:crypto";
|
|
16
|
-
import { chmod } from "node:fs/promises";
|
|
17
|
-
import { dirname, join } from "node:path";
|
|
18
|
-
import { readJsonSafe } from "./json.js";
|
|
19
|
-
import { ensureDir, nowISO, writeJson } from "./storage-utils.js";
|
|
20
|
-
export function hookTokenPath(projectDir) {
|
|
21
|
-
return join(projectDir, "hooks", "claude-code-token.json");
|
|
22
|
-
}
|
|
23
|
-
export async function readHookToken(projectDir) {
|
|
24
|
-
const file = await readJsonSafe(hookTokenPath(projectDir));
|
|
25
|
-
return typeof file?.token === "string" && file.token ? file.token : undefined;
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* Rotates the on-disk token, owner-only.
|
|
29
|
-
*
|
|
30
|
-
* Unlike the web token there is no in-memory copy to verify against — the hook
|
|
31
|
-
* subprocess re-reads this file at every checkpoint, so the FILE is the
|
|
32
|
-
* credential and its mode is the whole control. `writeJson` stages a temp file
|
|
33
|
-
* and renames it into place with no mode argument, so the token lands 0644
|
|
34
|
-
* (world-readable) on a default umask — and it lands that way on EVERY write,
|
|
35
|
-
* not just the first: the rename swaps in the freshly created temp inode, whose
|
|
36
|
-
* mode came from the umask, and the previous file's mode is discarded with the
|
|
37
|
-
* inode it belonged to. (A mode passed at open() would in fact have covered this
|
|
38
|
-
* writer, precisely because every write creates the destination inode; the
|
|
39
|
-
* "applies only at create" caveat bites a direct non-atomic open(path,"w",mode)
|
|
40
|
-
* over an existing file, which is not this path.) The chmod is nonetheless
|
|
41
|
-
* unconditional rather than conditional on the mode read back, so the 0600
|
|
42
|
-
* guarantee survives a future switch away from the atomic writer.
|
|
43
|
-
*
|
|
44
|
-
* The directory is narrowed too: the staged temp file is a fresh inode born
|
|
45
|
-
* under the umask, so it is briefly world-readable between write and rename.
|
|
46
|
-
* 0o700 on the enclosing directory — which holds nothing but this token —
|
|
47
|
-
* denies another account the traversal needed to reach that window at all.
|
|
48
|
-
*
|
|
49
|
-
* What this buys, stated honestly: 0o600 is a cross-user control. It keeps
|
|
50
|
-
* other UNIX accounts out; it is NOT a defense against a process running as
|
|
51
|
-
* THIS user, which can read the file at any mode. Nor is this the token's only
|
|
52
|
-
* copy — `arcs hooks install-claude-code --write` embeds the same value in the
|
|
53
|
-
* workspace's .claude/settings.local.json, which is now created 0o600 and
|
|
54
|
-
* chmodded 0o600 unconditionally too (claude-code-hook-install.ts), though that
|
|
55
|
-
* copy is inlined into the hook command string and so still leaks to `ps` on
|
|
56
|
-
* every hook fire. So this is a floor on ARCS's own copy, not a guarantee about
|
|
57
|
-
* the secret.
|
|
58
|
-
*
|
|
59
|
-
* A chmod failure propagates and fails the install command. That is
|
|
60
|
-
* deliberate — the caller (`arcs hooks install-claude-code`) has not printed
|
|
61
|
-
* the snippet yet, so the run fails closed and the user reruns to rotate,
|
|
62
|
-
* rather than silently installing a token this process could not protect. The
|
|
63
|
-
* hook's own read path (readHookToken/verifyHookToken) is untouched by this and
|
|
64
|
-
* still never throws.
|
|
65
|
-
*/
|
|
66
|
-
export async function writeHookToken(projectDir, token) {
|
|
67
|
-
const path = hookTokenPath(projectDir);
|
|
68
|
-
await ensureDir(dirname(path));
|
|
69
|
-
await chmod(dirname(path), 0o700);
|
|
70
|
-
await writeJson(path, { token, createdAt: nowISO() });
|
|
71
|
-
await chmod(path, 0o600);
|
|
72
|
-
}
|
|
73
|
-
/**
|
|
74
|
-
* Constant-time token comparison. Returns false when the project has no token
|
|
75
|
-
* provisioned yet, so an uninstalled project cannot be driven by an empty
|
|
76
|
-
* `Authorization` header.
|
|
77
|
-
*/
|
|
78
|
-
export async function verifyHookToken(projectDir, candidate) {
|
|
79
|
-
const token = await readHookToken(projectDir);
|
|
80
|
-
if (!token || !candidate)
|
|
81
|
-
return false;
|
|
82
|
-
const expected = Buffer.from(token, "utf-8");
|
|
83
|
-
const actual = Buffer.from(candidate, "utf-8");
|
|
84
|
-
if (expected.length !== actual.length)
|
|
85
|
-
return false;
|
|
86
|
-
return timingSafeEqual(expected, actual);
|
|
87
|
-
}
|
|
88
|
-
//# sourceMappingURL=hook-token-store.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"hook-token-store.js","sourceRoot":"","sources":["../../src/utils/hook-token-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAOlE,MAAM,UAAU,aAAa,CAAC,UAAkB;IAC9C,OAAO,IAAI,CAAC,UAAU,EAAE,OAAO,EAAE,wBAAwB,CAAC,CAAC;AAC7D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,UAAkB;IACpD,MAAM,IAAI,GAAG,MAAM,YAAY,CAAgB,aAAa,CAAC,UAAU,CAAC,CAAC,CAAC;IAC1E,OAAO,OAAO,IAAI,EAAE,KAAK,KAAK,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AAChF,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,UAAkB,EAAE,KAAa;IACpE,MAAM,IAAI,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC;IACvC,MAAM,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IAC/B,MAAM,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC;IAClC,MAAM,SAAS,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;IACtD,MAAM,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AAC3B,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,UAAkB,EAAE,SAAiB;IACzE,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,UAAU,CAAC,CAAC;IAC9C,IAAI,CAAC,KAAK,IAAI,CAAC,SAAS;QAAE,OAAO,KAAK,CAAC;IAEvC,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC7C,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAC/C,IAAI,QAAQ,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IACpD,OAAO,eAAe,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;AAC3C,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import"./chunk-KEIR6QF5-DEvma7oi.js";import{M as e}from"./mermaid-parser.core-BLC8FhgU.js";export{e as createArchitectureServices};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{at as e,it as t}from"./chunk-WYO6CB5R-DcymFbES.js";var n=(n,r)=>e.lang.round(t.parse(n)[r]);export{n as t};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{n as e}from"./chunk-Y2CYZVJY-DsF7k-Jl.js";import"./src-oBChb5qS.js";import"./chunk-WYO6CB5R-DcymFbES.js";import"./chunk-ICXQ74PX-BdMYglo2.js";import"./chunk-HOUHSVGY-DWDW6sxp.js";import"./chunk-Q4XR5HBZ-B3kcxFE-.js";import"./chunk-7BUUIJ7U-Bb538aSH.js";import"./chunk-OGEWGWER-CBx8MB7f.js";import"./chunk-32BRIVSS-Bw_IuJCM.js";import"./chunk-XXDRQBXY-BvKO0v-W.js";import"./chunk-VR4S4FIN-BBOydgvt.js";import"./chunk-C7G6YPKG-hhOrvw5w.js";import"./chunk-ZGVPDNZ5--uKFP-Lr.js";import"./chunk-52WLFC77-C29h440W.js";import"./chunk-FWX5IMBZ-6vdX9EUn.js";import{i as t,n,r,t as i}from"./chunk-V7JOEXUC-CAlymndy.js";var a={parser:n,get db(){return new i},renderer:r,styles:t,init:e(e=>{e.class||={},e.class.arrowMarkerAbsolute=e.arrowMarkerAbsolute},`init`)};export{a as diagram};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{n as e}from"./chunk-Y2CYZVJY-DsF7k-Jl.js";import"./src-oBChb5qS.js";import"./chunk-WYO6CB5R-DcymFbES.js";import"./chunk-ICXQ74PX-BdMYglo2.js";import"./chunk-HOUHSVGY-DWDW6sxp.js";import"./chunk-Q4XR5HBZ-B3kcxFE-.js";import"./chunk-7BUUIJ7U-Bb538aSH.js";import"./chunk-OGEWGWER-CBx8MB7f.js";import"./chunk-32BRIVSS-Bw_IuJCM.js";import"./chunk-XXDRQBXY-BvKO0v-W.js";import"./chunk-VR4S4FIN-BBOydgvt.js";import"./chunk-C7G6YPKG-hhOrvw5w.js";import"./chunk-ZGVPDNZ5--uKFP-Lr.js";import"./chunk-52WLFC77-C29h440W.js";import"./chunk-FWX5IMBZ-6vdX9EUn.js";import{i as t,n,r,t as i}from"./chunk-V7JOEXUC-CAlymndy.js";var a={parser:n,get db(){return new i},renderer:r,styles:t,init:e(e=>{e.class||={},e.class.arrowMarkerAbsolute=e.arrowMarkerAbsolute},`init`)};export{a as diagram};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import"./chunk-KEIR6QF5-DEvma7oi.js";import{O as e}from"./mermaid-parser.core-BLC8FhgU.js";export{e as createEventModelingServices};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import"./src-oBChb5qS.js";import"./chunk-WYO6CB5R-DcymFbES.js";import"./chunk-ICXQ74PX-BdMYglo2.js";import"./chunk-HOUHSVGY-DWDW6sxp.js";import"./chunk-Q4XR5HBZ-B3kcxFE-.js";import"./chunk-7BUUIJ7U-Bb538aSH.js";import"./chunk-OGEWGWER-CBx8MB7f.js";import"./chunk-32BRIVSS-Bw_IuJCM.js";import"./chunk-XXDRQBXY-BvKO0v-W.js";import"./chunk-VR4S4FIN-BBOydgvt.js";import"./chunk-C7G6YPKG-hhOrvw5w.js";import"./chunk-ZGVPDNZ5--uKFP-Lr.js";import"./chunk-52WLFC77-C29h440W.js";import"./chunk-FWX5IMBZ-6vdX9EUn.js";import"./chunk-ZIRB5QZD-BpeS1aZ7.js";import{n as e}from"./chunk-PUDLZKDR-DKssR1nf.js";export{e as diagram};
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */
|
|
2
|
-
@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial}}}@layer theme{:root,:host{--font-sans:-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:"JetBrains Mono Variable", ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;--color-emerald-500:oklch(69.6% .17 162.48);--color-black:#000;--spacing:.25rem;--container-md:28rem;--container-lg:32rem;--container-xl:36rem;--container-2xl:42rem;--container-4xl:56rem;--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height:calc(1.5 / 1);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--font-weight-normal:400;--font-weight-bold:700;--tracking-wide:.025em;--leading-snug:1.375;--leading-relaxed:1.625;--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--color-term-bg:#050505;--color-term-panel:#101010;--color-term-inset:#1a1a1a;--color-term-border:#2c2c2c;--color-term-border-hi:#474747;--color-term-fg:#f2f2f2;--color-term-dim:#8f8f8f;--color-term-green:#4ade80;--color-term-amber:#fbbf24;--color-term-red:#f87171;--color-term-cyan:#22d3ee;--color-term-magenta:#e879f9;--color-term-blue:#60a5fa;--color-term-purple:#a78bfa;--color-term-orange:#fb923c;--color-term-teal:#2dd4bf;--color-term-lime:#a3e635}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring:where(:not(iframe)){outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}html,body,#root{height:100%}body{background-color:var(--color-term-bg);font-family:var(--font-mono);--tw-leading:var(--leading-relaxed);font-size:13px;line-height:var(--leading-relaxed);color:var(--color-term-fg);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}::selection{background:var(--color-term-fg);color:var(--color-term-bg)}::-webkit-scrollbar{width:8px;height:8px}::-webkit-scrollbar-track{background:var(--color-term-bg)}::-webkit-scrollbar-thumb{background:var(--color-term-border)}::-webkit-scrollbar-thumb:hover{background:var(--color-term-border-hi)}input,textarea,select,button{font:inherit}select,option{background:var(--color-term-inset);color:var(--color-term-fg)}}@layer components{.kbd{border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-term-border);background-color:var(--color-term-panel);padding-inline:var(--spacing);--tw-leading:calc(var(--spacing) * 4);font-size:11px;line-height:calc(var(--spacing) * 4);color:var(--color-term-dim);display:inline-block}.scanlines{pointer-events:none;z-index:60;background:repeating-linear-gradient(0deg,#0000 0 2px,#0000000b 3px,#0000 4px);position:fixed;inset:0}.md{--tw-leading:var(--leading-relaxed);max-width:none;font-size:13px;line-height:var(--leading-relaxed)}.md h1{margin-top:0;margin-bottom:calc(var(--spacing) * 4);border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--color-term-border);padding-bottom:calc(var(--spacing) * 2);font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height));--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold);color:var(--color-term-green)}.md h2{margin-top:calc(var(--spacing) * 7);margin-bottom:calc(var(--spacing) * 3);border-bottom-style:var(--tw-border-style);border-color:#2c2c2c99;border-bottom-width:1px}@supports (color:color-mix(in lab, red, red)){.md h2{border-color:color-mix(in oklab, var(--color-term-border) 60%, transparent)}}.md h2{padding-bottom:var(--spacing);font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height));--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold);color:var(--color-term-green)}.md h3{margin-top:calc(var(--spacing) * 5);margin-bottom:calc(var(--spacing) * 2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold);color:var(--color-term-cyan)}.md h4{margin-top:calc(var(--spacing) * 4);margin-bottom:calc(var(--spacing) * 2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold);color:var(--color-term-fg)}.md p{margin-block:calc(var(--spacing) * 3)}.md ul{margin-block:calc(var(--spacing) * 3);padding-left:calc(var(--spacing) * 4);list-style-type:none}.md ul>li{margin-block:var(--spacing);position:relative}.md ul>li:before{content:"▸";left:calc(var(--spacing) * -4);color:var(--color-term-dim);position:absolute}.md ul>li>ul{margin-block:var(--spacing)}.md ol{margin-block:calc(var(--spacing) * 3);padding-left:calc(var(--spacing) * 6);list-style-type:decimal}.md ol ::marker{color:var(--color-term-dim)}.md ol::marker{color:var(--color-term-dim)}.md ol ::-webkit-details-marker{color:var(--color-term-dim)}.md ol::-webkit-details-marker{color:var(--color-term-dim)}.md a{color:var(--color-term-cyan);text-underline-offset:2px;text-decoration-line:underline}@media (hover:hover){.md a:hover{color:var(--color-term-green)}}.md strong{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold);color:var(--color-term-fg)}.md code:not(pre code){border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-term-border);background-color:var(--color-term-panel);padding-inline:var(--spacing);padding-block:calc(var(--spacing) * .5);color:var(--color-term-amber);font-size:12px}.md pre{margin-block:calc(var(--spacing) * 4);border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-term-border);background-color:var(--color-term-inset);padding:calc(var(--spacing) * 3);overflow-x:auto}.md pre code{background:0 0;font-size:12px}.md blockquote{margin-block:calc(var(--spacing) * 3);border-left-style:var(--tw-border-style);border-color:#fbbf2499;border-left-width:2px}@supports (color:color-mix(in lab, red, red)){.md blockquote{border-color:color-mix(in oklab, var(--color-term-amber) 60%, transparent)}}.md blockquote{padding-left:calc(var(--spacing) * 3);color:var(--color-term-dim)}.md table{margin-block:calc(var(--spacing) * 4);border-collapse:collapse;width:100%}.md th{border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-term-border);background-color:var(--color-term-panel);padding-inline:calc(var(--spacing) * 2);padding-block:var(--spacing);text-align:left;--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold);color:var(--color-term-green)}.md td{border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-term-border);padding-inline:calc(var(--spacing) * 2);padding-block:var(--spacing);vertical-align:top}.md hr{margin-block:calc(var(--spacing) * 6);border-color:var(--color-term-border)}.md input[type=checkbox]{margin-right:var(--spacing);accent-color:var(--color-emerald-500)}.hljs{background:0 0}.cm-host,.cm-host .cm-editor{height:100%}.cm-host .cm-editor{border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-term-border);--tw-outline-style:none;background-color:#0000;outline-style:none;font-size:13px}.cm-host .cm-scroller{font-family:var(--font-mono)}}@layer utilities{.pointer-events-none{pointer-events:none}.collapse{visibility:collapse}.invisible{visibility:hidden}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.inset-0{inset:0}.top-0{top:0}.top-2{top:calc(var(--spacing) * 2)}.right-3{right:calc(var(--spacing) * 3)}.bottom-8{bottom:calc(var(--spacing) * 8)}.z-10{z-index:10}.z-40{z-index:40}.z-50{z-index:50}.col-span-2{grid-column:span 2/span 2}.container{width:100%}@media (width>=40rem){.container{max-width:40rem}}@media (width>=48rem){.container{max-width:48rem}}@media (width>=64rem){.container{max-width:64rem}}@media (width>=80rem){.container{max-width:80rem}}@media (width>=96rem){.container{max-width:96rem}}.mx-auto{margin-inline:auto}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:var(--spacing)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mr-1{margin-right:var(--spacing)}.mr-2{margin-right:calc(var(--spacing) * 2)}.mb-0\.5{margin-bottom:calc(var(--spacing) * .5)}.mb-1{margin-bottom:var(--spacing)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.ml-1{margin-left:var(--spacing)}.ml-1\.5{margin-left:calc(var(--spacing) * 1.5)}.ml-2{margin-left:calc(var(--spacing) * 2)}.ml-6{margin-left:calc(var(--spacing) * 6)}.line-clamp-3{-webkit-line-clamp:3;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.table{display:table}.h-1\.5{height:calc(var(--spacing) * 1.5)}.h-64{height:calc(var(--spacing) * 64)}.h-\[calc\(100\%-25px\)\]{height:calc(100% - 25px)}.h-\[calc\(100\%-33px\)\]{height:calc(100% - 33px)}.h-full{height:100%}.max-h-48{max-height:calc(var(--spacing) * 48)}.max-h-64{max-height:calc(var(--spacing) * 64)}.max-h-\[55vh\]{max-height:55vh}.min-h-0{min-height:0}.min-h-14{min-height:calc(var(--spacing) * 14)}.min-h-16{min-height:calc(var(--spacing) * 16)}.min-h-20{min-height:calc(var(--spacing) * 20)}.min-h-40{min-height:calc(var(--spacing) * 40)}.min-h-96{min-height:calc(var(--spacing) * 96)}.w-3{width:calc(var(--spacing) * 3)}.w-6{width:calc(var(--spacing) * 6)}.w-8{width:calc(var(--spacing) * 8)}.w-12{width:calc(var(--spacing) * 12)}.w-14{width:calc(var(--spacing) * 14)}.w-16{width:calc(var(--spacing) * 16)}.w-20{width:calc(var(--spacing) * 20)}.w-24{width:calc(var(--spacing) * 24)}.w-28{width:calc(var(--spacing) * 28)}.w-32{width:calc(var(--spacing) * 32)}.w-36{width:calc(var(--spacing) * 36)}.w-44{width:calc(var(--spacing) * 44)}.w-48{width:calc(var(--spacing) * 48)}.w-56{width:calc(var(--spacing) * 56)}.w-60{width:calc(var(--spacing) * 60)}.w-72{width:calc(var(--spacing) * 72)}.w-96{width:calc(var(--spacing) * 96)}.w-full{width:100%}.max-w-2xl{max-width:var(--container-2xl)}.max-w-4xl{max-width:var(--container-4xl)}.max-w-lg{max-width:var(--container-lg)}.max-w-md{max-width:var(--container-md)}.max-w-xl{max-width:var(--container-xl)}.min-w-0{min-width:0}.flex-1{flex:1}.shrink-0{flex-shrink:0}.border-collapse{border-collapse:collapse}.cursor-default{cursor:default}.cursor-pointer{cursor:pointer}.resize-none{resize:none}.resize-y{resize:vertical}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-\[8rem_1fr\]{grid-template-columns:8rem 1fr}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-baseline{align-items:baseline}.items-center{align-items:center}.items-start{align-items:flex-start}.items-stretch{align-items:stretch}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.gap-1{gap:var(--spacing)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-6{gap:calc(var(--spacing) * 6)}.gap-px{gap:1px}.gap-x-2{column-gap:calc(var(--spacing) * 2)}.gap-x-3{column-gap:calc(var(--spacing) * 3)}.gap-x-6{column-gap:calc(var(--spacing) * 6)}.gap-y-1{row-gap:var(--spacing)}.gap-y-3{row-gap:calc(var(--spacing) * 3)}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-term-border\/40>:not(:last-child)){border-color:#2c2c2c66}@supports (color:color-mix(in lab, red, red)){:where(.divide-term-border\/40>:not(:last-child)){border-color:color-mix(in oklab, var(--color-term-border) 40%, transparent)}}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.border{border-style:var(--tw-border-style);border-width:1px}.border-0{border-style:var(--tw-border-style);border-width:0}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-b-0{border-bottom-style:var(--tw-border-style);border-bottom-width:0}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-l-2{border-left-style:var(--tw-border-style);border-left-width:2px}.border-term-amber\/40{border-color:#fbbf2466}@supports (color:color-mix(in lab, red, red)){.border-term-amber\/40{border-color:color-mix(in oklab, var(--color-term-amber) 40%, transparent)}}.border-term-bg\/50{border-color:#05050580}@supports (color:color-mix(in lab, red, red)){.border-term-bg\/50{border-color:color-mix(in oklab, var(--color-term-bg) 50%, transparent)}}.border-term-blue\/40{border-color:#60a5fa66}@supports (color:color-mix(in lab, red, red)){.border-term-blue\/40{border-color:color-mix(in oklab, var(--color-term-blue) 40%, transparent)}}.border-term-border{border-color:var(--color-term-border)}.border-term-border-hi{border-color:var(--color-term-border-hi)}.border-term-border\/30{border-color:#2c2c2c4d}@supports (color:color-mix(in lab, red, red)){.border-term-border\/30{border-color:color-mix(in oklab, var(--color-term-border) 30%, transparent)}}.border-term-border\/40{border-color:#2c2c2c66}@supports (color:color-mix(in lab, red, red)){.border-term-border\/40{border-color:color-mix(in oklab, var(--color-term-border) 40%, transparent)}}.border-term-border\/60{border-color:#2c2c2c99}@supports (color:color-mix(in lab, red, red)){.border-term-border\/60{border-color:color-mix(in oklab, var(--color-term-border) 60%, transparent)}}.border-term-cyan\/40{border-color:#22d3ee66}@supports (color:color-mix(in lab, red, red)){.border-term-cyan\/40{border-color:color-mix(in oklab, var(--color-term-cyan) 40%, transparent)}}.border-term-cyan\/50{border-color:#22d3ee80}@supports (color:color-mix(in lab, red, red)){.border-term-cyan\/50{border-color:color-mix(in oklab, var(--color-term-cyan) 50%, transparent)}}.border-term-cyan\/60{border-color:#22d3ee99}@supports (color:color-mix(in lab, red, red)){.border-term-cyan\/60{border-color:color-mix(in oklab, var(--color-term-cyan) 60%, transparent)}}.border-term-green\/40{border-color:#4ade8066}@supports (color:color-mix(in lab, red, red)){.border-term-green\/40{border-color:color-mix(in oklab, var(--color-term-green) 40%, transparent)}}.border-term-green\/60{border-color:#4ade8099}@supports (color:color-mix(in lab, red, red)){.border-term-green\/60{border-color:color-mix(in oklab, var(--color-term-green) 60%, transparent)}}.border-term-lime\/40{border-color:#a3e63566}@supports (color:color-mix(in lab, red, red)){.border-term-lime\/40{border-color:color-mix(in oklab, var(--color-term-lime) 40%, transparent)}}.border-term-magenta\/40{border-color:#e879f966}@supports (color:color-mix(in lab, red, red)){.border-term-magenta\/40{border-color:color-mix(in oklab, var(--color-term-magenta) 40%, transparent)}}.border-term-orange\/40{border-color:#fb923c66}@supports (color:color-mix(in lab, red, red)){.border-term-orange\/40{border-color:color-mix(in oklab, var(--color-term-orange) 40%, transparent)}}.border-term-purple\/40{border-color:#a78bfa66}@supports (color:color-mix(in lab, red, red)){.border-term-purple\/40{border-color:color-mix(in oklab, var(--color-term-purple) 40%, transparent)}}.border-term-red\/40{border-color:#f8717166}@supports (color:color-mix(in lab, red, red)){.border-term-red\/40{border-color:color-mix(in oklab, var(--color-term-red) 40%, transparent)}}.border-term-red\/50{border-color:#f8717180}@supports (color:color-mix(in lab, red, red)){.border-term-red\/50{border-color:color-mix(in oklab, var(--color-term-red) 50%, transparent)}}.border-term-red\/60{border-color:#f8717199}@supports (color:color-mix(in lab, red, red)){.border-term-red\/60{border-color:color-mix(in oklab, var(--color-term-red) 60%, transparent)}}.border-term-teal\/40{border-color:#2dd4bf66}@supports (color:color-mix(in lab, red, red)){.border-term-teal\/40{border-color:color-mix(in oklab, var(--color-term-teal) 40%, transparent)}}.border-transparent{border-color:#0000}.bg-black\/60{background-color:#0009}@supports (color:color-mix(in lab, red, red)){.bg-black\/60{background-color:color-mix(in oklab, var(--color-black) 60%, transparent)}}.bg-term-bg{background-color:var(--color-term-bg)}.bg-term-bg\/70{background-color:#050505b3}@supports (color:color-mix(in lab, red, red)){.bg-term-bg\/70{background-color:color-mix(in oklab, var(--color-term-bg) 70%, transparent)}}.bg-term-cyan\/20{background-color:#22d3ee33}@supports (color:color-mix(in lab, red, red)){.bg-term-cyan\/20{background-color:color-mix(in oklab, var(--color-term-cyan) 20%, transparent)}}.bg-term-green{background-color:var(--color-term-green)}.bg-term-green\/60{background-color:#4ade8099}@supports (color:color-mix(in lab, red, red)){.bg-term-green\/60{background-color:color-mix(in oklab, var(--color-term-green) 60%, transparent)}}.bg-term-inset{background-color:var(--color-term-inset)}.bg-term-panel{background-color:var(--color-term-panel)}.p-0{padding:0}.p-2{padding:calc(var(--spacing) * 2)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-6{padding:calc(var(--spacing) * 6)}.px-1{padding-inline:var(--spacing)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-6{padding-inline:calc(var(--spacing) * 6)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:var(--spacing)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-6{padding-block:calc(var(--spacing) * 6)}.py-8{padding-block:calc(var(--spacing) * 8)}.pt-1{padding-top:var(--spacing)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-\[12vh\]{padding-top:12vh}.pt-\[15vh\]{padding-top:15vh}.pb-0\.5{padding-bottom:calc(var(--spacing) * .5)}.pb-1{padding-bottom:var(--spacing)}.pb-3{padding-bottom:calc(var(--spacing) * 3)}.pl-2{padding-left:calc(var(--spacing) * 2)}.pl-3{padding-left:calc(var(--spacing) * 3)}.pl-4{padding-left:calc(var(--spacing) * 4)}.pl-5{padding-left:calc(var(--spacing) * 5)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.align-middle{vertical-align:middle}.font-mono{font-family:var(--font-mono)}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-\[9px\]{font-size:9px}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[12px\]{font-size:12px}.text-\[13px\]{font-size:13px}.text-\[15px\]{font-size:15px}.leading-4{--tw-leading:calc(var(--spacing) * 4);line-height:calc(var(--spacing) * 4)}.leading-5{--tw-leading:calc(var(--spacing) * 5);line-height:calc(var(--spacing) * 5)}.leading-snug{--tw-leading:var(--leading-snug);line-height:var(--leading-snug)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.whitespace-nowrap{white-space:nowrap}.whitespace-pre{white-space:pre}.whitespace-pre-wrap{white-space:pre-wrap}.text-inherit{color:inherit}.text-term-amber{color:var(--color-term-amber)}.text-term-bg{color:var(--color-term-bg)}.text-term-bg\/70{color:#050505b3}@supports (color:color-mix(in lab, red, red)){.text-term-bg\/70{color:color-mix(in oklab, var(--color-term-bg) 70%, transparent)}}.text-term-bg\/80{color:#050505cc}@supports (color:color-mix(in lab, red, red)){.text-term-bg\/80{color:color-mix(in oklab, var(--color-term-bg) 80%, transparent)}}.text-term-blue{color:var(--color-term-blue)}.text-term-border-hi{color:var(--color-term-border-hi)}.text-term-cyan{color:var(--color-term-cyan)}.text-term-dim{color:var(--color-term-dim)}.text-term-dim\/40{color:#8f8f8f66}@supports (color:color-mix(in lab, red, red)){.text-term-dim\/40{color:color-mix(in oklab, var(--color-term-dim) 40%, transparent)}}.text-term-dim\/70{color:#8f8f8fb3}@supports (color:color-mix(in lab, red, red)){.text-term-dim\/70{color:color-mix(in oklab, var(--color-term-dim) 70%, transparent)}}.text-term-dim\/80{color:#8f8f8fcc}@supports (color:color-mix(in lab, red, red)){.text-term-dim\/80{color:color-mix(in oklab, var(--color-term-dim) 80%, transparent)}}.text-term-fg{color:var(--color-term-fg)}.text-term-green{color:var(--color-term-green)}.text-term-lime{color:var(--color-term-lime)}.text-term-magenta{color:var(--color-term-magenta)}.text-term-orange{color:var(--color-term-orange)}.text-term-purple{color:var(--color-term-purple)}.text-term-red{color:var(--color-term-red)}.text-term-teal{color:var(--color-term-teal)}.normal-case{text-transform:none}.uppercase{text-transform:uppercase}.italic{font-style:italic}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.line-through{text-decoration-line:line-through}.underline{text-decoration-line:underline}.opacity-0{opacity:0}.opacity-40{opacity:.4}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.opacity-100{opacity:1}.shadow-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a), 0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-black\/50{--tw-shadow-color:#00000080}@supports (color:color-mix(in lab, red, red)){.shadow-black\/50{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-black) 50%, transparent) var(--tw-shadow-alpha), transparent)}}.shadow-black\/60{--tw-shadow-color:#0009}@supports (color:color-mix(in lab, red, red)){.shadow-black\/60{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-black) 60%, transparent) var(--tw-shadow-alpha), transparent)}}.shadow-black\/70{--tw-shadow-color:#000000b3}@supports (color:color-mix(in lab, red, red)){.shadow-black\/70{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-black) 70%, transparent) var(--tw-shadow-alpha), transparent)}}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}@media (hover:hover){.group-hover\:opacity-100:is(:where(.group):hover *){opacity:1}}.placeholder\:text-term-dim\/50::placeholder{color:#8f8f8f80}@supports (color:color-mix(in lab, red, red)){.placeholder\:text-term-dim\/50::placeholder{color:color-mix(in oklab, var(--color-term-dim) 50%, transparent)}}.placeholder\:text-term-dim\/60::placeholder{color:#8f8f8f99}@supports (color:color-mix(in lab, red, red)){.placeholder\:text-term-dim\/60::placeholder{color:color-mix(in oklab, var(--color-term-dim) 60%, transparent)}}@media (hover:hover){.hover\:border-term-cyan\/80:hover{border-color:#22d3eecc}@supports (color:color-mix(in lab, red, red)){.hover\:border-term-cyan\/80:hover{border-color:color-mix(in oklab, var(--color-term-cyan) 80%, transparent)}}.hover\:bg-term-border\/40:hover{background-color:#2c2c2c66}@supports (color:color-mix(in lab, red, red)){.hover\:bg-term-border\/40:hover{background-color:color-mix(in oklab, var(--color-term-border) 40%, transparent)}}.hover\:bg-term-cyan:hover{background-color:var(--color-term-cyan)}.hover\:bg-term-fg\/5:hover{background-color:#f2f2f20d}@supports (color:color-mix(in lab, red, red)){.hover\:bg-term-fg\/5:hover{background-color:color-mix(in oklab, var(--color-term-fg) 5%, transparent)}}.hover\:bg-term-green:hover{background-color:var(--color-term-green)}.hover\:bg-term-inset:hover{background-color:var(--color-term-inset)}.hover\:bg-term-red:hover{background-color:var(--color-term-red)}.hover\:font-bold:hover{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.hover\:text-term-bg:hover{color:var(--color-term-bg)}.hover\:text-term-cyan:hover{color:var(--color-term-cyan)}.hover\:text-term-fg:hover{color:var(--color-term-fg)}.hover\:text-term-green:hover{color:var(--color-term-green)}.hover\:text-term-red:hover{color:var(--color-term-red)}}.focus\:border-term-green\/60:focus{border-color:#4ade8099}@supports (color:color-mix(in lab, red, red)){.focus\:border-term-green\/60:focus{border-color:color-mix(in oklab, var(--color-term-green) 60%, transparent)}}.focus\:bg-term-green:focus{background-color:var(--color-term-green)}.focus\:text-term-bg:focus{color:var(--color-term-bg)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.focus-visible\:opacity-100:focus-visible{opacity:1}.disabled\:opacity-40:disabled{opacity:.4}.disabled\:opacity-50:disabled{opacity:.5}@media (width>=48rem){.md\:col-span-4{grid-column:span 4/span 4}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}@media (width>=64rem){.lg\:col-span-5{grid-column:span 5/span 5}.lg\:block{display:block}.lg\:flex{display:flex}.lg\:inline-flex{display:inline-flex}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}}@media (width>=80rem){.xl\:inline{display:inline}}}@font-face{font-family:JetBrains Mono Variable;font-style:normal;font-display:swap;font-weight:100 800;src:url(data:font/woff2;base64,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)format("woff2-variations");unicode-range:U+460-52F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:JetBrains Mono Variable;font-style:normal;font-display:swap;font-weight:100 800;src:url(/assets/jetbrains-mono-cyrillic-wght-normal-D73BlboJ.woff2)format("woff2-variations");unicode-range:U+301,U+400-45F,U+490-491,U+4B0-4B1,U+2116}@font-face{font-family:JetBrains Mono Variable;font-style:normal;font-display:swap;font-weight:100 800;src:url(/assets/jetbrains-mono-greek-wght-normal-Bw9x6K1M.woff2)format("woff2-variations");unicode-range:U+370-377,U+37A-37F,U+384-38A,U+38C,U+38E-3A1,U+3A3-3FF}@font-face{font-family:JetBrains Mono Variable;font-style:normal;font-display:swap;font-weight:100 800;src:url(/assets/jetbrains-mono-vietnamese-wght-normal-Bt-aOZkq.woff2)format("woff2-variations");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:JetBrains Mono Variable;font-style:normal;font-display:swap;font-weight:100 800;src:url(/assets/jetbrains-mono-latin-ext-wght-normal-DBQx-q_a.woff2)format("woff2-variations");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:JetBrains Mono Variable;font-style:normal;font-display:swap;font-weight:100 800;src:url(/assets/jetbrains-mono-latin-wght-normal-B9CIFXIH.woff2)format("woff2-variations");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}pre code.hljs{padding:1em;display:block;overflow-x:auto}code.hljs{padding:3px 5px}.hljs-meta,.hljs-comment{color:#565f89}.hljs-tag,.hljs-doctag,.hljs-selector-id,.hljs-selector-class,.hljs-regexp,.hljs-template-tag,.hljs-selector-pseudo,.hljs-selector-attr,.hljs-variable.language_,.hljs-deletion{color:#f7768e}.hljs-variable,.hljs-template-variable,.hljs-number,.hljs-literal,.hljs-type,.hljs-params,.hljs-link{color:#ff9e64}.hljs-built_in,.hljs-attribute{color:#e0af68}.hljs-keyword,.hljs-title.function_,.hljs-title,.hljs-title.class_,.hljs-title.class_.inherited__,.hljs-subst,.hljs-property{color:#7dcfff}.hljs-selector-tag{color:#73daca}.hljs-quote,.hljs-string,.hljs-symbol,.hljs-bullet,.hljs-addition{color:#9ece6a}.hljs-code,.hljs-formula,.hljs-section{color:#7aa2f7}.hljs-name,.hljs-keyword,.hljs-operator,.hljs-keyword,.hljs-char.escape_,.hljs-attr{color:#bb9af7}.hljs-punctuation{color:#c0caf5}.hljs{color:#9aa5ce;background:#1a1b26}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import"./chunk-KEIR6QF5-DEvma7oi.js";import{m as e}from"./mermaid-parser.core-BLC8FhgU.js";export{e as createRailroadAbnfServices};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import"./chunk-KEIR6QF5-DEvma7oi.js";import{f as e}from"./mermaid-parser.core-BLC8FhgU.js";export{e as createRailroadEbnfServices};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import"./chunk-KEIR6QF5-DEvma7oi.js";import{u as e}from"./mermaid-parser.core-BLC8FhgU.js";export{e as createRailroadPegServices};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{n as e}from"./chunk-Y2CYZVJY-DsF7k-Jl.js";import"./src-oBChb5qS.js";import"./chunk-WYO6CB5R-DcymFbES.js";import"./chunk-ICXQ74PX-BdMYglo2.js";import"./chunk-HOUHSVGY-DWDW6sxp.js";import"./chunk-Q4XR5HBZ-B3kcxFE-.js";import"./chunk-7BUUIJ7U-Bb538aSH.js";import"./chunk-OGEWGWER-CBx8MB7f.js";import"./chunk-32BRIVSS-Bw_IuJCM.js";import"./chunk-XXDRQBXY-BvKO0v-W.js";import"./chunk-VR4S4FIN-BBOydgvt.js";import"./chunk-C7G6YPKG-hhOrvw5w.js";import"./chunk-ZGVPDNZ5--uKFP-Lr.js";import"./chunk-52WLFC77-C29h440W.js";import"./chunk-FWX5IMBZ-6vdX9EUn.js";import{i as t,n,r,t as i}from"./chunk-EX3LRPZG-COMzol-M.js";var a={parser:n,get db(){return new i(2)},renderer:r,styles:t,init:e(e=>{e.state||={},e.state.arrowMarkerAbsolute=e.arrowMarkerAbsolute},`init`)};export{a as diagram};
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import{n as e}from"./chunk-Y2CYZVJY-DsF7k-Jl.js";import"./src-oBChb5qS.js";import"./chunk-WYO6CB5R-DcymFbES.js";import"./chunk-ICXQ74PX-BdMYglo2.js";import"./chunk-HOUHSVGY-DWDW6sxp.js";import"./chunk-Q4XR5HBZ-B3kcxFE-.js";import"./chunk-7BUUIJ7U-Bb538aSH.js";import"./chunk-OGEWGWER-CBx8MB7f.js";import"./chunk-32BRIVSS-Bw_IuJCM.js";import"./chunk-XXDRQBXY-BvKO0v-W.js";import"./chunk-VR4S4FIN-BBOydgvt.js";import"./chunk-C7G6YPKG-hhOrvw5w.js";import"./chunk-ZGVPDNZ5--uKFP-Lr.js";import"./chunk-52WLFC77-C29h440W.js";import"./chunk-FWX5IMBZ-6vdX9EUn.js";import"./chunk-ZIRB5QZD-BpeS1aZ7.js";import{r as t,t as n}from"./chunk-PUDLZKDR-DKssR1nf.js";var r=n({defaultLayout:`swimlane`,styles:e(e=>`${t(e)}
|
|
2
|
-
.swimlane.cluster rect {
|
|
3
|
-
stroke: ${e.clusterBorder} !important;
|
|
4
|
-
}
|
|
5
|
-
[data-look="neo"].cluster rect {
|
|
6
|
-
filter: none;
|
|
7
|
-
}
|
|
8
|
-
`,`getStyles`)});export{r as diagram};
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Bearer-token gate for `/api/hook/*`.
|
|
3
|
-
*
|
|
4
|
-
* Layered on top of (never instead of) the global loopback-only
|
|
5
|
-
* `secureLocalRequest`: loopback proves the caller is on this machine, the
|
|
6
|
-
* token proves it is this project's installed hook script. Browser-facing
|
|
7
|
-
* routes stay token-free — only the hook endpoint carries a shared secret,
|
|
8
|
-
* because only it is called by something that is not the ARCS web UI.
|
|
9
|
-
*/
|
|
10
|
-
import type { MiddlewareHandler } from "hono";
|
|
11
|
-
export declare const requireHookToken: MiddlewareHandler;
|
|
12
|
-
//# sourceMappingURL=hook-auth.d.ts.map
|