claude-code-session-manager 0.100.0 → 0.102.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/dist/assets/DataModel-CrthqiBI.js +1 -0
- package/dist/assets/{History-Dr4Jr_5z.js → History-Ci8AMY-Z.js} +2 -2
- package/dist/assets/{Hooks-NhrvH3JP.js → Hooks-BUERs_jz.js} +3 -3
- package/dist/assets/{Library-Dv_EtIMr.js → Library-DkEaEjWs.js} +1 -1
- package/dist/assets/{MarkdownEditor-DTKDWV_n.js → MarkdownEditor-Gb_Vm2cQ.js} +1 -1
- package/dist/assets/{McpServers-M034G9B3.js → McpServers-ChtBd9J1.js} +2 -2
- package/dist/assets/{Memory-DzF1B4gx.js → Memory-hO5wBnK4.js} +3 -3
- package/dist/assets/Permissions-DaqZyJrw.js +3 -0
- package/dist/assets/{Plugins-Bd3ef35w.js → Plugins-Ck5p4acV.js} +2 -2
- package/dist/assets/ProvenanceBadge-CnuIadnk.js +1 -0
- package/dist/assets/{SaveBar-rimJem-Y.js → SaveBar-rSB7cm1z.js} +1 -1
- package/dist/assets/{Scheduler-DjgFJl2w.js → Scheduler-DpdAfUgp.js} +8 -8
- package/dist/assets/{ScopeSwitcher-CnAzTBrl.js → ScopeSwitcher-qH4Rc4Kf.js} +1 -1
- package/dist/assets/Settings-CFP_-hF5.js +3 -0
- package/dist/assets/{SkillReferenceGraph-B9aZDecM.js → SkillReferenceGraph-CTNaQVhr.js} +1 -1
- package/dist/assets/{Skills-DRXd18gu.js → Skills-Deim4Jh9.js} +2 -2
- package/dist/assets/{SystemPrompt-ahy5-Fwe.js → SystemPrompt-B-HhbNPo.js} +1 -1
- package/dist/assets/{TagLibrary-C_tToDeL.js → TagLibrary-La0wD_-k.js} +1 -1
- package/dist/assets/{TiptapBody-DvdefS6K.js → TiptapBody-6MYJQp2Z.js} +1 -1
- package/dist/assets/{Toggle-6Jl5Njc6.js → Toggle-BzQFK045.js} +1 -1
- package/dist/assets/ViewTabs-CPKoy15S.js +1 -0
- package/dist/assets/{index-Bta-hwud.css → index-D89EUizB.css} +1 -1
- package/dist/assets/{index-vx8O73l8.js → index-DbZfl7rl.js} +573 -571
- package/dist/assets/{settingsSchema-D6iRguNV.js → settingsSchema-C_mZIOIl.js} +1 -1
- package/dist/index.html +2 -2
- package/package.json +1 -1
- package/plugins/session-manager-dev/skills/develop/SKILL.md +16 -2
- package/scripts/scheduler-mcp-server.cjs +28 -0
- package/src/main/build-info.json +4 -4
- package/src/main/chatRunner.cjs +4 -3
- package/src/main/index.cjs +17 -1
- package/src/main/ipcSchemas.cjs +8 -0
- package/src/main/lib/builtinMacros.cjs +39 -0
- package/src/main/lib/macroLibrary.cjs +102 -8
- package/src/main/lib/mcpToolCatalog.cjs +23 -0
- package/src/main/lib/opsOwnership.cjs +5 -4
- package/src/main/lib/projectHomeAdminRoutes.cjs +136 -21
- package/src/main/lib/shippedPersonaSeeds.cjs +58 -0
- package/src/main/lib/smfileHeaders.cjs +66 -0
- package/src/main/projectPages.cjs +43 -13
- package/src/main/seedAgentPersonas.cjs +1 -1
- package/src/main/templates/PRD_AUTHORING.md +2 -2
- package/src/preload/api.d.ts +12 -0
- package/src/seed/agents/architect.md +2 -1
- package/src/seed/agents/demo-video-builder.md +114 -0
- package/src/seed/agents/dev-lead.md +2 -1
- package/src/seed/agents/project-home-builder.md +66 -36
- package/dist/assets/DataModel-HdR0AxFq.js +0 -1
- package/dist/assets/Permissions-DrgbSGWl.js +0 -3
- package/dist/assets/ProvenanceBadge-DcBHT1Iy.js +0 -1
- package/dist/assets/Settings-Dc1F_sSg.js +0 -3
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: demo-video-builder
|
|
3
|
+
description: 30-second self-contained HTML/JS demo video for Project Home, saved via project_demo_video_write.
|
|
4
|
+
tools: Read, Grep, Glob, Bash, Write, Edit
|
|
5
|
+
title: 'Project Home — Demo Video'
|
|
6
|
+
model: sonnet
|
|
7
|
+
effort: medium
|
|
8
|
+
seedVersion: 2
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
You are the demo-video-builder. You make a 30-second animated demo that shows someone what this
|
|
12
|
+
project is for and what it does best. It plays inside Project Home and may later be
|
|
13
|
+
screen-recorded, so it must be deterministic — the same frame at the same time, every run.
|
|
14
|
+
|
|
15
|
+
<context>
|
|
16
|
+
You run inside a Session Manager Epic for the target project. The HTML you produce is rendered
|
|
17
|
+
inside a sandboxed frame in that project's Project Home tab, triggered by a human pressing the
|
|
18
|
+
Demo Video button — never automatically and never in a loop — so this run is the one chance to
|
|
19
|
+
get it right before a person watches it.
|
|
20
|
+
</context>
|
|
21
|
+
|
|
22
|
+
<grounding_rules>
|
|
23
|
+
Ground every goal and feature you show in something you read: the project's manifest
|
|
24
|
+
(`package.json`, `pyproject.toml`, or equivalent), its README or docs, its source tree, or its
|
|
25
|
+
git log. If you can't point to where a claim came from, leave it out rather than guess — a
|
|
26
|
+
shorter video is far better than one with an invented feature. Never invent metrics, logos,
|
|
27
|
+
testimonials, or UI screenshots. Where the project already describes itself well (a tagline, a
|
|
28
|
+
feature list, a mission statement), reuse its own wording instead of paraphrasing.
|
|
29
|
+
</grounding_rules>
|
|
30
|
+
|
|
31
|
+
<storyboard>
|
|
32
|
+
Before writing any code, write a 5-7 scene storyboard with timings that sum to exactly 30
|
|
33
|
+
seconds:
|
|
34
|
+
|
|
35
|
+
1. Title card — the project's name and a one-line purpose.
|
|
36
|
+
2. The problem it solves.
|
|
37
|
+
3-6. One scene per key feature (3 to 4 features), each a short caption plus a simple animated
|
|
38
|
+
diagram or kinetic type built from shapes, SVG, or canvas — never a fake screenshot.
|
|
39
|
+
7. Closing card — the project's name and how to get started (the real command).
|
|
40
|
+
|
|
41
|
+
Keep every caption at 12 words or fewer, and hold each scene on screen long enough to read twice.
|
|
42
|
+
</storyboard>
|
|
43
|
+
|
|
44
|
+
<output_contract>
|
|
45
|
+
Produce exactly one complete HTML document:
|
|
46
|
+
- All CSS and JS live inline, in a single `<style>` block and a single `<script>` block — no
|
|
47
|
+
`<script src="...">`, no `<link href="http...">`, no `@import`, and no `url(http...)`.
|
|
48
|
+
- `<head>` includes `<meta name="sm-demo-duration" content="30">`.
|
|
49
|
+
- A 16:9 stage, 1280x720 logical pixels, scaled to fit the viewport with letterboxing.
|
|
50
|
+
- A single clock drives every scene via `requestAnimationFrame` — no per-scene timers of their
|
|
51
|
+
own, so seeking is exact.
|
|
52
|
+
- Expose `window.smDemo = { duration: 30, seek(t), play(), pause() }`, where `seek(t)` renders
|
|
53
|
+
the exact frame for time `t` in seconds, independent of whatever played before it.
|
|
54
|
+
- Autoplays once on load; shows play/pause, restart, and a progress bar.
|
|
55
|
+
- Optional narration audio (see `<audio_policy>`); the video must still make sense muted.
|
|
56
|
+
- No network: no `fetch`, `XMLHttpRequest`, `WebSocket`, `import()`, or `<iframe>`. No external
|
|
57
|
+
fonts or images — system font stack only, and any images as `data:` URIs.
|
|
58
|
+
- Respects `prefers-reduced-motion` by rendering the scenes as a static, steppable storyboard
|
|
59
|
+
instead of animating them.
|
|
60
|
+
- Under 2 MB total.
|
|
61
|
+
- A light/dark neutral palette with sufficient contrast in both.
|
|
62
|
+
</output_contract>
|
|
63
|
+
|
|
64
|
+
<audio_policy>
|
|
65
|
+
Narrate the storyboard captions with a short, pleasant on-device voice track — optional, never
|
|
66
|
+
block the video on it. Generate it at build time, not at playback time; the shipped document
|
|
67
|
+
never calls out to a network TTS service.
|
|
68
|
+
|
|
69
|
+
- Use **Piper** (`pip install piper-tts`, MIT-licensed, small ONNX voices, no GPU needed) for the
|
|
70
|
+
voice. If `python3 -m pip` isn't on PATH, bootstrap it first: `curl -sS
|
|
71
|
+
https://bootstrap.pypa.io/get-pip.py | python3 - --user --break-system-packages`, then
|
|
72
|
+
`python3 -m pip install --user --break-system-packages piper-tts`. Pull one voice once, e.g.
|
|
73
|
+
`en_US-amy-medium` from `https://huggingface.co/rhasspy/piper-voices` (`.onnx` + `.onnx.json`).
|
|
74
|
+
Kokoro-82M (Apache-2.0) sounds a step better but needs PyTorch and a much larger model
|
|
75
|
+
download — prefer it only when you have the time/bandwidth budget for it.
|
|
76
|
+
- Synthesize one short line per scene (`python3 -m piper -m <voice>.onnx -c <voice>.onnx.json -f
|
|
77
|
+
sceneN.wav`), sized to fit that scene's on-screen hold time. Lay the scene clips onto one
|
|
78
|
+
mono 22050 Hz track at each scene's start offset, encode the result with `ffmpeg -ar 16000 -c:a
|
|
79
|
+
libmp3lame -b:a 20k` (mono, ~16 kbps is plenty for speech and keeps the whole track under
|
|
80
|
+
~80 KB), then base64 it into a single `<audio src="data:audio/mpeg;base64,...">` tag. Keep the
|
|
81
|
+
whole document — markup plus audio — under the 2 MB cap.
|
|
82
|
+
- Wire `play()`/`pause()`/`seek(t)` to the `<audio>` element too (`audio.currentTime = t` on
|
|
83
|
+
seek) so the narration never drifts from the visual clock, and start muted-fallback: call
|
|
84
|
+
`.play()` on load, and on rejection (autoplay-blocked browsers) show a small "tap for sound"
|
|
85
|
+
button instead of failing silently forever.
|
|
86
|
+
- Never write the literal pattern `function (` or `function(` in the inline `<script>` —
|
|
87
|
+
`project_demo_video_write`'s safety scanner blocks anything matching `/\bFunction\s*\(/i` to
|
|
88
|
+
stop dynamic `Function(...)` eval, and it cannot tell your IIFE apart from that. Use arrow
|
|
89
|
+
functions (`() => { ... }`) throughout instead.
|
|
90
|
+
- If pip/network/piper isn't available in this environment, skip audio entirely and ship the
|
|
91
|
+
silent video rather than failing the whole run — audio is a nice-to-have, never a blocker.
|
|
92
|
+
</audio_policy>
|
|
93
|
+
|
|
94
|
+
<process>
|
|
95
|
+
1. Read, with a bounded pass: the manifest, the README or top-level docs index, the top-level
|
|
96
|
+
directory tree, and `git log --oneline -30` for a sense of recent direction. Stop once you
|
|
97
|
+
have enough to describe the project honestly.
|
|
98
|
+
2. Write the claims list: for every goal or feature you plan to show, note the source you read
|
|
99
|
+
it from. Drop anything without a source.
|
|
100
|
+
3. Write the storyboard per `<storyboard>`, with scene timings summing to exactly 30 seconds.
|
|
101
|
+
4. Build the HTML per `<output_contract>`, attempting narration per `<audio_policy>`.
|
|
102
|
+
5. Self-check before saving: scene durations sum to 30, every caption traces to a claim in your
|
|
103
|
+
list, and the document contains none of the forbidden network APIs.
|
|
104
|
+
6. Call `project_demo_video_write` exactly once with `{ html }`. It validates the document and
|
|
105
|
+
writes it as the project's Demo Video.
|
|
106
|
+
7. Report back the storyboard as one short list — scene, timing, and the claim behind it.
|
|
107
|
+
</process>
|
|
108
|
+
|
|
109
|
+
<when_things_fail>
|
|
110
|
+
If `project_demo_video_write` rejects the HTML, fix the specific problem it reported and call it
|
|
111
|
+
again — up to 3 attempts total. If `project_demo_video_write` isn't available in this session at
|
|
112
|
+
all, say so plainly and stop; don't try to build a workaround or any tooling of your own in the
|
|
113
|
+
target project.
|
|
114
|
+
</when_things_fail>
|
|
@@ -3,8 +3,9 @@ name: dev-lead
|
|
|
3
3
|
description: Executes exactly one already-scoped PRD at a time, headless, start to finish — reads the PRD's Goal/Acceptance Criteria/Implementation notes and standards.md, implements it, verifies against its own AC, and reports. Has no visibility into the overall plan — that's architect's job. This is the default persona a scheduled PRD runs as: the scheduler resolves a PRD's `agentType` frontmatter field (default `dev-lead`) to this file and launches the headless executor AS this persona via `--append-system-prompt`.
|
|
4
4
|
tools: Read, Grep, Glob, Bash, Edit, Write
|
|
5
5
|
model: sonnet
|
|
6
|
+
effort: medium
|
|
6
7
|
title: Engineering — Software Engineer
|
|
7
|
-
seedVersion:
|
|
8
|
+
seedVersion: 3
|
|
8
9
|
---
|
|
9
10
|
|
|
10
11
|
You are dev-lead. You execute one PRD — nothing above it, nothing beyond it. You don't decide
|
|
@@ -3,41 +3,71 @@ name: project-home-builder
|
|
|
3
3
|
description: Reads a project and writes ONE self-contained overview page (home.html) for its Project Home tab, then saves it with a single project_home_write call.
|
|
4
4
|
tools: Read, Grep, Glob, Bash, Write, Edit
|
|
5
5
|
title: Project Home — Builder
|
|
6
|
-
|
|
6
|
+
model: sonnet
|
|
7
|
+
effort: medium
|
|
8
|
+
seedVersion: 2
|
|
7
9
|
---
|
|
8
10
|
|
|
9
|
-
You are the project-home-builder.
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
11
|
+
You are the project-home-builder. The page you produce is often the first thing a person sees
|
|
12
|
+
when they open this project — they will read it as the project's own description of itself, so
|
|
13
|
+
every sentence on it needs to be something you actually verified by reading the project, not
|
|
14
|
+
something that sounds plausible.
|
|
15
|
+
|
|
16
|
+
<context>
|
|
17
|
+
You run inside a Session Manager Epic for the target project. The HTML you produce is rendered
|
|
18
|
+
inside a sandboxed frame in that project's Project Home tab. It is only regenerated when a human
|
|
19
|
+
deliberately presses the Project Home button — never automatically and never in a loop — so this
|
|
20
|
+
run is the one chance to get it right before a person reads it.
|
|
21
|
+
</context>
|
|
22
|
+
|
|
23
|
+
<grounding_rules>
|
|
24
|
+
Ground every claim in something you read: the project's manifest (`package.json`,
|
|
25
|
+
`pyproject.toml`, or equivalent), its README or docs, its source tree, or its git log. If you
|
|
26
|
+
can't point to where a claim came from, leave it out rather than guess — an omitted section is
|
|
27
|
+
far better than an invented one. Never invent statistics, quotes, screenshots, or features that
|
|
28
|
+
don't exist. Where the project already describes itself well (a tagline, a feature list, a
|
|
29
|
+
mission statement), reuse its own wording instead of paraphrasing.
|
|
30
|
+
</grounding_rules>
|
|
31
|
+
|
|
32
|
+
<page_contents>
|
|
33
|
+
Cover, in whatever order reads best for this specific project:
|
|
34
|
+
|
|
35
|
+
- What it is — a one- or two-sentence description, in the project's own terms where possible.
|
|
36
|
+
- Who it's for — the audience or user the project serves.
|
|
37
|
+
- Key features — 3 to 6 of them, each one tied to a real module, file, or doc you found.
|
|
38
|
+
- Structure — the main directories or modules and what each one does.
|
|
39
|
+
- How to run it — the real install / build / start steps, taken from the README or manifest scripts.
|
|
40
|
+
- Key commands — the commands a contributor actually uses (test, lint, build, etc.).
|
|
41
|
+
</page_contents>
|
|
42
|
+
|
|
43
|
+
<output_contract>
|
|
44
|
+
Produce exactly one complete HTML document:
|
|
45
|
+
- All CSS lives inline in a single `<style>` block — no `<script src="...">`, no
|
|
46
|
+
`<link href="http...">`, no `@import`, and no `url(http...)`.
|
|
47
|
+
- No external fonts or images; nothing the browser needs to fetch over the network.
|
|
48
|
+
- Under 1 MB total.
|
|
49
|
+
- Support both light and dark viewing via `prefers-color-scheme` — pick colors that read well in
|
|
50
|
+
both without needing a toggle.
|
|
51
|
+
- Use semantic headings (`h1`, `h2`, ...) so the page has a real outline, and keep text readable
|
|
52
|
+
at a 1000px-wide viewport.
|
|
53
|
+
</output_contract>
|
|
54
|
+
|
|
55
|
+
<process>
|
|
56
|
+
1. Read, with a bounded pass: the manifest, the README or top-level docs index, the top-level
|
|
57
|
+
directory tree, and `git log --oneline -30` for a sense of recent direction. Stop once you have
|
|
58
|
+
enough to describe the project honestly — you don't need to read every file.
|
|
59
|
+
2. Draft a claims list: for every fact you plan to put on the page, note the source you read it
|
|
60
|
+
from.
|
|
61
|
+
3. Drop any claim from that list that doesn't have a source next to it.
|
|
62
|
+
4. Compose the HTML page from what's left, following `<page_contents>` and `<output_contract>`.
|
|
63
|
+
5. Call `project_home_write` exactly once with `{ html }`. It validates the document and writes
|
|
64
|
+
it as the project's Project Home page.
|
|
65
|
+
6. Report back in one or two lines what the page covers.
|
|
66
|
+
</process>
|
|
67
|
+
|
|
68
|
+
<when_things_fail>
|
|
69
|
+
If `project_home_write` rejects the HTML, fix the specific problem it reported and call it again
|
|
70
|
+
— up to 3 attempts total. If `project_home_write` isn't available in this session at all, say so
|
|
71
|
+
plainly and stop; don't try to build a workaround or any tooling of your own in the target
|
|
72
|
+
project.
|
|
73
|
+
</when_things_fail>
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{ay as d,i as j,ak as $,a3 as g,aj as e,v as E,m as N,X as S,am as T,a4 as b,aC as D,a as p,$ as C,j as v,E as R}from"./index-vx8O73l8.js";import"./monaco-editor-BW5C4Iv1.js";const G=[{key:"diagram",label:"Diagram"},{key:"tables",label:"Tables"}];function M(){const[s,t]=d.useState("diagram"),[a,i]=d.useState(null),[l,n]=d.useState(()=>new Set),c=d.useMemo(()=>j.filter(r=>!l.has(r.group)),[l]),m=d.useMemo(()=>$(c),[c]),o=r=>{n(x=>{const h=new Set(x);return h.has(r)?h.delete(r):h.add(r),h}),i(null)},u=a?g(a):null,y=r=>c.some(x=>x.id===r);return e.jsx(E,{toolbar:e.jsxs(e.Fragment,{children:[e.jsx(S,{options:G,active:s,onChange:t}),e.jsx(O,{hiddenGroups:l,onToggle:o}),e.jsxs("span",{className:"ml-auto text-fg-faint",children:[j.length," entities"]})]}),children:s==="diagram"?e.jsxs("div",{className:"h-full flex",children:[e.jsx("div",{className:"flex-1 min-w-0 overflow-auto",children:e.jsx(V,{layout:m,selectedId:a,onSelect:r=>i(x=>x===r?null:r)})}),e.jsx("div",{className:"w-96 shrink-0 border-l border-line overflow-y-auto",children:u?e.jsx(F,{entity:u,onSelectRelated:r=>y(r)?i(r):void 0}):e.jsx(N,{title:"select an entity",hint:"click a box in the diagram to see its storage, fields, and relations"})})]}):e.jsx(B,{})})}const X=d.memo(M);function O({hiddenGroups:s,onToggle:t}){return e.jsx("div",{className:"flex items-center gap-1.5 flex-wrap",children:v.map(a=>{const i=s.has(a.id);return e.jsxs("button",{onClick:()=>t(a.id),title:`${a.blurb} (${a.realm})`,className:`flex items-center gap-1 px-1.5 py-0.5 rounded border text-[10.5px] ${i?"border-line text-fg-faint opacity-50":"border-line text-fg-dim hover:text-fg"}`,children:[e.jsx("span",{className:`w-1.5 h-1.5 rounded-full ${a.tone.dot}`}),a.label,e.jsx("span",{className:"text-fg-faint",children:a.realm})]},a.id)})})}function V({layout:s,selectedId:t,onSelect:a}){const i=d.useMemo(()=>t?new Set(T(t)):null,[t]),l=n=>!!t&&(n.relation.from===t||n.relation.to===t);return s.boxes.length===0?e.jsx(N,{title:"no entities in view",hint:"toggle a group in the legend to show its entities"}):e.jsxs("div",{className:"relative p-4",style:{width:s.width+32,height:s.height+32},children:[e.jsxs("svg",{width:s.width,height:s.height,className:"absolute left-4 top-4 overflow-visible",children:[s.edges.map(n=>{const c=l(n);return e.jsx("path",{"data-testid":`erd-edge-${n.relation.from}-${n.relation.to}`,d:n.d,fill:"none",className:c?"stroke-accent":"stroke-line",strokeWidth:c?2:1,opacity:t&&!c?.25:1},`${n.relation.from}-${n.relation.to}-${n.relation.label}`)}),s.edges.map(n=>l(n)?e.jsx("text",{x:n.mx,y:n.my,textAnchor:"middle",className:"fill-fg-dim text-[10px]",children:n.relation.label},`label-${n.relation.from}-${n.relation.to}-${n.relation.label}`):null)]}),s.boxes.map(n=>e.jsx(_,{box:n,selected:n.id===t,dimmed:!!t&&n.id!==t&&!(i!=null&&i.has(n.id)),onClick:()=>a(n.id)},n.id))]})}function _({box:s,selected:t,dimmed:a,onClick:i}){const l=g(s.id),n=b(s.group),c=l.fields.slice(0,R),m=l.fields.length-c.length;return e.jsxs("button",{type:"button","data-testid":`erd-box-${s.id}`,onClick:i,className:`absolute text-left rounded border overflow-hidden bg-bg-hi ${t?"border-accent ring-1 ring-accent":"border-line"} ${a?"opacity-30":""}`,style:{left:s.x,top:s.y,width:s.w,height:s.h},children:[e.jsxs("div",{className:"px-2 py-1 border-b border-line flex items-center gap-1.5",children:[e.jsx("span",{className:`w-1.5 h-1.5 rounded-full shrink-0 ${n.tone.dot}`}),e.jsx("span",{className:"text-[11px] font-semibold text-fg truncate",children:l.name})]}),l.aka&&e.jsx("div",{className:"px-2 pt-0.5 text-[9.5px] text-fg-faint truncate",children:l.aka}),e.jsxs("div",{className:"px-2 py-0.5",children:[c.map(o=>e.jsxs("div",{className:"text-[9.5px] font-mono text-fg-dim truncate flex items-center gap-1",children:[o.key&&e.jsx("span",{className:"text-fg-faint",children:o.key}),e.jsx("span",{className:"truncate",children:o.name})]},o.name)),m>0&&e.jsxs("div",{className:"text-[9.5px] text-fg-faint italic",children:["+",m," more"]})]})]})}function w({fields:s}){return e.jsxs("table",{className:"w-full text-[11px] font-mono",children:[e.jsx("thead",{className:"text-fg-faint uppercase tracking-wide text-[9.5px]",children:e.jsxs("tr",{className:"border-b border-line",children:[e.jsx("th",{className:"text-left font-normal px-2 py-1",children:"name"}),e.jsx("th",{className:"text-left font-normal px-2 py-1",children:"type"}),e.jsx("th",{className:"text-left font-normal px-2 py-1",children:"key"}),e.jsx("th",{className:"text-left font-normal px-2 py-1",children:"note"})]})}),e.jsx("tbody",{children:s.map(t=>e.jsxs("tr",{className:"border-b border-line/50",children:[e.jsxs("td",{className:"px-2 py-1 text-fg",children:[t.name,t.optional&&e.jsx("span",{className:"text-fg-faint",children:"?"})]}),e.jsx("td",{className:"px-2 py-1 text-fg-dim",children:t.type}),e.jsx("td",{className:"px-2 py-1",children:t.key&&e.jsxs(p,{tone:t.key==="pk"?"accent":"dim",children:[t.key,t.ref?` → ${t.ref}`:""]})}),e.jsx("td",{className:"px-2 py-1 text-fg-faint",children:t.note})]},t.name))})]})}function k({entity:s}){return e.jsxs("div",{className:"space-y-1 text-[11px]",children:[e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx("span",{className:"text-fg-faint w-20 shrink-0",children:"path"}),e.jsx("span",{className:"font-mono text-fg-dim break-all",children:s.store.path})]}),e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx("span",{className:"text-fg-faint w-20 shrink-0",children:"format"}),e.jsx("span",{className:"font-mono text-fg-dim",children:s.store.format})]}),s.store.writer&&e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx("span",{className:"text-fg-faint w-20 shrink-0",children:"writer"}),e.jsxs(p,{tone:"accent",children:["single-writer: ",s.store.writer]})]}),e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx("span",{className:"text-fg-faint w-20 shrink-0",children:"definedIn"}),e.jsx("span",{className:"font-mono text-fg-dim break-all",children:s.store.definedIn})]})]})}function F({entity:s,onSelectRelated:t}){const a=b(s.group),i=D(s.id);return e.jsxs("div",{className:"p-3 space-y-3",children:[e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx("span",{className:`w-2 h-2 rounded-full ${a.tone.dot}`}),e.jsx("span",{className:"text-sm font-semibold text-fg",children:s.name})]}),s.aka&&e.jsx("div",{className:"text-[10.5px] text-fg-faint",children:s.aka}),e.jsx(p,{tone:"dim",className:"mt-1",children:a.label})]}),e.jsx("div",{className:"text-xs text-fg-dim leading-relaxed",children:s.summary}),e.jsxs("div",{children:[e.jsx(f,{children:"storage"}),e.jsx(k,{entity:s})]}),e.jsxs("div",{children:[e.jsx(f,{children:"fields"}),e.jsx(w,{fields:s.fields})]}),s.notes&&s.notes.length>0&&e.jsxs("div",{children:[e.jsx(f,{children:"notes"}),e.jsx("ul",{className:"list-disc pl-4 space-y-0.5 text-xs text-fg-dim",children:s.notes.map(l=>e.jsx("li",{children:l},l))})]}),e.jsxs("div",{children:[e.jsx(f,{children:"relations"}),i.length===0?e.jsx("div",{className:"text-xs text-fg-faint italic",children:"no relations"}):e.jsx("ul",{className:"space-y-1",children:i.map(l=>{const n=l.from===s.id?l.to:l.from,c=g(n);return e.jsxs("li",{className:"flex items-center gap-1.5 text-xs",children:[e.jsx("span",{className:"font-mono text-fg-faint w-10 shrink-0",children:C(l.cardinality)}),e.jsx("span",{className:"text-fg-dim",children:l.label}),l.via&&e.jsxs("span",{className:"font-mono text-[10px] text-fg-faint",children:["via ",l.via]}),e.jsx("button",{type:"button",onClick:()=>t(n),className:"ml-auto text-accent hover:underline font-mono",children:c.name})]},`${l.from}-${l.to}-${l.label}`)})})]})]})}function f({children:s}){return e.jsx("div",{className:"text-[10.5px] uppercase tracking-wide text-fg-faint mb-1 font-mono",children:s})}function B(){return e.jsx("div",{className:"p-4 space-y-6",children:v.map(s=>{const t=j.filter(a=>a.group===s.id);return t.length===0?null:e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center gap-1.5 mb-2",children:[e.jsx("span",{className:`w-2 h-2 rounded-full ${s.tone.dot}`}),e.jsx("span",{className:"text-xs font-semibold text-fg",children:s.label}),e.jsx("span",{className:"text-[10.5px] text-fg-faint",children:s.realm})]}),e.jsx("div",{className:"grid grid-cols-1 xl:grid-cols-2 gap-3",children:t.map(a=>e.jsxs("div",{className:"border border-line rounded bg-bg-hi p-3 space-y-2",children:[e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"text-sm font-semibold text-fg",children:a.name}),a.aka&&e.jsx("span",{className:"text-[10.5px] text-fg-faint",children:a.aka})]}),e.jsx(p,{tone:"dim",className:"mt-1",children:s.label})]}),e.jsx("div",{className:"text-xs text-fg-dim leading-relaxed",children:a.summary}),e.jsx(k,{entity:a}),e.jsx(w,{fields:a.fields}),a.notes&&a.notes.length>0&&e.jsx("ul",{className:"list-disc pl-4 space-y-0.5 text-xs text-fg-dim",children:a.notes.map(i=>e.jsx("li",{children:i},i))})]},a.id))})]},s.id)})})}export{X as DataModel};
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
import{ay as d,aV as X,aN as z,aX as H,aP as N,al as W,ap as q,af as G,aj as e,m as w,v as D,P as A,X as Q,aF as U}from"./index-vx8O73l8.js";import{S as Y}from"./ScopeSwitcher-CnAzTBrl.js";import{S as Z}from"./SaveBar-rimJem-Y.js";import{P as ee}from"./Library-Dv_EtIMr.js";import{u as te,E as se,s as re}from"./settingsSchema-D6iRguNV.js";import"./monaco-editor-BW5C4Iv1.js";const ne=["allow","deny","ask"];function ae(r){if(r.trim()==="")return{perms:{},full:{},err:null};try{const n=JSON.parse(r);return{perms:n.permissions??{},full:n,err:null}}catch(n){return{perms:{},full:{},err:n.message}}}function oe(r,n){const a={...r,permissions:n};return JSON.stringify(a,null,2)+`
|
|
2
|
-
`}function ie(){const r=X(),n=z(),a=(n==null?void 0:n.cwd)??null,s=H(t=>t.navFace),i=d.useRef(!1),u=d.useRef(s),[p,c]=d.useState(()=>s==="project"&&a?"project":"user"),[m,P]=d.useState("effective");d.useEffect(()=>{if(u.current!==s){if(u.current=s,i.current){i.current=!1;return}c(s==="project"&&a?"project":"user")}},[s,a]),d.useEffect(()=>{s==="project"&&m==="presets"&&P("effective")},[s,m]);const J=t=>{i.current=!0,c(t)},b=te(A,r,a),f=b[p]??null,j=N(t=>t.files),E=N(t=>t.setDraft),O=N(t=>t.saveJson),F=N(t=>t.revert),[I,y]=d.useState(null),k=e.jsx(Q,{options:[{key:"effective",label:"Effective"},{key:"rules",label:"Rules"},...s==="home"?[{key:"presets",label:"Presets"}]:[]],active:m,onChange:P}),M=d.useMemo(()=>{const t=W(q(j,b));return G(t,["permissions"])??{kind:"object",children:{}}},[j,b]),$=(t,l)=>{var R;const o=b[p];if(!o)return;y(null);const g=((R=j[o])==null?void 0:R.draftRaw)??"";let v={};if(g.trim())try{v=JSON.parse(g)}catch{v={}}const B=U(v.permissions??{},t,l),K={...v,permissions:B};E(o,JSON.stringify(K,null,2)+`
|
|
3
|
-
`)};if(!r)return e.jsx(w,{title:"loading…"});if(m==="presets")return e.jsx(D,{toolbar:k,children:e.jsx(ee,{})});const C=t=>t!=="user"&&!a,h=f?j[f]:null,{perms:x,full:L,err:T}=h?ae(h.draftRaw):{perms:{},full:{},err:null},S=t=>{f&&(y(null),E(f,oe(L,t)))},_=(t,l)=>{const o=l.trim();if(!o)return;const g=x[t]??[];g.includes(o)||S({...x,[t]:[...g,o]})},V=(t,l)=>{const o=x[t]??[];S({...x,[t]:o.filter((g,v)=>v!==l)})};return e.jsx(D,{toolbar:e.jsxs(e.Fragment,{children:[k,e.jsx("span",{className:"mx-2 text-fg-faint",children:"·"}),e.jsx(Y,{scopes:A.scopes,active:p,onChange:J,annotate:t=>{if(C(t))return{exists:!1};const l=b[t];if(!l)return null;const o=j[l];return{exists:(o==null?void 0:o.exists)??!1,dirty:(o==null?void 0:o.dirty)??!1}}}),e.jsx("span",{className:"ml-3 text-fg-faint truncate",children:f??"—"}),e.jsx("div",{className:"flex-1"}),e.jsx("a",{href:"https://code.claude.com/docs/en/settings#permissions",target:"_blank",rel:"noreferrer",className:"text-fg-faint hover:text-fg-dim underline-offset-2 hover:underline",children:"rule syntax ↗"})]}),footer:f&&h?e.jsx(Z,{dirty:h.dirty,busy:h.busy,parseError:I||T||h.parseError,lastSavedAt:h.lastSavedAt,onSave:async()=>{y(null);const t=await O(f);t.ok||y(t.error??"save failed")},onRevert:()=>{y(null),F(f)}}):null,children:C(p)?e.jsx(w,{title:"no active project",hint:"open a tab in a project directory to edit project or local permissions"}):m==="effective"?e.jsx(se,{node:M,targetScope:p,onOverride:$,schema:re().rootedAt(["permissions"]),rootLabel:"permissions"}):f&&h?e.jsxs("div",{className:"p-4 space-y-5 max-w-3xl",children:[e.jsx(le,{value:x.defaultMode??"default",onChange:t=>S({...x,defaultMode:t})}),ne.map(t=>e.jsx(ce,{list:t,rules:x[t]??[],onAdd:l=>_(t,l),onRemove:l=>V(t,l)},t)),e.jsx(de,{dirs:x.additionalDirectories??[],onChange:t=>S({...x,additionalDirectories:t})})]}):e.jsx(w,{title:"resolving…"})})}const ge=d.memo(ie);function le({value:r,onChange:n}){const a=["default","acceptEdits","plan","bypassPermissions"];return e.jsxs("section",{children:[e.jsx("h3",{className:"text-xs text-fg uppercase tracking-wider mb-2",children:"Default Mode"}),e.jsx("div",{className:"inline-flex rounded border border-line overflow-hidden",children:a.map(s=>e.jsx("button",{onClick:()=>n(s),className:`px-2.5 py-1 text-xs transition-colors ${r===s?"bg-bg-hi text-fg":"bg-bg-elev text-fg-dim hover:text-fg hover:bg-bg-hi"}`,children:s},s))})]})}function ce({list:r,rules:n,onAdd:a,onRemove:s}){const[i,u]=d.useState(""),p=r==="allow"?"text-green-400":r==="deny"?"text-red-400":"text-yellow-400";return e.jsxs("section",{children:[e.jsx("h3",{className:`text-xs uppercase tracking-wider mb-2 ${p}`,children:r}),e.jsxs("div",{className:"flex gap-2 mb-2",children:[e.jsx("input",{value:i,onChange:c=>u(c.target.value),onKeyDown:c=>{c.key==="Enter"&&(a(i),u(""))},placeholder:r==="allow"?"e.g. Bash(ls:*) or Read(~/.claude/**)":"e.g. Write(/etc/**)",className:"flex-1 bg-bg-elev border border-line rounded px-2 py-1 text-xs text-fg placeholder-fg-faint"}),e.jsx("button",{onClick:()=>{a(i),u("")},disabled:!i.trim(),className:"px-2.5 py-1 border border-line rounded text-xs text-fg-dim hover:text-fg hover:bg-bg-hi disabled:opacity-40",children:"add"})]}),n.length===0?e.jsx("div",{className:"text-fg-faint text-xs",children:"no rules"}):e.jsx("ul",{className:"space-y-0.5",children:n.map((c,m)=>e.jsxs("li",{className:"flex items-center gap-2 text-xs font-mono bg-bg-elev border border-line rounded px-2 py-1",children:[e.jsx("span",{className:"flex-1 text-fg-dim truncate",children:c}),e.jsx("button",{onClick:()=>s(m),className:"text-fg-faint hover:text-red-400",title:"remove",children:"×"})]},`${m}-${c}`))})]})}function de({dirs:r,onChange:n}){const[a,s]=d.useState("");return e.jsxs("section",{children:[e.jsx("h3",{className:"text-xs text-fg uppercase tracking-wider mb-2",children:"Additional Directories"}),e.jsx("div",{className:"flex gap-2 mb-2",children:e.jsx("input",{value:a,onChange:i=>s(i.target.value),onKeyDown:i=>{i.key==="Enter"&&a.trim()&&(n([...r,a.trim()]),s(""))},placeholder:"/absolute/path/to/dir",className:"flex-1 bg-bg-elev border border-line rounded px-2 py-1 text-xs text-fg placeholder-fg-faint"})}),e.jsx("ul",{className:"space-y-0.5",children:r.map((i,u)=>e.jsxs("li",{className:"flex items-center gap-2 text-xs font-mono bg-bg-elev border border-line rounded px-2 py-1",children:[e.jsx("span",{className:"flex-1 text-fg-dim truncate",children:i}),e.jsx("button",{onClick:()=>n(r.filter((p,c)=>c!==u)),className:"text-fg-faint hover:text-red-400",children:"×"})]},`${u}-${i}`))})]})}export{ge as Permissions};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{a0 as P,aV as G,ay as x,aj as i,Z as R,B as T,a as _}from"./index-vx8O73l8.js";import{a as j,C as B,c as E,d as L,b as I}from"./Library-Dv_EtIMr.js";const O=e=>`${e}/.claude/session-manager/provenance.json`;function D(e){if(!e||typeof e!="object")return{};const t={};for(const[n,o]of Object.entries(e))(o==="anthropic"||o==="community"||o==="local")&&(t[n]=o);return t}const K=P((e,t)=>({overrides:{},loaded:!1,loading:!1,home:null,load:async n=>{const o=t();if(!(o.home===n&&(o.loaded||o.loading))){e({home:n,loading:!0});try{const r=await window.api.config.readJson(O(n)),d=r.exists?D(r.data):{};e(h=>({overrides:{...d,...h.overrides},loaded:!0,loading:!1}))}catch{e({loaded:!0,loading:!1})}}},setOverride:async(n,o)=>{const r={...t().overrides};o===null?delete r[n]:r[n]=o,e({overrides:r});const d=t().home;if(d)try{await window.api.config.writeJson(O(d),r)}catch{}}})),a=e=>(e??"").toLowerCase().trim(),S=new Set,$=new Set;for(const e of I){const t=e.official?S:$;t.add(a(e.id)),t.add(a(e.name))}const H=new Set(L.filter(e=>e.official).flatMap(e=>[a(e.id),a(e.name)])),V=new Set(L.filter(e=>!e.official).flatMap(e=>[a(e.id),a(e.name)])),J=new Set(E.filter(e=>e.official).flatMap(e=>[a(e.id),a(e.name)])),U=new Set(E.filter(e=>!e.official).flatMap(e=>[a(e.id),a(e.name)])),z=new Set(B.flatMap(e=>[a(e.id),a(e.name)])),Z=new Set(j.flatMap(e=>[a(e.id),a(e.name)])),q=new Set(j.map(e=>e.command.trim())),F=new Set(["security-review","pr-comments","release-notes","add-dir","code-review","simplify"]),Q=/(@anthropic-ai\/|anthropic\.com|github\.com\/anthropics)/i,W=/(^|\s)(npx|uvx|pipx|bunx|mcp-remote|deno\s+run|docker\s+run)(\s|$)/i;function X(e){return[e.command,...e.args??[],e.url,e.repository,e.homepage].filter(Boolean).join(" ").toLowerCase()}const l=e=>({provenance:"anthropic",reason:e}),y=e=>({provenance:"community",reason:e});function Y(e,t,n){switch(e){case"mcp":return S.has(t)?l("official MCP server (catalog)"):$.has(t)?y("third-party server (catalog)"):null;case"skill":case"command":return H.has(t)?l("official Anthropic skill (catalog)"):V.has(t)?y("third-party skill (catalog)"):null;case"plugin":return J.has(t)?l("official Anthropic plugin (catalog)"):U.has(t)?y("third-party plugin (catalog)"):null;case"subagent":return z.has(t)?l("bundled Anthropic subagent (catalog)"):null;case"hook":return Z.has(t)||n&&q.has(n.trim())?l("bundled hook (catalog)"):null}}function ee(e,t){return e.repository?"has a source repository":e.homepage?"has a homepage":e.url?"remote endpoint":W.test(t)?"installed from a package registry":null}function te(e){const t=a(e.name),n=X(e),o=Y(e.type,t,e.command);if(o)return o;if((e.type==="command"||e.type==="skill")&&F.has(t))return l("built-in Claude Code command");if(Q.test(n))return l("Anthropic package or repo");const r=ee(e,n);return r?y(r):{provenance:"local",reason:"no external source — assumed self-created"}}function ne(e,t,n){return`${e}:${t??"-"}:${n}`}const c={anthropic:"Anthropic",community:"Community",local:"Local"},N={anthropic:"accent",community:"warn",local:"dim"},oe=["anthropic","community","local"];function se({input:e,scope:t,interactive:n=!0,className:o=""}){const r=G(),{overrides:d,load:h,setOverride:k}=K(),[v,m]=x.useState(!1),w=x.useRef(null);x.useEffect(()=>{r&&h(r)},[r,h]),x.useEffect(()=>{if(!v)return;const s=C=>{w.current&&!w.current.contains(C.target)&&m(!1)},g=C=>{C.key==="Escape"&&m(!1)};return window.addEventListener("mousedown",s),window.addEventListener("keydown",g),()=>{window.removeEventListener("mousedown",s),window.removeEventListener("keydown",g)}},[v]);const b=ne(e.type,t??null,e.name),f=te(e),p=d[b],u=p??f.provenance,M=p?`Origin manually set to ${c[u]} — auto-detected ${c[f.provenance]} (${f.reason})`:`Auto-detected ${c[u]}: ${f.reason}`,A=i.jsxs(_,{tone:N[u],title:M,className:`${n?"cursor-pointer hover:brightness-125":""} ${o}`,children:[c[u],p&&i.jsx("span",{className:"w-1 h-1 rounded-full bg-current opacity-70","aria-hidden":!0})]});return n?i.jsxs("span",{ref:w,className:"relative inline-flex",children:[i.jsx("button",{type:"button",onClick:s=>{s.stopPropagation(),m(g=>!g)},className:"inline-flex","aria-label":`Origin: ${c[u]}. Click to change.`,children:A}),v&&i.jsxs("span",{className:`absolute ${R.dialog} top-full right-0 mt-1 min-w-[7.5rem] rounded-md border border-line bg-bg-elev shadow-lg py-1 text-left`,onClick:s=>s.stopPropagation(),children:[i.jsx("span",{className:"block px-2 pb-1 text-[10px] uppercase tracking-wide text-fg-faint",children:"Mark origin as"}),oe.map(s=>i.jsxs("button",{type:"button",onClick:()=>{k(b,s),m(!1)},className:`flex w-full items-center gap-2 px-2 py-1 text-[12px] hover:bg-bg-hi/60 ${u===s?"text-fg":"text-fg-dim"}`,children:[i.jsx("span",{className:`w-2 h-2 rounded-full border ${T[N[s]]}`,"aria-hidden":!0}),c[s],p===s&&i.jsx("span",{className:"ml-auto text-[10px] text-fg-faint",children:"set"})]},s)),i.jsx("div",{className:"my-1 border-t border-line"}),i.jsxs("button",{type:"button",onClick:()=>{k(b,null),m(!1)},disabled:!p,className:"flex w-full items-center gap-2 px-2 py-1 text-[12px] text-fg-dim hover:bg-bg-hi/60 disabled:opacity-40 disabled:hover:bg-transparent",title:`Revert to auto-detection (${c[f.provenance]})`,children:["Auto-detect",i.jsx("span",{className:"ml-auto text-[10px] text-fg-faint",children:c[f.provenance]})]})]})]}):A}export{se as P};
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
import{ay as d,aj as e,S as T,A as Q,m as R,a$ as ee,aY as te,aR as se,d as $,av as ae,aM as ne,aV as re,b3 as H,aX as le,aP as M,al as ie,ap as oe,v as ce,J as de,X as ue,H as G,aF as xe}from"./index-vx8O73l8.js";import{S as pe}from"./ScopeSwitcher-CnAzTBrl.js";import{S as V}from"./SaveBar-rimJem-Y.js";import{u as me,s as B,E as fe}from"./settingsSchema-D6iRguNV.js";import{T as L}from"./Toggle-6Jl5Njc6.js";import"./monaco-editor-BW5C4Iv1.js";const he=[{id:"essentials",title:"Essentials",summary:"The knobs you reach for first.",keys:["model","language","outputStyle","permissions"]},{id:"git",title:"Git & Commits",summary:"How Claude writes commits and pull requests on your behalf.",keys:["attribution","includeGitInstructions","includeCoAuthoredBy"]},{id:"memory",title:"Memory & Plans",summary:"Context Claude keeps between sessions and where it files plans.",keys:["autoMemoryEnabled","plansDirectory","claudeMdExcludes","respectGitignore"]},{id:"model",title:"Model & Reasoning",summary:"Model allow/override lists, reasoning depth, and fast-mode toggles — machine-wide, with no per-Epic override yet. An Epic's Agent persona model (Agent Library) still wins over Essentials' plain model default.",advanced:!0,keys:["availableModels","modelOverrides","effortLevel","fastMode","fastModePerSessionOptIn","alwaysThinkingEnabled","fallbackModel","enforceAvailableModels","teammateDefaultModel","advisorModel"]},{id:"interface",title:"Interface",summary:"Visual polish — spinners, progress bars, motion.",keys:["spinnerTipsEnabled","spinnerTipsOverride","spinnerVerbs","terminalProgressBarEnabled","showTurnDuration","prefersReducedMotion","companyAnnouncements","statusLine","teammateMode"]},{id:"updates",title:"Updates & Cleanup",summary:"Release channel and how long transcripts stick around.",keys:["autoUpdatesChannel","cleanupPeriodDays"]},{id:"env",title:"Environment & Auth",summary:"Environment variables and auth-helper scripts.",keys:["env","apiKeyHelper","awsCredentialExport","awsAuthRefresh"]},{id:"hooks",title:"Hooks",summary:"Scripts Claude runs before/after tool use.",keys:["hooks","disableAllHooks","allowedHttpHookUrls","httpHookAllowedEnvVars"]},{id:"mcp",title:"MCP Servers",summary:"External tool providers Claude can talk to.",keys:["enableAllProjectMcpServers","enabledMcpjsonServers","disabledMcpjsonServers"]},{id:"plugins",title:"Plugins",summary:"Installed plugins, marketplaces, and per-plugin configuration.",keys:["enabledPlugins","extraKnownMarketplaces","skippedPlugins","skippedMarketplaces","pluginConfigs"]},{id:"filesystem",title:"File Picker & Sandbox",summary:"How Claude browses files and the sandbox it runs in.",keys:["fileSuggestion","sandbox","worktree"]},{id:"login",title:"Login",summary:"Which login method to force on startup.",keys:["forceLoginMethod","forceLoginOrgUUID"]},{id:"feedback",title:"Feedback",summary:"Session-quality surveys.",keys:["feedbackSurveyRate"]},{id:"advanced",title:"Advanced / Enterprise",summary:"Managed-settings-only keys and enterprise allow/denylists.",advanced:!0,keys:["allowedMcpServers","deniedMcpServers","allowManagedHooksOnly","allowManagedPermissionRulesOnly","allowManagedMcpServersOnly","strictKnownMarketplaces","blockedMarketplaces","pluginTrustMessage","otelHeadersHelper","skipWebFetchPreflight"]}],ge={mcp:"MCP",url:"URL",urls:"URLs",http:"HTTP",ui:"UI",id:"ID",uuid:"UUID",api:"API",aws:"AWS",otel:"OTel",json:"JSON"};function W(s){return s.replace(/^\$/,"").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/([A-Z]+)([A-Z][a-z])/g,"$1 $2").toLowerCase().split(/\s+/).filter(Boolean).map((l,n)=>{const r=ge[l];return r||(n===0?l.charAt(0).toUpperCase()+l.slice(1):l)}).join(" ")}function q(s){const a=new Set,t=[];for(const n of he){const r=n.keys.filter(i=>s.has(i));r.forEach(i=>a.add(i)),r.length!==0&&t.push({id:n.id,title:n.title,summary:n.summary,advanced:!!n.advanced,keys:r})}const l=Array.from(s).filter(n=>!a.has(n)&&n!=="$schema").sort();return l.length>0&&t.push({id:"other",title:"Other",summary:"Keys not yet grouped.",advanced:!1,keys:l}),t}function be(s,a){return q(s).map(t=>({id:t.id,title:t.title,advanced:t.advanced,total:t.keys.length,setCount:t.keys.filter(l=>a.has(l)).length}))}const ye={};function z(s,a){if(a)return{text:a,authored:!1};const t=ye[s];return t?{text:t,authored:!0}:null}const je={essentials:"star",git:"link",memory:"memory",model:"sparkle",interface:"eye",updates:"reload",env:"keys",hooks:"hooks",mcp:"mcp",plugins:"plugins",filesystem:"folder",login:"lock",feedback:"send",advanced:"shield",other:"dot"},ve=["user","project","local","default"],Ne={user:"user",project:"project",local:"local",default:"default"};function we({node:s,targetScope:a,onOverride:t,schema:l}){const[n,r]=d.useState(""),[i,p]=d.useState(!1),[m,v]=d.useState(!0),x=s.kind==="object"?s:null,w=x?Object.keys(x.children):[],g=l.rootKeys(),y=new Set([...w,...g]),u=d.useMemo(()=>q(y),[Array.from(y).sort().join(",")]),b=d.useMemo(()=>be(y,new Set(w)),[Array.from(y).sort().join(","),w.join(",")]),[C,E]=d.useState(null),f=d.useRef(null),S=o=>{const j=u.find(N=>N.id===o);j!=null&&j.advanced&&!i&&p(!0),E(o)};d.useEffect(()=>{if(!C)return;E(null);const o=f.current,j=document.getElementById(`settings-group-${C}`);if(!o||!j)return;const N=j.getBoundingClientRect().top-o.getBoundingClientRect().top;o.scrollBy({top:N,behavior:"smooth"})},[C]);const k=d.useMemo(()=>u.filter(o=>i||!o.advanced).map(o=>({...o,keys:o.keys.filter(j=>{const N=(x==null?void 0:x.children[j])!==void 0;if(!m&&!N)return!1;if(!n.trim())return!0;const h=l.at([j]);return[j,W(j),(h==null?void 0:h.description)??""].join(" ").toLowerCase().includes(n.toLowerCase())})})).filter(o=>o.keys.length>0),[u,n,i,m,x,l]);return e.jsxs("div",{className:"h-full flex flex-col",children:[e.jsxs("div",{className:"shrink-0 border-b border-line bg-bg-elev px-3 py-1.5 flex items-center gap-3 text-xs",children:[e.jsxs("span",{className:"text-fg-faint",children:["writing overrides to"," ",e.jsx("span",{className:"text-fg-dim font-medium",children:T[a].label})]}),e.jsxs("label",{className:"flex items-center gap-1 text-fg-faint cursor-pointer",children:[e.jsx("input",{type:"checkbox",checked:m,onChange:o=>v(o.target.checked),className:"accent-accent"}),"show not-yet-configured"]}),e.jsxs("label",{className:"flex items-center gap-1 text-fg-faint cursor-pointer",children:[e.jsx("input",{type:"checkbox",checked:i,onChange:o=>p(o.target.checked),className:"accent-accent"}),"show advanced"]}),e.jsx("div",{className:"flex-1"}),e.jsx("input",{value:n,onChange:o=>r(o.target.value),placeholder:"search settings…",className:"bg-bg border border-line rounded px-2 py-1 text-xs text-fg w-64"})]}),e.jsxs("div",{className:"flex-1 flex overflow-hidden",children:[e.jsx(Se,{groups:b,onJump:S}),e.jsxs("div",{ref:f,className:"flex-1 overflow-auto py-3",children:[k.map(o=>e.jsx(ke,{id:o.id,title:o.title,summary:o.summary,advanced:o.advanced,children:o.keys.map(j=>{const N=x==null?void 0:x.children[j],h=l.at([j]);return e.jsx(Ce,{keyName:j,node:N,info:h,targetScope:a,onOverride:(c,O)=>t([j],c,O)},j)})},o.id)),k.length===0&&e.jsxs("div",{className:"px-6 py-12 text-center text-fg-faint text-sm",children:['no settings match "',n,'"']})]})]})]})}function Se({groups:s,onJump:a}){return e.jsx("nav",{className:"shrink-0 w-48 border-r border-line bg-bg-elev/30 overflow-y-auto py-3",children:s.map(t=>e.jsxs("button",{onClick:()=>a(t.id),className:"w-full flex items-center gap-2 px-3 py-2 text-left hover:bg-bg-hi transition-colors",title:`jump to ${t.title}`,children:[e.jsx(Q,{name:je[t.id]??"dot",size:15,className:"text-fg-faint shrink-0"}),e.jsx("span",{className:"flex-1 min-w-0 truncate text-xs text-fg-dim",children:t.title}),e.jsxs("span",{className:"text-[10px] text-fg-faint font-mono shrink-0",children:[t.setCount,"/",t.total]})]},t.id))})}function ke({id:s,title:a,summary:t,advanced:l,children:n}){const[r,i]=d.useState(!0);return e.jsxs("section",{id:`settings-group-${s}`,className:"mx-4 mb-4 rounded-lg border border-line shadow-sm bg-bg-elev/50 overflow-hidden",children:[e.jsxs("header",{className:"px-4 py-3 bg-bg-elev cursor-pointer hover:bg-bg-hi flex items-center gap-3 border-b border-line",onClick:()=>i(!r),children:[e.jsx("span",{className:"text-fg-faint w-3",children:r?"▾":"▸"}),e.jsxs("div",{className:"flex-1",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("h2",{className:"text-fg text-base font-semibold",children:a}),l&&e.jsx("span",{className:"text-[9px] px-1.5 py-0 rounded border border-yellow-900/40 bg-yellow-950/30 text-yellow-500/80 uppercase tracking-wide",children:"advanced"})]}),e.jsx("p",{className:"text-fg-dim text-sm mt-0.5",children:t})]})]}),r&&e.jsx("div",{className:"divide-y divide-line/60",children:n})]})}function Ce({keyName:s,node:a,info:t,targetScope:l,onOverride:n}){const[r,i]=d.useState(!1),[p,m]=d.useState(!1),v=W(s),x=a!==void 0,g=(a==null?void 0:a.kind)==="leaf"?a:null,y=(a==null?void 0:a.kind)==="object"||(a==null?void 0:a.kind)==="array",u=t==null?void 0:t.default,b=g&&u!==void 0&&X(g.value,u),C=De({isSet:x,leafNode:g,defaultVal:u,isDefault:!!b,node:a}),E=Ee(g,u),f=E.length>=2,S=!!g&&!b,k=z(s,t==null?void 0:t.description);return e.jsx("div",{className:"px-4 py-3 hover:bg-bg-elev/20",children:e.jsxs("div",{className:"flex items-start gap-3",children:[e.jsx("button",{onClick:()=>i(!r),className:"text-fg-faint hover:text-fg w-3 mt-0.5",title:r?"collapse":"expand",children:r?"▾":"▸"}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsxs("div",{className:"flex items-baseline gap-2 flex-wrap",children:[e.jsx("h3",{className:"text-fg text-sm",children:v}),e.jsx(Ie,{kind:C.kind,label:C.label}),f&&e.jsxs("button",{onClick:o=>{o.stopPropagation(),r||i(!0),m(j=>!j)},className:"text-[9px] px-1.5 py-0 rounded border border-blue-900/40 bg-blue-950/30 text-blue-300/90 uppercase tracking-wide hover:bg-blue-900/40",title:"this key is defined in multiple scopes — click to expand",children:["drift · ",E.map(o=>Ne[o]).join(" · ")]}),S&&g&&e.jsx("button",{onClick:o=>{o.stopPropagation(),n(void 0,g.winner)},className:"text-[9px] px-1.5 py-0 rounded border border-line bg-bg-elev text-fg-faint uppercase tracking-wide hover:text-fg hover:bg-bg-hi",title:`reset · delete from ${T[g.winner].label}`,children:"↺ reset"}),(t==null?void 0:t.deprecated)&&e.jsx("span",{className:"text-[9px] px-1 py-0 rounded border border-yellow-900/40 bg-yellow-950/30 text-yellow-500/80 uppercase tracking-wide",children:"deprecated"}),(t==null?void 0:t.required)&&!x&&e.jsx("span",{className:"text-[9px] px-1 py-0 rounded border border-red-900/40 bg-red-950/30 text-red-400/80 uppercase tracking-wide",children:"required"})]}),k&&e.jsx("p",{className:`text-fg-dim text-xs mt-0.5 leading-relaxed ${k.authored?"inline-block border-b border-dotted border-fg-faint/70 cursor-help":""}`,title:k.authored?"In-app-authored description — not from the official Claude Code schema":void 0,children:Le(k.text)}),r&&p&&g&&e.jsx(Te,{leaf:g,defaultVal:u,onReset:o=>n(void 0,o)}),r&&e.jsx(Oe,{keyName:s,node:a,info:t,targetScope:l,onOverride:o=>n(o)})]}),e.jsx("div",{className:"shrink-0",children:!r&&e.jsx(Me,{node:a,info:t,onSet:o=>{n(o)},disabled:y&&x})})]})})}function Ee(s,a){if(!s)return[];const t=new Set;t.add(s.winner);for(const l of s.shadowed)t.add(l.scope);return a!==void 0&&t.add("default"),ve.filter(l=>t.has(l))}function Te({leaf:s,defaultVal:a,onReset:t}){const l={};l[s.winner]={value:s.value,winner:!0};for(const n of s.shadowed)l[n.scope]={value:n.value,winner:!1};return e.jsxs("div",{className:"mt-2 border border-line rounded bg-bg-elev/40 text-xs",children:[e.jsx("div",{className:"px-2 py-1 text-fg-faint border-b border-line/60",children:"Values across all scopes (winner highlighted · reset removes that scope's value):"}),e.jsxs("div",{className:"divide-y divide-line/60",children:[["user","project","local"].map(n=>{const r=l[n],i=r!==void 0;return e.jsxs("div",{className:"grid grid-cols-[5rem_1fr_auto] gap-2 px-2 py-1 items-center",children:[e.jsx("span",{className:"text-fg-faint",children:T[n].label}),e.jsx("span",{className:`font-mono truncate ${r!=null&&r.winner?"text-accent":"text-fg-dim"}`,children:i?P(r.value):e.jsx("span",{className:"text-fg-faint",children:"—"})}),i?e.jsx("button",{onClick:()=>t(n),className:"text-[9px] px-1.5 py-0 rounded border border-line text-fg-faint uppercase tracking-wide hover:text-fg hover:bg-bg-hi",title:`delete this key from ${T[n].label}`,children:"↺"}):e.jsx("span",{})]},n)}),e.jsxs("div",{className:"grid grid-cols-[5rem_1fr_auto] gap-2 px-2 py-1 items-center",children:[e.jsx("span",{className:"text-fg-faint",children:"Default"}),e.jsx("span",{className:"font-mono text-fg-dim truncate",children:a!==void 0?P(a):e.jsx("span",{className:"text-fg-faint",children:"—"})}),e.jsx("span",{})]})]})]})}function Oe({keyName:s,node:a,info:t,targetScope:l,onOverride:n}){const i=(a==null?void 0:a.kind)==="leaf"?a:null,p=z(s,t==null?void 0:t.description);return e.jsxs("div",{className:"mt-3 space-y-2 text-xs",children:[p&&e.jsx("p",{className:`text-fg-dim leading-relaxed whitespace-pre-wrap ${p.authored?"inline-block border-b border-dotted border-fg-faint/70 cursor-help":""}`,title:p.authored?"In-app-authored description — not from the official Claude Code schema":void 0,children:p.text}),e.jsxs("dl",{className:"grid grid-cols-[auto_1fr] gap-x-3 gap-y-1 text-fg-faint",children:[(t==null?void 0:t.type)&&e.jsxs(e.Fragment,{children:[e.jsx("dt",{children:"Type"}),e.jsx("dd",{className:"text-fg-dim font-mono",children:Array.isArray(t.type)?t.type.join(" | "):t.type})]}),(t==null?void 0:t.default)!==void 0&&e.jsxs(e.Fragment,{children:[e.jsx("dt",{children:"Default"}),e.jsx("dd",{className:"text-fg-dim font-mono",children:P(t.default)})]}),(t==null?void 0:t.enum)&&e.jsxs(e.Fragment,{children:[e.jsx("dt",{children:"Options"}),e.jsx("dd",{className:"text-fg-dim font-mono",children:t.enum.map(m=>String(m)).join(" | ")})]}),i&&e.jsxs(e.Fragment,{children:[e.jsx("dt",{children:"Current"}),e.jsxs("dd",{className:"font-mono",children:[e.jsx("span",{className:"text-fg-dim",children:P(i.value)}),e.jsxs("span",{className:"ml-2 text-fg-faint",children:["from ",T[i.winner].label]})]})]}),i&&i.shadowed.length>0&&e.jsxs(e.Fragment,{children:[e.jsx("dt",{children:"Shadowed"}),e.jsx("dd",{className:"space-y-0.5",children:i.shadowed.map((m,v)=>e.jsxs("div",{className:"font-mono text-fg-faint line-through",children:[P(m.value)," —"," ",e.jsx("span",{className:"no-underline",children:T[m.scope].label})]},v))})]}),(a==null?void 0:a.kind)==="array"&&e.jsxs(e.Fragment,{children:[e.jsx("dt",{children:"Accumulated"}),e.jsxs("dd",{className:"text-fg-dim",children:[a.items.length," items across all scopes"]})]})]}),e.jsx("div",{className:"pt-2 flex items-center gap-2 flex-wrap border-t border-line/60",children:e.jsx(Ae,{keyName:s,node:a,info:t,onChange:n,targetScope:l})})]})}function Ae({node:s,info:a,onChange:t,targetScope:l}){const r=(s==null?void 0:s.kind)==="leaf"?s.value:a==null?void 0:a.default,i=Y(a==null?void 0:a.type);if(i==="boolean"){const p=r===!0;return e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"text-fg-faint",children:"Set to:"}),e.jsx("div",{className:"inline-flex rounded border border-line overflow-hidden",children:[{v:!0,label:"on"},{v:!1,label:"off"}].map(({v:m,label:v})=>e.jsx("button",{onClick:()=>t(m),className:`px-3 py-0.5 text-xs transition-colors ${p===m?"bg-accent text-bg":"bg-bg-elev text-fg-dim hover:bg-bg-hi hover:text-fg"}`,children:v},v))}),e.jsxs("span",{className:"text-fg-faint",children:["→ ",T[l].label]})]})}return a!=null&&a.enum?e.jsxs("div",{className:"flex items-center gap-2 flex-wrap",children:[e.jsx("span",{className:"text-fg-faint",children:"Choose:"}),a.enum.map(p=>{const m=X(r,p);return e.jsx("button",{onClick:()=>t(p),className:`px-2 py-0.5 text-xs rounded border ${m?"bg-accent text-bg border-accent":"bg-bg-elev text-fg-dim border-line hover:text-fg hover:bg-bg-hi"}`,children:String(p)},String(p))}),e.jsxs("span",{className:"text-fg-faint",children:["→ ",T[l].label]})]}):i==="integer"||i==="number"?e.jsx(Pe,{value:typeof r=="number"?r:void 0,integer:i==="integer",onCommit:t,target:T[l].label}):i==="string"?e.jsx(Re,{value:typeof r=="string"?r:"",onCommit:t,target:T[l].label}):e.jsxs("div",{className:"text-fg-faint",children:["Complex value (",i??"object/array",") — use the"," ",e.jsx("span",{className:"text-fg-dim",children:"Raw"})," tab to edit."]})}function Pe({value:s,integer:a,onCommit:t,target:l}){const[n,r]=d.useState(s!==void 0?String(s):""),i=()=>{const p=a?parseInt(n,10):parseFloat(n);Number.isNaN(p)||t(p)};return e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"text-fg-faint",children:"Set to:"}),e.jsx("input",{type:"number",value:n,onChange:p=>r(p.target.value),onBlur:i,onKeyDown:p=>{p.key==="Enter"&&p.target.blur()},className:"w-24 bg-bg border border-line rounded px-2 py-0.5 text-xs text-fg"}),e.jsxs("button",{onClick:i,className:"px-2 py-0.5 text-xs border border-accent/50 rounded text-accent hover:bg-accent hover:text-bg",children:["save → ",l]})]})}function Re({value:s,onCommit:a,target:t}){const[l,n]=d.useState(s);return e.jsxs("div",{className:"flex items-center gap-2 flex-1 min-w-0",children:[e.jsx("span",{className:"text-fg-faint shrink-0",children:"Set to:"}),e.jsx("input",{type:"text",value:l,onChange:r=>n(r.target.value),onKeyDown:r=>{r.key==="Enter"&&a(l)},className:"flex-1 min-w-0 bg-bg border border-line rounded px-2 py-0.5 text-xs text-fg"}),e.jsxs("button",{onClick:()=>a(l),className:"shrink-0 px-2 py-0.5 text-xs border border-accent/50 rounded text-accent hover:bg-accent hover:text-bg",children:["save → ",t]})]})}function Me({node:s,info:a,onSet:t,disabled:l}){const n=(s==null?void 0:s.kind)==="leaf",r=Y(a==null?void 0:a.type);if(l)return null;if(r==="boolean"){const i=n&&s.value===!0;return e.jsx("button",{onClick:()=>t(!i),className:`px-2.5 py-0.5 text-xs rounded border transition-colors ${i?"bg-accent/15 text-accent border-accent/40 hover:bg-accent hover:text-bg":"bg-bg-elev text-fg-dim border-line hover:text-fg hover:bg-bg-hi"}`,title:"toggle",children:i?"on":"off"})}return null}function De({isSet:s,leafNode:a,defaultVal:t,isDefault:l,node:n}){return s?(n==null?void 0:n.kind)==="array"?{kind:"accumulated",label:`${n.items.length} items`}:(n==null?void 0:n.kind)==="object"?{kind:"set",label:"configured"}:a?l?{kind:"default",label:`= default · ${T[a.winner].label}`}:a.shadowed.length>0?{kind:"override",label:`overriding ${a.shadowed.length} scope(s)`}:{kind:"set",label:`set in ${T[a.winner].label}`}:{kind:"set",label:"configured"}:t!==void 0?{kind:"default",label:`using default: ${P(t)}`}:{kind:"unset",label:"not configured"}}function Ie({kind:s,label:a}){const t={set:"bg-accent/15 text-accent border-accent/30",default:"bg-bg-hi text-fg-dim border-line",unset:"bg-bg-elev text-fg-faint border-line",override:"bg-purple-950/30 text-purple-400/80 border-purple-900/40",accumulated:"bg-blue-950/30 text-blue-400/80 border-blue-900/40"}[s];return e.jsx("span",{className:`text-[9px] px-1.5 py-0 rounded border uppercase tracking-wide ${t}`,children:a})}function Y(s){if(s)return Array.isArray(s)?s.find(t=>t!=="null")??s[0]:s}function X(s,a){return s===a?!0:typeof s!=typeof a?!1:s&&a&&typeof s=="object"?JSON.stringify(s)===JSON.stringify(a):!1}function Le(s){const a=s.trim().split(`
|
|
2
|
-
`)[0],t=a.match(/^([^.!?]+[.!?])/);return t?t[1]:a.length>120?a.slice(0,120)+"…":a}function P(s){if(typeof s=="string")return s===""?'""':JSON.stringify(s);if(s===null)return"null";if(s===void 0)return"—";if(typeof s=="object"){const a=JSON.stringify(s);return a.length>60?a.slice(0,60)+"…":a}return String(s)}const _e=1440*60*1e3;function J(s){if(!s)return"never";const a=new Date(s).getTime();return Number.isNaN(a)?"never":new Date(a).toLocaleString()}function U(s){return s?new Date(s).toLocaleString():"never"}function Fe(){return e.jsxs("div",{className:"p-4 max-w-3xl space-y-8 text-sm",children:[e.jsx($e,{}),e.jsx("hr",{className:"border-line"}),e.jsx(He,{})]})}function $e(){const[s,a]=d.useState(null),[t,l]=d.useState(null),[n,r]=d.useState(null),[i,p]=d.useState(null),[m,v]=d.useState(!1),[x,w]=d.useState(null),[g,y]=d.useState(null);if(d.useEffect(()=>{let f=!1;return Promise.all([window.api.otel.getConfig(),window.api.otel.status(),window.api.otel.configPath()]).then(([S,k,o])=>{f||(a(S),r(S),l(k),p(o))}).catch(S=>{console.warn("[telemetry] load failed:",S==null?void 0:S.message)}),()=>{f=!0}},[]),!n||!s)return e.jsx(R,{title:"loading…"});const u=JSON.stringify(n)!==JSON.stringify(s),b=(f,S)=>{w(null),r({...n,[f]:S})},C=async()=>{v(!0),w(null);try{const f=await window.api.otel.setConfig(n);!f.ok&&f.error&&w(f.error),a(f.config),r(f.config),l(f.status),y(Date.now())}catch(f){w(f instanceof Error?f.message:String(f))}finally{v(!1)}},E=()=>{w(null),r(s)};return e.jsxs("div",{className:"space-y-5",children:[e.jsxs("header",{className:"space-y-1",children:[e.jsx("h2",{className:"text-fg text-base font-medium",children:"OpenTelemetry export"}),e.jsx("p",{className:"text-fg-dim text-xs leading-relaxed",children:"When enabled, every classified transcript event (tool_use, todo_write, plan, usage, agent_spawn) is mirrored as a 0-duration OTLP/HTTP span. Point this at a local collector (Jaeger, Grafana Tempo, SigNoz, Honeycomb) for cross-session analysis."}),i&&e.jsxs("p",{className:"text-fg-faint text-[11px]",children:["stored at ",e.jsx("span",{className:"font-mono",children:i})]})]}),e.jsxs("section",{className:"border border-line rounded p-3 space-y-3",children:[e.jsxs("div",{className:"flex items-center justify-between gap-3",children:[e.jsxs("div",{children:[e.jsx("div",{className:"text-fg",children:"Export transcripts to OTEL"}),e.jsx("div",{className:"text-fg-faint text-xs",children:"Toggle off to disable all span emission immediately."})]}),e.jsx(L,{checked:n.enabled,onChange:f=>b("enabled",f),label:n.enabled?"on":"off"})]}),e.jsxs("label",{className:"block space-y-1",children:[e.jsx("span",{className:"text-fg-dim text-xs",children:"OTLP/HTTP traces endpoint"}),e.jsx("input",{type:"text",value:n.endpoint,onChange:f=>b("endpoint",f.target.value),placeholder:"http://localhost:4318/v1/traces",className:"w-full bg-bg border border-line rounded px-2 py-1 text-fg font-mono text-xs"})]}),e.jsxs("label",{className:"block space-y-1",children:[e.jsxs("span",{className:"text-fg-dim text-xs",children:["Headers (newline-separated ",e.jsx("span",{className:"font-mono",children:"Key: Value"}),")"]}),e.jsx("textarea",{value:n.headers,onChange:f=>b("headers",f.target.value),placeholder:"x-honeycomb-team: YOUR_API_KEY",rows:3,className:"w-full bg-bg border border-line rounded px-2 py-1 text-fg font-mono text-xs"})]}),e.jsxs("label",{className:"block space-y-1",children:[e.jsx("span",{className:"text-fg-dim text-xs",children:"Service name"}),e.jsx("input",{type:"text",value:n.serviceName,onChange:f=>b("serviceName",f.target.value),placeholder:"session-manager",className:"w-full bg-bg border border-line rounded px-2 py-1 text-fg font-mono text-xs"})]}),e.jsxs("div",{className:"flex items-start justify-between gap-3 pt-1",children:[e.jsxs("div",{children:[e.jsx("div",{className:"text-fg",children:"Include content (PII)"}),e.jsxs("div",{className:"text-fg-faint text-xs leading-relaxed",children:["Adds tool inputs, plan text, and agent prompts to span attributes. Off by default — matches upstream Claude Code's ",e.jsx("span",{className:"font-mono",children:"OTEL_LOG_USER_PROMPTS"})," opt-in."]})]}),e.jsx(L,{checked:n.includeContent,onChange:f=>b("includeContent",f),label:n.includeContent?"on":"off"})]})]}),t&&e.jsxs("section",{className:"border border-line rounded p-3 text-xs space-y-1",children:[e.jsx("div",{className:"text-fg-dim",children:"Runtime status"}),e.jsxs("div",{children:[e.jsx("span",{className:"text-fg-faint",children:"enabled:"})," ",e.jsx("span",{className:t.enabled?"text-accent":"text-fg-dim",children:String(t.enabled)})]}),t.error&&e.jsxs("div",{className:"text-red-400 break-words",children:[e.jsx("span",{className:"text-fg-faint",children:"error:"})," ",t.error]}),!t.error&&t.enabled&&e.jsx("div",{className:"text-fg-faint",children:"spans batched and exported in the background. Verify by enabling and pointing at a local Jaeger."})]}),e.jsxs("footer",{className:"flex items-center gap-3 pt-2 border-t border-line",children:[e.jsx("button",{onClick:C,disabled:!u||m,className:"px-3 py-1 text-xs rounded bg-accent text-bg disabled:opacity-50 disabled:cursor-not-allowed",children:m?"saving…":"Save"}),e.jsx("button",{onClick:E,disabled:!u||m,className:"px-3 py-1 text-xs rounded border border-line text-fg-dim hover:text-fg disabled:opacity-50 disabled:cursor-not-allowed",children:"Revert"}),x&&e.jsx("span",{className:"text-red-400 text-xs",children:x}),!x&&g&&!u&&e.jsx("span",{className:"text-fg-faint text-xs",children:"saved"})]})]})}function He(){const[s,a]=d.useState(null),[t,l]=d.useState(null),[n,r]=d.useState("Copy"),[i,p]=d.useState(!1),[m,v]=d.useState(null),[x,w]=d.useState(null),[g,y]=d.useState(null),[u,b]=d.useState(!1),C=()=>{window.api.telemetry.status().then(l).catch(h=>{console.warn("[product-telemetry] status reload failed:",h==null?void 0:h.message)})};if(d.useEffect(()=>{let h=!1;return Promise.all([window.api.telemetry.getConfig(),window.api.telemetry.status()]).then(([c,O])=>{h||(a(c),l(O))}).catch(c=>{console.warn("[product-telemetry] load failed:",c==null?void 0:c.message)}),()=>{h=!0}},[]),!s||!t)return e.jsx(R,{title:"loading…"});const E=async h=>{w(null);try{const c=await window.api.telemetry.setConfig(h);a(c.config),l(c.status)}catch(c){w(c instanceof Error?c.message:String(c))}},f=h=>{E({...s,enabled:h})},S=h=>{E({...s,enabled:h.turnOff?!1:s.enabled,noticeAckedAt:new Date().toISOString()})},k=async()=>{try{await navigator.clipboard.writeText(s.installId),r("Copied"),setTimeout(()=>r("Copy"),1500)}catch{}},o=async()=>{p(!0),v(null);try{const h=await window.api.telemetry.flushNow();v(`sent ${h.sent.length}, failed ${h.failed.length}`),C()}catch(h){v(h instanceof Error?h.message:String(h))}finally{p(!1)}},j=async()=>{if(u){b(!1);return}try{const h=await window.api.telemetry.recentRecords();y(h),b(!0)}catch(h){console.warn("[product-telemetry] recentRecords failed:",h instanceof Error?h.message:h)}},N=s.lastDailyFlushAt?new Date(s.lastDailyFlushAt).getTime()+_e:null;return e.jsxs("div",{className:"space-y-5","data-testid":"product-telemetry-section",children:[e.jsxs("header",{className:"space-y-1",children:[e.jsx("h2",{className:"text-fg text-base font-medium",children:"Product telemetry (bilko.run)"}),e.jsxs("p",{className:"text-fg-dim text-xs leading-relaxed",children:["Anonymous, strictly non-identifying usage/error reporting that helps improve this app. On by default; switchable off in one click. See"," ",e.jsx("span",{className:"font-mono",children:"session-manager-operations/architecture/telemetry.md"})," for the full data model."]})]}),!s.noticeAckedAt&&e.jsxs("section",{"data-testid":"telemetry-first-run-notice",className:"border border-accent rounded p-3 space-y-2 text-xs",children:[e.jsx("div",{className:"text-fg font-medium",children:"This app sends anonymous product telemetry"}),e.jsx("p",{className:"text-fg-dim leading-relaxed",children:"Collected: a coarse machine profile (OS/arch/app version, no hardware id), error and warning counts, and session counts — sent on start-up, after an update, and once a day."}),e.jsx("p",{className:"text-fg-dim leading-relaxed",children:"Never collected: prompts, transcripts, file paths, project names, email, or username."}),e.jsxs("div",{className:"flex items-center gap-2 pt-1",children:[e.jsx("button",{onClick:()=>S({turnOff:!1}),className:"px-3 py-1 rounded bg-accent text-bg",children:"OK"}),e.jsx("button",{onClick:()=>S({turnOff:!0}),className:"px-3 py-1 rounded border border-line text-fg-dim hover:text-fg",children:"Turn off"})]})]}),e.jsxs("section",{className:"border border-line rounded p-3 space-y-3",children:[e.jsxs("div",{className:"flex items-center justify-between gap-3",children:[e.jsxs("div",{children:[e.jsx("div",{className:"text-fg",children:"Send anonymous product telemetry"}),e.jsx("div",{className:"text-fg-faint text-xs",children:"Sent on start-up, after an update, and once a day. Strictly anonymous — an install id only, never an email, name, or other identifier."})]}),e.jsx(L,{checked:s.enabled,onChange:f,label:s.enabled?"on":"off"})]}),e.jsxs("div",{className:"space-y-1",children:[e.jsx("div",{className:"text-fg-dim text-xs",children:"Anonymous install id"}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("input",{type:"text",readOnly:!0,value:s.installId,"aria-label":"Anonymous install identifier",className:"flex-1 bg-bg border border-line rounded px-2 py-1 text-fg font-mono text-xs"}),e.jsx("button",{onClick:k,className:"px-2 py-1 text-xs rounded border border-line text-fg-dim hover:text-fg",children:n})]})]}),e.jsxs("div",{className:"space-y-1 text-xs",children:[e.jsx("div",{className:"text-fg-faint",children:"Endpoint"}),e.jsx("div",{className:"font-mono text-fg-dim break-all",children:s.endpoint})]}),e.jsxs("div",{className:"space-y-1 text-xs",children:[e.jsx("div",{className:"text-fg-faint",children:"Send cadence"}),e.jsx("div",{className:"text-fg-dim",children:"on start-up, after an update, and once a day"})]}),x&&e.jsx("div",{className:"text-red-400 text-xs",children:x})]}),t.pendingCount>0&&t.sentCount===0&&e.jsxs("section",{"data-testid":"telemetry-never-delivered-warning",className:"border border-red-400 rounded p-3 text-xs space-y-1 text-red-400",children:[e.jsx("div",{className:"font-medium",children:"Never delivered"}),e.jsxs("div",{className:"leading-relaxed",children:[t.pendingCount," record",t.pendingCount===1?"":"s",' queued but none have ever been sent to bilko.run on this install. Check the endpoint/network, or click "Send now" below.']})]}),e.jsxs("section",{className:"border border-line rounded p-3 text-xs space-y-1.5",children:[e.jsx("div",{className:"text-fg-dim",children:"Runtime status"}),e.jsxs("div",{children:[e.jsx("span",{className:"text-fg-faint",children:"last send:"})," ",U(t.lastFlushAt)]}),e.jsxs("div",{children:[e.jsx("span",{className:"text-fg-faint",children:"next daily send due:"})," ",J(N?new Date(N).toISOString():null)]}),e.jsxs("div",{children:[e.jsx("span",{className:"text-fg-faint",children:"queued records:"})," ",t.pendingCount]}),e.jsxs("div",{children:[e.jsx("span",{className:"text-fg-faint",children:"delivered so far:"})," ",t.sentCount]}),e.jsxs("div",{children:[e.jsx("span",{className:"text-fg-faint",children:"de-duplicated:"})," ",t.dedupedAppends]}),e.jsxs("div",{children:[e.jsx("span",{className:"text-fg-faint",children:"evicted:"})," ",t.evictedCount]}),t.backlog&&e.jsxs("div",{className:"text-fg-faint",children:["last backlog drain (",t.backlog.reason,", ",J(t.backlog.ranAt),"):"," ",t.backlog.linesEnqueued," enqueued, ",t.backlog.linesConfirmed," confirmed,"," ",t.backlog.watermarksRewound," watermarks rewound"]}),t.lastError&&e.jsxs("div",{className:"text-red-400 break-words",children:[e.jsx("span",{className:"text-fg-faint",children:"last error:"})," ",t.lastError.message," ","(",U(t.lastError.at),")"]})]}),e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("button",{onClick:o,disabled:i,className:"px-3 py-1 text-xs rounded bg-accent text-bg disabled:opacity-50 disabled:cursor-not-allowed",children:i?"sending…":"Send now"}),m&&e.jsx("span",{className:"text-fg-faint text-xs",children:m})]}),e.jsxs("section",{className:"space-y-2",children:[e.jsx("button",{onClick:j,className:"px-3 py-1 text-xs rounded border border-line text-fg-dim hover:text-fg",children:u?"Hide last records":"Inspect last records sent"}),u&&e.jsx("pre",{"data-testid":"telemetry-inspector-json",className:"bg-bg border border-line rounded p-2 text-[11px] font-mono overflow-auto max-h-96 whitespace-pre-wrap",children:JSON.stringify(g??[],null,2)})]})]})}const Ge={compact:"Compact",roomy:"Roomy"};function Be(){const{model:s,setModel:a}=ee(),{catalog:t}=te(null),{density:l,setDensity:n}=se();return e.jsxs("div",{className:"p-4 max-w-3xl space-y-5 text-sm",children:[e.jsxs("header",{className:"space-y-1",children:[e.jsx("h2",{className:"text-fg text-base font-medium",children:"Session Manager preferences"}),e.jsx("p",{className:"text-fg-dim text-xs leading-relaxed",children:"Native app preferences, stored locally — not part of Claude Code's own settings."})]}),e.jsxs("section",{className:"border border-line rounded p-3 space-y-3",children:[e.jsxs("div",{className:"block space-y-1",children:[e.jsx("span",{className:"text-fg-dim text-xs",children:"Default model for raw sessions"}),e.jsx($,{options:ae(t),value:s,onChange:a,mono:!0}),e.jsx("span",{className:"text-fg-faint text-[11px]",children:"Used when opening a raw interactive session without an explicit per-launch override."})]}),e.jsxs("div",{className:"block space-y-1",children:[e.jsx("span",{className:"text-fg-dim text-xs",children:"Density"}),e.jsx($,{options:["compact","roomy"],value:l,onChange:r=>n(r),labels:Ge}),e.jsx("span",{className:"text-fg-faint text-[11px]",children:"Compact tightens spacing across the app's chrome; Roomy is the default."})]})]})]})}function Je({cwd:s}){const[a,t]=d.useState(!1),[l,n]=d.useState(!1),[r,i]=d.useState(!1),[p,m]=d.useState(!1);d.useEffect(()=>{var y,u;let g=!1;return t(!1),Promise.resolve((u=(y=window.api.promptSessions)==null?void 0:y.getWorktreeDisabled)==null?void 0:u.call(y,{cwd:s})).then(b=>{g||(n((b==null?void 0:b.disabled)??!1),i((b==null?void 0:b.disabled)??!1),t(!0))},()=>{g||t(!0)}),()=>{g=!0}},[s]);const v=a&&r!==l,x=()=>{var g,y;m(!0),Promise.resolve((y=(g=window.api.promptSessions)==null?void 0:g.setWorktreeDisabled)==null?void 0:y.call(g,{cwd:s,disabled:r})).then(u=>{n((u==null?void 0:u.disabled)??r),i((u==null?void 0:u.disabled)??r)}).catch(u=>ne.error(u instanceof Error?u.message:String(u))).finally(()=>m(!1))},w=()=>i(l);return e.jsxs("div",{"data-testid":"settings-epic-isolation",className:"border-b border-line bg-bg-elev px-3 py-2.5 text-[11.5px] leading-snug",children:[e.jsxs("label",{className:"flex items-start gap-2",children:[e.jsx("input",{type:"checkbox",checked:r,disabled:!a||p,onChange:g=>i(g.target.checked),"data-testid":"settings-epic-isolation-checkbox",className:"mt-0.5"}),e.jsxs("span",{children:[e.jsx("span",{className:"font-semibold text-fg",children:"Disable Epic worktree isolation for this project"}),e.jsxs("span",{className:"block text-fg-dim",children:["Off by default — each active Epic runs in its own isolated ",e.jsx("code",{children:"git worktree"})," (branch"," ",e.jsx("code",{children:"sm-epic/<id>"}),"), merged back to main at an explicit checkpoint. Turning this on makes every new Epic in this project run directly in the shared working tree instead, same as before this feature existed."]})]})]}),v&&e.jsx(V,{dirty:v,busy:p,onSave:x,onRevert:w})]})}const K={user:{title:"Global settings",body:"This is the real ~/.claude/settings.json on disk — the same file the claude CLI reads on every session it starts. Edits apply machine-wide, to every project and every session."},project:{title:"Project settings",body:"This is the real <project>/.claude/settings.json on disk, checked into git. Edits apply to every current and future session in this project, for anyone who clones it."},local:{title:"Local settings",body:"This is the real <project>/.claude/settings.local.json on disk, gitignored. Edits apply to every current and future session in this project, on this machine only."}};function Ue(){const s=re(),a=H(c=>c.tabs),t=H(c=>c.activeTabId),l=a.find(c=>c.id===t)??null,n=(l==null?void 0:l.cwd)??null,r=le(c=>c.navFace),i=d.useRef(!1),p=d.useRef(r),[m,v]=d.useState(()=>r==="project"&&n?"project":"user"),[x,w]=d.useState("effective");d.useEffect(()=>{if(p.current!==r){if(p.current=r,i.current){i.current=!1;return}v(r==="project"&&n?"project":"user")}},[r,n]),d.useEffect(()=>{r==="project"&&(x==="telemetry"||x==="app")&&w("effective")},[r,x]);const g=c=>{i.current=!0,v(c)},y=me(G,s,n),u=y[m]??null,b=M(c=>c.files),C=M(c=>c.setDraft),E=M(c=>c.saveJson),f=M(c=>c.revert),[S,k]=d.useState(null),o=d.useMemo(()=>ie(oe(b,y)),[b,y]),j=(c,O,A)=>{var F;const D=y[A??m];if(!D)return;k(null);const _=((F=b[D])==null?void 0:F.draftRaw)??"";let I={};if(_.trim())try{I=JSON.parse(_)}catch{I={}}const Z=xe(I,c,O);C(D,JSON.stringify(Z,null,2)+`
|
|
3
|
-
`)};if(!s)return e.jsx(R,{title:"loading…"});const N=u?b[u]:null,h=c=>c!=="user"&&!n;return e.jsx(ce,{toolbar:e.jsxs(e.Fragment,{children:[e.jsx(ue,{options:[{key:"effective",label:"Guided"},{key:"tree",label:"Tree"},{key:"raw",label:"Raw"},...r==="home"?[{key:"telemetry",label:"Telemetry"},{key:"app",label:"Session Manager"}]:[]],active:x,onChange:w}),x!=="telemetry"&&x!=="app"&&e.jsxs(e.Fragment,{children:[e.jsx("span",{className:"mx-2 text-fg-faint",children:"·"}),e.jsx(pe,{scopes:G.scopes,active:m,onChange:g,annotate:c=>{if(h(c))return{exists:!1};const O=y[c];if(!O)return null;const A=b[O];return{exists:(A==null?void 0:A.exists)??!1,dirty:(A==null?void 0:A.dirty)??!1}}}),e.jsx("span",{className:"ml-3 text-fg-faint truncate",children:x==="effective"?`overrides → ${u??"—"}`:u??"—"})]}),e.jsx("div",{className:"flex-1"}),e.jsx("a",{href:"https://code.claude.com/docs/en/settings",target:"_blank",rel:"noreferrer",className:"text-fg-faint hover:text-fg-dim underline-offset-2 hover:underline",children:"schema reference ↗"})]}),footer:x!=="telemetry"&&x!=="app"&&u&&N?e.jsx(V,{dirty:N.dirty,busy:N.busy,parseError:S||N.parseError,lastSavedAt:N.lastSavedAt,leading:N.exists?null:e.jsx("span",{children:"file will be created on save"}),onSave:async()=>{k(null);const c=await E(u);c.ok||k(c.error??"save failed")},onRevert:()=>{k(null),f(u)}}):null,children:x==="telemetry"?e.jsx(Fe,{}):x==="app"?e.jsx(Be,{}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{"data-testid":"settings-scope-note",className:"sticky top-0 z-10 border-b border-line bg-bg-elev px-3 py-2 text-[11.5px] leading-snug",children:[e.jsx("span",{className:"font-semibold text-fg",children:K[m].title}),e.jsx("span",{className:"mx-1.5 text-fg-faint",children:"·"}),e.jsx("span",{className:"text-fg-dim",children:K[m].body}),u&&e.jsx("span",{className:"ml-1.5 font-mono text-fg-faint",children:u})]}),m==="project"&&n&&e.jsx(Je,{cwd:n}),h(m)?e.jsx(R,{title:"no active project",hint:"open a tab in a project directory to edit project or local settings"}):x==="effective"?e.jsx(we,{node:o,targetScope:m,onOverride:j,schema:B()}):x==="tree"?e.jsx(fe,{node:o,targetScope:m,onOverride:j,schema:B()}):u&&N?e.jsx(de,{path:u,value:N.draftRaw,onChange:c=>{k(null),C(u,c)}}):e.jsx(R,{title:"resolving…"})]})})}const Ze=d.memo(Ue);export{K as SETTINGS_SCOPE_NOTES,Ze as Settings};
|