@blackbelt-technology/pi-agent-dashboard 0.4.6 → 0.5.1
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/AGENTS.md +339 -190
- package/README.md +50 -7
- package/docs/architecture.md +238 -23
- package/package.json +23 -13
- package/packages/extension/package.json +11 -3
- package/packages/extension/src/__tests__/ask-user-tool.test.ts +1 -1
- package/packages/extension/src/__tests__/build-provider-catalogue.test.ts +176 -0
- package/packages/extension/src/__tests__/command-handler.test.ts +68 -0
- package/packages/extension/src/__tests__/enrich-model-metadata.test.ts +1 -1
- package/packages/extension/src/__tests__/markdown-image-inliner.test.ts +355 -0
- package/packages/extension/src/__tests__/no-tui-multiselect-arm-regression.test.ts +1 -1
- package/packages/extension/src/__tests__/openspec-activity-detector.test.ts +68 -0
- package/packages/extension/src/__tests__/prompt-expander.test.ts +45 -0
- package/packages/extension/src/__tests__/provider-register-reload.test.ts +74 -0
- package/packages/extension/src/__tests__/retry-tracker.test.ts +147 -0
- package/packages/extension/src/__tests__/server-launcher.test.ts +24 -1
- package/packages/extension/src/__tests__/session-sync.test.ts +72 -0
- package/packages/extension/src/__tests__/usage-limit-orderer.test.ts +105 -0
- package/packages/extension/src/ask-user-tool.ts +1 -1
- package/packages/extension/src/bridge-context.ts +1 -1
- package/packages/extension/src/bridge.ts +169 -4
- package/packages/extension/src/command-handler.ts +65 -2
- package/packages/extension/src/flow-event-wiring.ts +1 -1
- package/packages/extension/src/markdown-image-inliner.ts +268 -0
- package/packages/extension/src/multiselect-list.ts +1 -1
- package/packages/extension/src/pi-env.d.ts +16 -9
- package/packages/extension/src/prompt-expander.ts +50 -2
- package/packages/extension/src/provider-register.ts +132 -8
- package/packages/extension/src/retry-tracker.ts +123 -0
- package/packages/extension/src/server-launcher.ts +18 -1
- package/packages/extension/src/session-sync.ts +15 -1
- package/packages/extension/src/usage-limit-orderer.ts +76 -0
- package/packages/server/package.json +6 -6
- package/packages/server/src/__tests__/auto-attach-slug-defense.test.ts +104 -0
- package/packages/server/src/__tests__/bootstrap-install-from-list.test.ts +263 -0
- package/packages/server/src/__tests__/browser-gateway-snapshot-on-connect.test.ts +143 -0
- package/packages/server/src/__tests__/build-auth-status.test.ts +190 -0
- package/packages/server/src/__tests__/changelog-fs.test.ts +171 -0
- package/packages/server/src/__tests__/changelog-parser.test.ts +220 -0
- package/packages/server/src/__tests__/changelog-remote.test.ts +193 -0
- package/packages/server/src/__tests__/cli-parse.test.ts +22 -4
- package/packages/server/src/__tests__/cold-boot-openspec-broadcast.test.ts +161 -0
- package/packages/server/src/__tests__/directory-service-refresh-force.test.ts +1 -1
- package/packages/server/src/__tests__/directory-service-specs-mtime.test.ts +1 -1
- package/packages/server/src/__tests__/directory-service-toctou.test.ts +1 -1
- package/packages/server/src/__tests__/directory-service.test.ts +1 -1
- package/packages/server/src/__tests__/doctor-route.test.ts +132 -0
- package/packages/server/src/__tests__/event-wiring-providers-list.test.ts +154 -0
- package/packages/server/src/__tests__/fixtures/pi-changelog-slice.md +180 -0
- package/packages/server/src/__tests__/fork-empty-session-preflight.test.ts +268 -0
- package/packages/server/src/__tests__/has-openspec-dir.test.ts +64 -0
- package/packages/server/src/__tests__/headless-pid-registry.test.ts +83 -0
- package/packages/server/src/__tests__/health-shape.test.ts +43 -0
- package/packages/server/src/__tests__/idle-timer-respects-terminals.test.ts +115 -0
- package/packages/server/src/__tests__/is-pi-process.test.ts +1 -1
- package/packages/server/src/__tests__/openspec-connect-snapshot.test.ts +92 -0
- package/packages/server/src/__tests__/package-manager-wrapper-resolve.test.ts +4 -4
- package/packages/server/src/__tests__/package-routes.test.ts +1 -1
- package/packages/server/src/__tests__/pending-fork-registry.test.ts +48 -24
- package/packages/server/src/__tests__/pi-changelog-integration.test.ts +165 -0
- package/packages/server/src/__tests__/pi-changelog-routes.test.ts +409 -0
- package/packages/server/src/__tests__/pi-core-checker.test.ts +155 -13
- package/packages/server/src/__tests__/pi-core-updater-managed-path.test.ts +236 -0
- package/packages/server/src/__tests__/pi-core-updater.test.ts +1 -1
- package/packages/server/src/__tests__/pi-dev-version-check.test.ts +184 -0
- package/packages/server/src/__tests__/pi-version-skew.test.ts +4 -4
- package/packages/server/src/__tests__/process-manager-codes.test.ts +80 -0
- package/packages/server/src/__tests__/process-manager-managed-path.test.ts +73 -0
- package/packages/server/src/__tests__/provider-auth-routes.test.ts +12 -4
- package/packages/server/src/__tests__/provider-auth-storage.test.ts +42 -11
- package/packages/server/src/__tests__/provider-catalogue-cache.test.ts +44 -0
- package/packages/server/src/__tests__/recommended-routes.test.ts +1 -1
- package/packages/server/src/__tests__/session-action-handler-spawn-error.test.ts +17 -2
- package/packages/server/src/__tests__/session-action-handler-spawn.test.ts +150 -0
- package/packages/server/src/__tests__/session-discovery-skill-firstmessage.test.ts +95 -0
- package/packages/server/src/__tests__/spawn-correlation-token-integration.test.ts +91 -0
- package/packages/server/src/__tests__/spawn-failure-log.test.ts +118 -0
- package/packages/server/src/__tests__/spawn-preflight.test.ts +91 -0
- package/packages/server/src/__tests__/spawn-register-watchdog.test.ts +250 -0
- package/packages/server/src/__tests__/spawn-token.test.ts +57 -0
- package/packages/server/src/__tests__/subscription-handler.test.ts +98 -6
- package/packages/server/src/__tests__/system-routes-reextract.test.ts +91 -0
- package/packages/server/src/__tests__/system-routes-spawn-failures.test.ts +84 -0
- package/packages/server/src/__tests__/terminal-manager.test.ts +45 -0
- package/packages/server/src/bootstrap-install-from-list.ts +232 -0
- package/packages/server/src/bootstrap-state.ts +18 -0
- package/packages/server/src/browser-gateway.ts +70 -24
- package/packages/server/src/browser-handlers/directory-handler.ts +4 -0
- package/packages/server/src/browser-handlers/handler-context.ts +9 -0
- package/packages/server/src/browser-handlers/session-action-handler.ts +159 -18
- package/packages/server/src/browser-handlers/subscription-handler.ts +50 -3
- package/packages/server/src/changelog-fs.ts +167 -0
- package/packages/server/src/changelog-parser.ts +321 -0
- package/packages/server/src/changelog-remote.ts +134 -0
- package/packages/server/src/cli.ts +23 -2
- package/packages/server/src/directory-service.ts +31 -0
- package/packages/server/src/event-wiring.ts +105 -5
- package/packages/server/src/headless-pid-registry.ts +54 -5
- package/packages/server/src/home-lock.d.ts +124 -0
- package/packages/server/src/home-lock.js +330 -0
- package/packages/server/src/home-lock.js.map +1 -0
- package/packages/server/src/idle-timer.ts +15 -1
- package/packages/server/src/pending-client-correlations.ts +73 -0
- package/packages/server/src/pending-fork-registry.ts +24 -12
- package/packages/server/src/pi-core-checker.ts +77 -17
- package/packages/server/src/pi-core-updater.ts +81 -15
- package/packages/server/src/pi-dev-version-check.ts +145 -0
- package/packages/server/src/pi-gateway.ts +10 -0
- package/packages/server/src/pi-version-skew.ts +12 -4
- package/packages/server/src/process-manager.ts +115 -21
- package/packages/server/src/provider-auth-handlers.ts +9 -0
- package/packages/server/src/provider-auth-storage.ts +83 -51
- package/packages/server/src/provider-catalogue-cache.ts +47 -0
- package/packages/server/src/routes/doctor-routes.ts +140 -0
- package/packages/server/src/routes/pi-changelog-routes.ts +194 -0
- package/packages/server/src/routes/pi-core-routes.ts +1 -1
- package/packages/server/src/routes/provider-auth-routes.ts +14 -1
- package/packages/server/src/routes/provider-routes.ts +4 -4
- package/packages/server/src/routes/system-routes.ts +38 -1
- package/packages/server/src/server.ts +85 -66
- package/packages/server/src/session-api.ts +54 -3
- package/packages/server/src/session-bootstrap.ts +27 -12
- package/packages/server/src/session-discovery.ts +11 -4
- package/packages/server/src/session-file-reader.ts +1 -1
- package/packages/server/src/session-scanner.ts +4 -2
- package/packages/server/src/spawn-failure-log.ts +130 -0
- package/packages/server/src/spawn-preflight.ts +82 -0
- package/packages/server/src/spawn-register-watchdog.ts +291 -0
- package/packages/server/src/spawn-token.ts +20 -0
- package/packages/server/src/terminal-manager.ts +12 -1
- package/packages/shared/package.json +1 -1
- package/packages/shared/src/__tests__/bootstrap/__snapshots__/cube.test.ts.snap +25 -17
- package/packages/shared/src/__tests__/bootstrap/families/__snapshots__/a-electron.test.ts.snap +5 -4
- package/packages/shared/src/__tests__/bootstrap/families/__snapshots__/b-npm-global.test.ts.snap +6 -5
- package/packages/shared/src/__tests__/bootstrap/families/__snapshots__/c-dev-monorepo.test.ts.snap +1 -0
- package/packages/shared/src/__tests__/bootstrap/families/__snapshots__/e-stale-partial.test.ts.snap +5 -4
- package/packages/shared/src/__tests__/bootstrap/families/__snapshots__/f-cwd-variants.test.ts.snap +2 -1
- package/packages/shared/src/__tests__/bootstrap/families/__snapshots__/g-windows-specifics.test.ts.snap +6 -3
- package/packages/shared/src/__tests__/bootstrap/fixtures/dev-monorepo.ts +1 -1
- package/packages/shared/src/__tests__/bootstrap-install-resolve-npm.test.ts +72 -0
- package/packages/shared/src/__tests__/browser-protocol-types.test.ts +47 -1
- package/packages/shared/src/__tests__/changelog-types.test.ts +78 -0
- package/packages/shared/src/__tests__/config.test.ts +48 -0
- package/packages/shared/src/__tests__/dashboard-starter.test.ts +40 -0
- package/packages/shared/src/__tests__/detached-spawn.test.ts +24 -0
- package/packages/shared/src/__tests__/doctor-core.test.ts +134 -0
- package/packages/shared/src/__tests__/doctor-fault-tolerance.test.ts +218 -0
- package/packages/shared/src/__tests__/doctor-format.test.ts +121 -0
- package/packages/shared/src/__tests__/install-managed-node-bootstrap-order.test.ts +68 -0
- package/packages/shared/src/__tests__/install-managed-node.test.ts +192 -0
- package/packages/shared/src/__tests__/installable-list.test.ts +130 -0
- package/packages/shared/src/__tests__/managed-node-path.test.ts +122 -0
- package/packages/shared/src/__tests__/managed-runtime-strategy.test.ts +74 -0
- package/packages/shared/src/__tests__/no-installable-list-in-bridge.test.ts +52 -0
- package/packages/shared/src/__tests__/no-raw-openspec-status-in-skills.test.ts +6 -1
- package/packages/shared/src/__tests__/node-spawn-jiti-contract.test.ts +56 -20
- package/packages/shared/src/__tests__/resolve-jiti.test.ts +140 -9
- package/packages/shared/src/__tests__/skill-block-parser.test.ts +153 -0
- package/packages/shared/src/__tests__/tool-registry-definitions.test.ts +1 -1
- package/packages/shared/src/bootstrap-install.ts +197 -3
- package/packages/shared/src/browser-protocol.ts +155 -1
- package/packages/shared/src/changelog-types.ts +111 -0
- package/packages/shared/src/config.ts +15 -0
- package/packages/shared/src/dashboard-starter.ts +33 -0
- package/packages/shared/src/doctor-core.ts +821 -0
- package/packages/shared/src/index.ts +9 -0
- package/packages/shared/src/installable-list.ts +152 -0
- package/packages/shared/src/launch-source-flag.ts +14 -0
- package/packages/shared/src/launch-source-types.ts +18 -0
- package/packages/shared/src/openspec-activity-detector.ts +25 -7
- package/packages/shared/src/platform/detached-spawn.ts +13 -2
- package/packages/shared/src/platform/managed-node-path.ts +77 -0
- package/packages/shared/src/platform/node-spawn.ts +29 -21
- package/packages/shared/src/protocol.ts +54 -2
- package/packages/shared/src/resolve-jiti.ts +62 -9
- package/packages/shared/src/rest-api.ts +4 -0
- package/packages/shared/src/skill-block-parser.ts +115 -0
- package/packages/shared/src/tool-registry/__tests__/managed-runtime-strategy.test.ts +166 -0
- package/packages/shared/src/tool-registry/definitions.ts +33 -8
- package/packages/shared/src/tool-registry/strategies.ts +42 -0
- package/packages/shared/src/types.ts +64 -0
package/AGENTS.md
CHANGED
|
@@ -5,9 +5,134 @@
|
|
|
5
5
|
|
|
6
6
|
Web-based dashboard for monitoring and interacting with pi agent sessions remotely. Three-component architecture: bridge extension + Node.js server + React web client.
|
|
7
7
|
|
|
8
|
+
## STOP — Docs-First Gate
|
|
9
|
+
|
|
10
|
+
**Before any build / run / install / setup / release / "how do I X" question: `grep -i <keyword> docs/faq.md README.md docs/` FIRST. No source reads until that returns nothing.**
|
|
11
|
+
|
|
12
|
+
If you read a script, config, or source file before grepping docs on a how-to, what-is question, you violated the protocol. Re-grep, then answer.
|
|
13
|
+
|
|
14
|
+
- ❌ User: "how do I ..." → read `<src files>` → guess answer
|
|
15
|
+
- ✅ User: "how do I ..." → `grep -ni '<words>' docs/faq.md` → quote the FAQ entry
|
|
16
|
+
|
|
17
|
+
- ❌ User: "what is ..." → read `scripts/build-installer.sh`, `forge.config.ts` → guess answer
|
|
18
|
+
- ✅ User: "what is ..." → `grep -ni '<words>' docs/index-*.md` → quote the entry
|
|
19
|
+
|
|
20
|
+
Full protocol (index-first for code questions, file-index splits, etc.) is in [Investigation Protocol — Index First](#investigation-protocol--index-first) below.
|
|
21
|
+
|
|
22
|
+
## Code Instructions
|
|
23
|
+
|
|
24
|
+
Behavioral guidelines to reduce common LLM coding mistakes. Bias toward caution over speed. For trivial tasks, use judgment.
|
|
25
|
+
|
|
26
|
+
### 1. Think Before Coding
|
|
27
|
+
|
|
28
|
+
**Don't assume. Don't hide confusion. Surface tradeoffs.**
|
|
29
|
+
|
|
30
|
+
Before implementing:
|
|
31
|
+
- State your assumptions explicitly. If uncertain, ask via `ask_user`.
|
|
32
|
+
- If multiple interpretations exist, present them — don't pick silently.
|
|
33
|
+
- If a simpler approach exists, say so. Push back when warranted.
|
|
34
|
+
- If something is unclear, stop. Name what's confusing. Ask.
|
|
35
|
+
- **Never speculate about code you have not opened.** If the user references a specific file, read it before answering. No claims about the codebase without investigation — grounded, hallucination-free answers only.
|
|
36
|
+
- Before any major change, check in with the user and confirm the plan.
|
|
37
|
+
|
|
38
|
+
### 2. Simplicity First
|
|
39
|
+
|
|
40
|
+
**Minimum code that solves the problem. Nothing speculative.**
|
|
41
|
+
|
|
42
|
+
- No features beyond what was asked.
|
|
43
|
+
- No abstractions for single-use code.
|
|
44
|
+
- No "flexibility" or "configurability" that wasn't requested.
|
|
45
|
+
- No error handling for impossible scenarios.
|
|
46
|
+
- If you write 200 lines and it could be 50, rewrite it.
|
|
47
|
+
- **DRY:** if the same pattern appears in multiple places, extract a shared helper/class/component. Don't pre-extract for a single call site.
|
|
48
|
+
|
|
49
|
+
Ask yourself: "Would a senior engineer say this is overcomplicated?" If yes, simplify.
|
|
50
|
+
|
|
51
|
+
### 3. Surgical Changes
|
|
52
|
+
|
|
53
|
+
**Touch only what you must. Clean up only your own mess.**
|
|
54
|
+
|
|
55
|
+
When editing existing code:
|
|
56
|
+
- Don't "improve" adjacent code, comments, or formatting.
|
|
57
|
+
- Don't refactor things that aren't broken.
|
|
58
|
+
- Match existing style, even if you'd do it differently.
|
|
59
|
+
- If you notice unrelated dead code, mention it — don't delete it.
|
|
60
|
+
|
|
61
|
+
When your changes create orphans:
|
|
62
|
+
- Remove imports/variables/functions that YOUR changes made unused.
|
|
63
|
+
- Don't remove pre-existing dead code unless asked.
|
|
64
|
+
|
|
65
|
+
The test: every changed line should trace directly to the user's request.
|
|
66
|
+
|
|
67
|
+
### 4. Goal-Driven Execution (TDD)
|
|
68
|
+
|
|
69
|
+
**Define success criteria. Loop until verified.**
|
|
70
|
+
|
|
71
|
+
Transform tasks into verifiable goals:
|
|
72
|
+
- "Add validation" → "Write tests for invalid inputs, then make them pass"
|
|
73
|
+
- "Fix the bug" → "Write a test that reproduces it, then make it pass"
|
|
74
|
+
- "Refactor X" → "Ensure tests pass before and after"
|
|
75
|
+
|
|
76
|
+
For implementation, use **TDD**: write or update tests first to define expected behaviour, verify they fail, then write the minimal implementation to make them pass.
|
|
77
|
+
|
|
78
|
+
For multi-step tasks, state a brief plan:
|
|
79
|
+
```
|
|
80
|
+
1. [Step] → verify: [check]
|
|
81
|
+
2. [Step] → verify: [check]
|
|
82
|
+
3. [Step] → verify: [check]
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
Strong success criteria let you loop independently. Weak criteria ("make it work") require constant clarification.
|
|
86
|
+
|
|
87
|
+
### 5. Communication
|
|
88
|
+
|
|
89
|
+
- At every step, give a high-level explanation of what changed — don't dump diffs without summary.
|
|
90
|
+
- Use `ask_user` (not plain-text questions) when you need clarification, confirmation, or a choice.
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
**These guidelines are working if:** fewer unnecessary changes in diffs, fewer rewrites due to overcomplication, and clarifying questions come before implementation rather than after mistakes.
|
|
95
|
+
|
|
96
|
+
## Documentation Update Protocol
|
|
97
|
+
|
|
98
|
+
**Default assumption: your update does NOT belong in AGENTS.md.** AGENTS.md loads into every agent's context on every turn — every byte costs tokens. Route by kind:
|
|
99
|
+
|
|
100
|
+
| Kind of update | Goes in |
|
|
101
|
+
|---|---|
|
|
102
|
+
| New file, or per-file detail / change-history / contract / "See change: …" annotation | Matching per-area split `docs/file-index-<area>.md` (see `docs/file-index.md`). Add row in path-alphabetical order. |
|
|
103
|
+
| New top-level area / new split file | New row in `docs/file-index.md` splits table. Pointer in AGENTS.md only if architectural backbone. |
|
|
104
|
+
| Data flow, persistence, reconnection, protocol, config reference | `docs/architecture.md` |
|
|
105
|
+
| End-user / developer setup, prerequisites, CI badges, project structure | `README.md` |
|
|
106
|
+
| Cross-cutting rule EVERY agent needs on EVERY turn (rare) | AGENTS.md, ≤ 200 chars per row, no inline change history |
|
|
107
|
+
|
|
108
|
+
Rules:
|
|
109
|
+
|
|
110
|
+
1. **AGENTS.md "Key Files" rows MUST stay ≤ 200 characters** — one terse purpose, no change-history, no contracts, no "See change: …" parentheticals.
|
|
111
|
+
|
|
112
|
+
2. **Per-file detail goes into `docs/file-index-<area>.md`.** Search the matching split for the path; if a row exists, append/update; else add in path-alphabetical order.
|
|
113
|
+
|
|
114
|
+
3. **If a split grows past ~50 KB**, sub-split it (e.g. `file-index-server-routes.md`) and update `docs/file-index.md`.
|
|
115
|
+
|
|
116
|
+
4. **Long-form docs** (architecture decisions, rationale, protocol details) belong in `docs/architecture.md` or `docs/<topic>.md`. Reference from AGENTS.md with a one-line pointer, never inline.
|
|
117
|
+
|
|
118
|
+
5. **When you create a new split doc**, add a one-line pointer in AGENTS.md so future agents find it.
|
|
119
|
+
|
|
120
|
+
6. **Every write under `docs/` MUST be delegated to a general-purpose subagent with the caveman-style rule passed verbatim in its prompt.** Main agent orchestrates, never edits `docs/` directly.
|
|
121
|
+
|
|
122
|
+
**Caveman style** (all `docs/` prose — file-index rows, architecture notes, topic docs):
|
|
123
|
+
- Short declarative fragments. Drop articles (a/an/the) and most copulas (is/are/was) when meaning survives.
|
|
124
|
+
- Subject → verb → object, present tense. No hedging, no marketing voice, no "we", no "you".
|
|
125
|
+
- One fact per line/row. No restating context the file already establishes.
|
|
126
|
+
- Prefer concrete tokens (paths, function names, env vars, ports, exit codes) over prose.
|
|
127
|
+
- Keep symbols/identifiers verbatim; only connective tissue compresses.
|
|
128
|
+
- Example — verbose: "This module is responsible for parsing the user's input and then dispatching it to the correct handler based on the command prefix." Caveman: "Parses user input. Dispatches to handler by command prefix."
|
|
129
|
+
|
|
130
|
+
Why this exists: AGENTS.md ballooned to 107 KB (~27k tokens) by accreting per-change annotations on every row over months. Split was already done (file-index.md exists) but agents kept appending to AGENTS.md instead.
|
|
131
|
+
|
|
8
132
|
## Architecture
|
|
9
133
|
|
|
10
134
|
See [docs/architecture.md](docs/architecture.md) for full details.
|
|
135
|
+
- See [docs/electron-bootstrap-flow.md](docs/electron-bootstrap-flow.md) for the Electron app→server bootstrap state machine and end states.
|
|
11
136
|
|
|
12
137
|
- **Bridge Extension** (`src/extension/`) — Runs in every pi session, forwards events via WebSocket
|
|
13
138
|
- **Dashboard Server** (`src/server/`) — Aggregates events, in-memory + JSON persistence, dual WebSocket servers
|
|
@@ -65,264 +190,301 @@ make clean # Destroy all cloned VMs
|
|
|
65
190
|
| `qa/tests/` | Test suite (install, server, websocket, terminal, git) |
|
|
66
191
|
| `qa/README.md` | Full setup and usage documentation |
|
|
67
192
|
|
|
193
|
+
## Investigation Protocol — Index First
|
|
194
|
+
|
|
195
|
+
**Before reading source, consult `docs/file-index.md` and the relevant `docs/file-index-<area>.md` split.** The index is the cheapest map of the codebase — every architecturally significant file has a one-line purpose plus change-history pointers. Reading source blind wastes tokens and risks hallucination.
|
|
196
|
+
|
|
197
|
+
**For "how do I X" / build / run / setup questions: grep `README.md` + `docs/` first.** These already document every supported workflow (build, install, release, QA, troubleshooting). Reading source before checking docs wastes tokens and produces wrong answers (e.g. claiming a feature is missing when it ships). Check `docs/faq.md` for recurring questions.
|
|
198
|
+
|
|
199
|
+
Workflow for any non-trivial "where is X" / "how does Y work" question:
|
|
200
|
+
|
|
201
|
+
1. **Pick the split** from `docs/file-index.md` table (shared / extension / server / client / electron / plugins / skills-misc) by path prefix or topic.
|
|
202
|
+
2. **Delegate harvesting to a subagent** (`Explore` preferred). Give it:
|
|
203
|
+
- the user's question,
|
|
204
|
+
- the split file(s) to read,
|
|
205
|
+
- explicit instruction: *"return only rows + file paths relevant to the question — no source reads, no speculation."*
|
|
206
|
+
3. **Receive a short list** of candidate files (≤ ~10 rows). Only then open source for the ones that matter.
|
|
207
|
+
4. If the split lacks coverage, fall back to `rg` / `Explore` over the source tree — and add the missing row per the Documentation Update Protocol.
|
|
208
|
+
|
|
209
|
+
Why subagents: the splits are large (`file-index-server.md`, `file-index-client.md` each > 20 KB). Loading them into the main context on every question pollutes the budget. A subagent reads the split, returns the 5–10 relevant rows, and discards the rest.
|
|
210
|
+
|
|
211
|
+
Do **not**:
|
|
212
|
+
- Grep source before checking the index.
|
|
213
|
+
- Read a whole split file into the main agent's context — delegate.
|
|
214
|
+
- Trust the AGENTS.md "Key Files" backbone as exhaustive; it is a subset.
|
|
215
|
+
|
|
68
216
|
## Key Files
|
|
69
217
|
|
|
70
|
-
> **Full file map**: see [`docs/file-index.md`](docs/file-index.md) —
|
|
218
|
+
> **Full file map**: see [`docs/file-index.md`](docs/file-index.md) — a thin index of per-area split files (`docs/file-index-<area>.md`). Read the relevant split on demand when locating a file or understanding its full responsibilities (incl. change-history annotations).
|
|
71
219
|
|
|
72
|
-
This section lists only the **architectural backbone** — the files agents touch most often or need to know about for any non-trivial change. For everything else (renderers, individual tool cards, narrow helpers, build/CI internals) consult `docs/file-index.md`.
|
|
220
|
+
This section lists only the **architectural backbone** — the files agents touch most often or need to know about for any non-trivial change. For everything else (renderers, individual tool cards, narrow helpers, build/CI internals) consult the appropriate split via `docs/file-index.md`.
|
|
73
221
|
|
|
74
222
|
### Protocol & types
|
|
75
223
|
| File | Purpose |
|
|
76
224
|
|------|---------|
|
|
77
|
-
| `src/shared/protocol.ts` | Extension↔Server WebSocket
|
|
78
|
-
| `src/shared/browser-protocol.ts` | Server↔Browser WebSocket
|
|
79
|
-
| `src/shared/types.ts` | Data models (Session, Workspace, Event)
|
|
80
|
-
| `src/shared/config.ts` | Shared config loader (`~/.pi/dashboard/config.json`)
|
|
81
|
-
| `src/shared/semaphore.ts` | Tiny FIFO semaphore (`createSemaphore(max)`
|
|
82
|
-
| `src/extension/bridge.ts` |
|
|
225
|
+
| `src/shared/protocol.ts` | Extension↔Server WebSocket message types |
|
|
226
|
+
| `src/shared/browser-protocol.ts` | Server↔Browser WebSocket message types |
|
|
227
|
+
| `src/shared/types.ts` | Data models (Session, Workspace, Event) |
|
|
228
|
+
| `src/shared/config.ts` | Shared config loader (`~/.pi/dashboard/config.json`) |
|
|
229
|
+
| `src/shared/semaphore.ts` | Tiny FIFO semaphore (`createSemaphore(max)`) |
|
|
230
|
+
| `src/extension/bridge.ts` | Main bridge extension entry; PromptBus patch site, sync/tracker/flow composition |
|
|
83
231
|
| `src/extension/bridge-context.ts` | Shared mutable state type + helpers for bridge modules |
|
|
84
|
-
| `src/extension/session-sync.ts` | Session register, replay, and switch/fork handling
|
|
232
|
+
| `src/extension/session-sync.ts` | Session register, replay, and switch/fork handling |
|
|
85
233
|
| `src/extension/model-tracker.ts` | Model/thinking-level/git/name change detection |
|
|
86
234
|
| `src/extension/flow-event-wiring.ts` | Flow event listener registration (flow:* → event_forward) |
|
|
87
|
-
| `src/extension/connection.ts` | WebSocket with exponential backoff
|
|
235
|
+
| `src/extension/connection.ts` | WebSocket with exponential backoff; auto-start suppression on `server_restarting` |
|
|
88
236
|
| `src/extension/server-probe.ts` | TCP probe to detect running server |
|
|
89
|
-
| `src/shared/server-identity.ts` | Identity-verified health check (`isDashboardRunning`)
|
|
90
|
-
| `src/shared/mdns-discovery.ts` | mDNS advertise/discover/browse for `_pi-dashboard._tcp`
|
|
91
|
-
| `src/extension/server-launcher.ts` | Auto-start server as detached process;
|
|
237
|
+
| `src/shared/server-identity.ts` | Identity-verified health check (`isDashboardRunning`) |
|
|
238
|
+
| `src/shared/mdns-discovery.ts` | mDNS advertise/discover/browse for `_pi-dashboard._tcp` |
|
|
239
|
+
| `src/extension/server-launcher.ts` | Auto-start server as detached process; logs to `~/.pi/dashboard/server.log` |
|
|
92
240
|
| `src/extension/command-handler.ts` | Command routing: `!`/`!!` bash, `/compact`, slash commands |
|
|
93
|
-
| `src/extension/prompt-expander.ts` | Slash command → prompt template expansion
|
|
241
|
+
| `src/extension/prompt-expander.ts` | Slash command → prompt template expansion |
|
|
94
242
|
| `src/extension/dev-build.ts` | Dev build-on-reload helper (client build + server shutdown) |
|
|
95
|
-
| `src/extension/server-auto-start.ts` | mDNS-first
|
|
96
|
-
| `src/shared/session-meta.ts` | Session metadata sidecar (.meta.json) read/write helpers
|
|
97
|
-
| `src/extension/process-metrics.ts` | Lightweight CPU/memory/event-loop metrics
|
|
98
|
-
| `src/extension/process-scanner.ts` | Child process detection via ps + PGID tracking
|
|
99
|
-
| `src/client/components/ProcessList.tsx` | Session card process list with elapsed time and
|
|
243
|
+
| `src/extension/server-auto-start.ts` | mDNS-first → health check → auto-start with concurrent launch detection |
|
|
244
|
+
| `src/shared/session-meta.ts` | Session metadata sidecar (.meta.json) read/write helpers |
|
|
245
|
+
| `src/extension/process-metrics.ts` | Lightweight CPU/memory/event-loop metrics for heartbeats |
|
|
246
|
+
| `src/extension/process-scanner.ts` | Child process detection via ps + PGID tracking and PGID-based kill |
|
|
247
|
+
| `src/client/components/ProcessList.tsx` | Session card process list with elapsed time and kill button |
|
|
100
248
|
| `src/extension/git-info.ts` | Git branch/remote/PR detection (polled every 30s) |
|
|
101
249
|
| `src/extension/git-link-builder.ts` | Git remote URL parsing and platform-specific links |
|
|
102
250
|
| `src/server/git-operations.ts` | Server-side git commands: branch listing, checkout, init, stash pop |
|
|
103
251
|
| `src/client/components/BranchPicker.tsx` | Typeahead branch picker with keyboard navigation |
|
|
104
252
|
| `src/client/components/BranchSwitchDialog.tsx` | Checkout orchestration: dirty-state stash, pop prompt |
|
|
105
253
|
| `src/client/lib/git-api.ts` | Client-side fetch helpers for git API endpoints |
|
|
106
|
-
| `src/client/hooks/useImagePaste.ts` | Reusable clipboard-image-paste hook
|
|
107
|
-
| `src/extension/prompt-bus.ts` | PromptBus — unified prompt routing to registered adapters
|
|
108
|
-
| `src/extension/dashboard-default-adapter.ts` | Built-in PromptBus adapter
|
|
109
|
-
| `src/extension/ui-modules.ts` | Extension UI System
|
|
110
|
-
| `src/client/components/extension-ui/GenericExtensionDialog.tsx` | Phase-1 modal renderer for `ExtensionUiModule
|
|
111
|
-
| `src/client/components/extension-ui/decorator-utils.ts` | Phase-2 helper
|
|
112
|
-
| `src/client/components/extension-ui/FooterSegmentSlot.tsx` | Phase-2 slot
|
|
113
|
-
| `src/client/components/extension-ui/AgentMetricSlot.tsx` | Phase-2 slot
|
|
114
|
-
| `src/client/components/extension-ui/BreadcrumbSlot.tsx` | Phase-2 slot
|
|
115
|
-
| `src/client/components/extension-ui/GateSlot.tsx` | Phase-2 slot
|
|
116
|
-
| `src/client/components/extension-ui/ToastSlot.tsx` | Phase-2 slot
|
|
117
|
-
| `src/client/lib/mdi-icon-lookup.ts` | `resolveMdiIcon(key)
|
|
118
|
-
| `src/client/lib/prompt-component-registry.ts` | Client
|
|
119
|
-
| `src/extension/ask-user-tool.ts` | `ask_user` tool registration (
|
|
120
|
-
| `src/extension/multiselect-polyfill.ts` | `polyfillMultiselect
|
|
121
|
-
| `src/extension/multiselect-list.ts` | `MultiSelectList`
|
|
122
|
-
| `src/shared/openspec-activity-detector.ts` | Detects OpenSpec activity from tool events;
|
|
123
|
-
| `src/shared/openspec-poller.ts` | OpenSpec CLI polling
|
|
124
|
-
| `src/shared/openspec-design-evidence.ts` | Pure rule evaluator +
|
|
125
|
-
| `src/shared/openspec-specs-evidence.ts` | Pure rule evaluator +
|
|
126
|
-
| `.pi/skills/openspec-shared/scripts/effective-status.sh` | Bash wrapper around `openspec status
|
|
254
|
+
| `src/client/hooks/useImagePaste.ts` | Reusable clipboard-image-paste hook (controlled/uncontrolled modes) |
|
|
255
|
+
| `src/extension/prompt-bus.ts` | PromptBus — unified prompt routing to registered adapters |
|
|
256
|
+
| `src/extension/dashboard-default-adapter.ts` | Built-in PromptBus adapter rendering prompts as dashboard chat dialogs |
|
|
257
|
+
| `src/extension/ui-modules.ts` | Extension UI System Phase 1+2: refresh, throttle, manage |
|
|
258
|
+
| `src/client/components/extension-ui/GenericExtensionDialog.tsx` | Phase-1 modal renderer for `ExtensionUiModule` (table/grid/form) |
|
|
259
|
+
| `src/client/components/extension-ui/decorator-utils.ts` | Phase-2 helper `decoratorsOfKind` filter over `Session.uiDecorators` |
|
|
260
|
+
| `src/client/components/extension-ui/FooterSegmentSlot.tsx` | Phase-2 slot rendering footer-segment descriptors as inline pills |
|
|
261
|
+
| `src/client/components/extension-ui/AgentMetricSlot.tsx` | Phase-2 slot rendering agent-metric descriptors inside FlowAgentCard |
|
|
262
|
+
| `src/client/components/extension-ui/BreadcrumbSlot.tsx` | Phase-2 slot rendering breadcrumb as step indicator at FlowDashboard top |
|
|
263
|
+
| `src/client/components/extension-ui/GateSlot.tsx` | Phase-2 slot aggregating gate descriptors per flowId (most-restrictive-wins) |
|
|
264
|
+
| `src/client/components/extension-ui/ToastSlot.tsx` | Phase-2 slot rendering toast descriptors top-right with auto-dismiss + cap-of-5 |
|
|
265
|
+
| `src/client/lib/mdi-icon-lookup.ts` | `resolveMdiIcon(key)` against `@mdi/js` exports; null on unknown key |
|
|
266
|
+
| `src/client/lib/prompt-component-registry.ts` | Client component registry for prompt types (placement, component) |
|
|
267
|
+
| `src/extension/ask-user-tool.ts` | `ask_user` tool registration (confirm/select/multiselect/input/batch via flat oneOf schema) |
|
|
268
|
+
| `src/extension/multiselect-polyfill.ts` | `polyfillMultiselect` — bridge-patched multiselect with TUI fallback |
|
|
269
|
+
| `src/extension/multiselect-list.ts` | `MultiSelectList` pi-tui Component (↑↓/Space/Enter/Esc keyboard contract) |
|
|
270
|
+
| `src/shared/openspec-activity-detector.ts` | Detects OpenSpec activity from tool events; rejects flag-shaped tokens |
|
|
271
|
+
| `src/shared/openspec-poller.ts` | OpenSpec CLI polling: `buildOpenSpecData` with optional design + specs probe factories |
|
|
272
|
+
| `src/shared/openspec-design-evidence.ts` | Pure rule evaluator + fs probe for OpenSpec design-artifact override (R1/R2/R3) |
|
|
273
|
+
| `src/shared/openspec-specs-evidence.ts` | Pure rule evaluator + fs probe for OpenSpec specs-artifact override |
|
|
274
|
+
| `.pi/skills/openspec-shared/scripts/effective-status.sh` | Bash wrapper around `openspec status` applying R1/R2/R3 promotion |
|
|
127
275
|
| `src/shared/state-replay.ts` | Synthesizes events from pi entries (shared, used by server + bridge) |
|
|
128
|
-
| `src/shared/dashboard-plugin/slot-types.ts` | Frozen slot taxonomy: `SlotId
|
|
129
|
-
| `src/shared/dashboard-plugin/manifest-types.ts` | `PluginManifest` and `PluginClaim` interfaces
|
|
130
|
-
| `src/shared/dashboard-plugin/slot-props.ts` | `SlotPropsMap` and `SlotProps<SlotId>`
|
|
131
|
-
| `src/shared/dashboard-plugin/plugin-status.ts` | `PluginStatus` (for `/api/health`) and `PluginConfigUpdate` (
|
|
132
|
-
| `src/shared/plugin-bridge-register.ts` | Plugin bridge entry
|
|
133
|
-
| `packages/dashboard-plugin-runtime/src/slot-registry.ts` | `createSlotRegistry()`
|
|
134
|
-
| `packages/dashboard-plugin-runtime/src/manifest-validator.ts` | Hand-rolled manifest validator
|
|
135
|
-
| `packages/dashboard-plugin-runtime/src/plugin-context.tsx` |
|
|
136
|
-
| `packages/dashboard-plugin-runtime/src/slot-consumers.tsx` | One component per slot id
|
|
137
|
-
| `packages/dashboard-plugin-runtime/src/slot-error-boundary.tsx` | Per-claim React error boundary
|
|
138
|
-
| `packages/dashboard-plugin-runtime/src/vite-plugin/index.ts` | `viteDashboardPluginsPlugin
|
|
139
|
-
| `packages/dashboard-plugin-runtime/src/server/loader.ts` | `discoverPlugins
|
|
140
|
-
| `packages/dashboard-plugin-runtime/src/server/server-context.ts` | `createServerPluginContext
|
|
141
|
-
| `packages/dashboard-plugin-runtime/src/server/config-validator.ts` |
|
|
142
|
-
| `packages/dashboard-plugin-runtime/src/server/plugin-status-store.ts` | In-memory `PluginStatusStore`
|
|
143
|
-
| `src/server/routes/plugin-config-routes.ts` | `POST /api/config/plugins/:id` — validates
|
|
144
|
-
| `packages/demo-plugin/` | Private
|
|
276
|
+
| `src/shared/dashboard-plugin/slot-types.ts` | Frozen slot taxonomy: `SlotId`, `Multiplicity`, `PayloadTier`, `SLOT_DEFINITIONS` |
|
|
277
|
+
| `src/shared/dashboard-plugin/manifest-types.ts` | `PluginManifest` and `PluginClaim` interfaces |
|
|
278
|
+
| `src/shared/dashboard-plugin/slot-props.ts` | `SlotPropsMap` and `SlotProps<SlotId>` typed prop contracts per slot id |
|
|
279
|
+
| `src/shared/dashboard-plugin/plugin-status.ts` | `PluginStatus` (for `/api/health`) and `PluginConfigUpdate` (WS payload) |
|
|
280
|
+
| `src/shared/plugin-bridge-register.ts` | Plugin bridge entry registration in pi `settings.json#dashboardPluginBridges` |
|
|
281
|
+
| `packages/dashboard-plugin-runtime/src/slot-registry.ts` | `createSlotRegistry()` typed `Map<SlotId, ClaimEntry[]>` with filter helpers |
|
|
282
|
+
| `packages/dashboard-plugin-runtime/src/manifest-validator.ts` | Hand-rolled manifest validator throwing `ManifestValidationError` |
|
|
283
|
+
| `packages/dashboard-plugin-runtime/src/plugin-context.tsx` | PluginContextProvider + per-plugin hook layer (config/log/send/router/registry) |
|
|
284
|
+
| `packages/dashboard-plugin-runtime/src/slot-consumers.tsx` | One component per slot id, wrapping contributions in `SlotErrorBoundary` |
|
|
285
|
+
| `packages/dashboard-plugin-runtime/src/slot-error-boundary.tsx` | Per-claim React error boundary; isolates failing claim from siblings |
|
|
286
|
+
| `packages/dashboard-plugin-runtime/src/vite-plugin/index.ts` | `viteDashboardPluginsPlugin` — generates plugin-registry.tsx, watches manifests |
|
|
287
|
+
| `packages/dashboard-plugin-runtime/src/server/loader.ts` | `discoverPlugins` + `loadServerEntries` (failure-isolated) + `getPluginStatusStore` |
|
|
288
|
+
| `packages/dashboard-plugin-runtime/src/server/server-context.ts` | `createServerPluginContext` — per-plugin scoped logger + config |
|
|
289
|
+
| `packages/dashboard-plugin-runtime/src/server/config-validator.ts` | Ajv JSON-Schema 7 validation for plugin config writes |
|
|
290
|
+
| `packages/dashboard-plugin-runtime/src/server/plugin-status-store.ts` | In-memory `PluginStatusStore` for `/api/health.plugins[]` |
|
|
291
|
+
| `src/server/routes/plugin-config-routes.ts` | `POST /api/config/plugins/:id` — validates and merges plugin config (auth-gated) |
|
|
292
|
+
| `packages/demo-plugin/` | Private fixture plugin exercising settings-section + tool-renderer slots |
|
|
293
|
+
| `packages/dashboard-plugin-skill/` | Pi skill `dashboard-plugin-scaffold`. Modes: `new` (scaffold packages/<id>-plugin/), `augment` (inject manifest + src/dashboard/ into pi-extension at cwd). |
|
|
145
294
|
| `src/shared/stats-extractor.ts` | Extracts token/cost stats from turn_end events |
|
|
146
|
-
| `src/server/session-stats-reader.ts` | Reads cumulative stats + context usage from session JSONL files
|
|
147
|
-
| `src/server/server.ts` | HTTP + WebSocket server (composes route modules + wiring)
|
|
295
|
+
| `src/server/session-stats-reader.ts` | Reads cumulative stats + context usage from session JSONL files |
|
|
296
|
+
| `src/server/server.ts` | HTTP + WebSocket server (composes route modules + wiring) |
|
|
148
297
|
| `src/server/routes/session-routes.ts` | REST routes: sessions, events, session-diff |
|
|
149
298
|
| `src/server/routes/git-routes.ts` | REST routes: git branches, checkout, init, stash-pop |
|
|
150
|
-
| `src/server/routes/file-routes.ts` | REST routes: file read, browse
|
|
299
|
+
| `src/server/routes/file-routes.ts` | REST routes: file read, browse, browse-flags, browse-mkdir, readme, pinned-dirs |
|
|
151
300
|
| `src/server/routes/openspec-routes.ts` | REST routes: openspec-archive, pi-resources, pi-resource-file |
|
|
152
301
|
| `src/server/routes/system-routes.ts` | REST routes: config, health, shutdown, tunnel, editors |
|
|
153
|
-
| `src/server/event-wiring.ts` | Pi gateway → browser gateway event forwarding
|
|
302
|
+
| `src/server/event-wiring.ts` | Pi gateway → browser gateway event forwarding; UI cache + activity stamping + unread trigger |
|
|
154
303
|
| `src/server/idle-timer.ts` | Auto-shutdown idle timer with sleep-wake resilience |
|
|
155
304
|
| `src/server/session-bootstrap.ts` | Startup session discovery and OpenSpec polling init |
|
|
156
305
|
| `src/server/pi-gateway.ts` | Extension WebSocket gateway (port 9999) |
|
|
157
306
|
| `src/server/browser-gateway.ts` | Browser WebSocket gateway (dispatches to handler modules) |
|
|
158
307
|
| `src/server/browser-handlers/handler-context.ts` | Shared context type for browser message handlers |
|
|
159
|
-
| `src/server/browser-handlers/subscription-handler.ts` | Subscribe/unsubscribe with
|
|
160
|
-
| `src/server/browser-handlers/session-action-handler.ts` | Send prompt, abort, resume, spawn, shutdown, force kill, flow control
|
|
161
|
-
| `src/server/browser-handlers/session-action-helpers.ts` | Pure helpers for session-action-handler
|
|
162
|
-
| `src/client/components/ImageLightbox.tsx` | Full-size image lightbox with zoom/pan
|
|
308
|
+
| `src/server/browser-handlers/subscription-handler.ts` | Subscribe/unsubscribe with batched replay; replays UI state |
|
|
309
|
+
| `src/server/browser-handlers/session-action-handler.ts` | Send prompt, abort, resume, spawn, shutdown, force kill, flow control |
|
|
310
|
+
| `src/server/browser-handlers/session-action-helpers.ts` | Pure helpers for session-action-handler (`shouldInterceptReload`) |
|
|
311
|
+
| `src/client/components/ImageLightbox.tsx` | Full-size image lightbox with zoom/pan, Esc/backdrop close |
|
|
163
312
|
| `src/client/components/CollapsedToolGroup.tsx` | Collapsed group of repeated tool calls with expand toggle |
|
|
164
313
|
| `src/client/lib/group-tool-calls.ts` | Groups consecutive identical tool calls for chat display |
|
|
165
|
-
| `src/client/lib/collapse-retried-errors.ts` |
|
|
166
|
-
| `src/client/components/RetriedErrorBadge.tsx` | One-line
|
|
167
|
-
| `src/server/browser-handlers/session-meta-handler.ts` | Rename, hide, unhide, attach/detach proposal, fetch, list
|
|
168
|
-
| `src/server/proposal-attach-naming.ts` | Pure
|
|
314
|
+
| `src/client/lib/collapse-retried-errors.ts` | Pure helpers `findRetriedErrorIds` + `findActiveInteractiveToolResultIds` for chat dedup |
|
|
315
|
+
| `src/client/components/RetriedErrorBadge.tsx` | One-line "tool failed — retried" pill replacing collapsed errored ToolCallStep |
|
|
316
|
+
| `src/server/browser-handlers/session-meta-handler.ts` | Rename, hide, unhide, attach/detach proposal, fetch, list |
|
|
317
|
+
| `src/server/proposal-attach-naming.ts` | Pure helpers `attachRenameTarget` + `detachShouldClearName` (idempotent auto-rename) |
|
|
169
318
|
| `src/server/browser-handlers/terminal-handler.ts` | Create, kill, rename terminals |
|
|
170
319
|
| `src/server/browser-handlers/directory-handler.ts` | Pin/unpin dirs, reorder, openspec refresh, pi-gateway forwards |
|
|
171
320
|
| `src/server/memory-event-store.ts` | In-memory event buffer with LRU eviction, per-session cap, payload truncation |
|
|
172
321
|
| `src/server/memory-session-manager.ts` | Pure in-memory session registry |
|
|
173
|
-
| `src/client/components/FolderOpenSpecSection.tsx` | Folder-level OpenSpec UI:
|
|
174
|
-
| `src/server/pending-attach-registry.ts` | In-memory FIFO queue of pending `attachProposal` intents per cwd
|
|
175
|
-
| `src/client/components/ArchiveBrowserView.tsx` | Searchable archive browser: date-grouped list, two-level nav
|
|
176
|
-
| `src/client/hooks/useArchiveListing.ts` | Fetch hook + pure helpers
|
|
177
|
-
| `src/server/openspec-archive.ts` | Scans `openspec/changes/archive/` and returns
|
|
322
|
+
| `src/client/components/FolderOpenSpecSection.tsx` | Folder-level OpenSpec UI: change list, refresh, bulk archive, attach-spawn |
|
|
323
|
+
| `src/server/pending-attach-registry.ts` | In-memory FIFO queue of pending `attachProposal` intents per cwd (60s TTL) |
|
|
324
|
+
| `src/client/components/ArchiveBrowserView.tsx` | Searchable archive browser: date-grouped list, two-level nav |
|
|
325
|
+
| `src/client/hooks/useArchiveListing.ts` | Fetch hook + pure helpers for archive endpoint |
|
|
326
|
+
| `src/server/openspec-archive.ts` | Scans `openspec/changes/archive/` and returns ArchiveEntry list |
|
|
178
327
|
| `src/client/components/SessionOpenSpecActions.tsx` | Session-level OpenSpec: searchable attach dialog, action buttons, detach |
|
|
179
328
|
| `src/client/components/DialogPortal.tsx` | Portal wrapper rendering dialogs at document.body with scroll lock |
|
|
180
329
|
| `src/client/components/PinDirectoryDialog.tsx` | Dialog to pin a directory (wraps PathPicker) |
|
|
181
330
|
| `src/client/components/PathPicker.tsx` | Reusable keyboard-first path picker with typeahead directory list |
|
|
182
331
|
| `src/client/lib/browse-api.ts` | Client-side browse API helper for PathPicker |
|
|
183
|
-
| `src/server/browse.ts` | Directory listing + classification for the browse API
|
|
184
|
-
| `src/server/pi-resource-scanner.ts` | Discovers pi extensions, skills, prompts from local
|
|
185
|
-
| `src/server/package-manager-wrapper.ts` |
|
|
186
|
-
| `src/server/package-source-helpers.ts` | Pure
|
|
187
|
-
| `src/shared/tool-registry/registry.ts` | `ToolRegistry`
|
|
188
|
-
| `src/shared/tool-registry/definitions.ts` | Registers
|
|
189
|
-
| `packages/shared/bin/pi-dashboard-resolve-tool.cjs` | Shell-callable resolver wrapper
|
|
190
|
-
| `src/shared/__tests__/no-hardcoded-node-modules-paths.test.ts` | Repo-
|
|
191
|
-
| `src/shared/tool-registry/strategies.ts` | Reusable resolution strategies
|
|
192
|
-
| `src/shared/tool-registry/overrides.ts` | Read/write `~/.pi/dashboard/tool-overrides.json`
|
|
193
|
-
| `src/shared/tool-registry/types.ts` | `ToolDefinition`, `Strategy`, `
|
|
332
|
+
| `src/server/browse.ts` | Directory listing + classification for the browse API |
|
|
333
|
+
| `src/server/pi-resource-scanner.ts` | Discovers pi extensions, skills, prompts from local/global/package sources |
|
|
334
|
+
| `src/server/package-manager-wrapper.ts` | Wraps pi's DefaultPackageManager; adds `move()` for scope-to-scope moves |
|
|
335
|
+
| `src/server/package-source-helpers.ts` | Pure `parseSourceKind` + `computeIdentity` (npm/git/https/path identity rules) |
|
|
336
|
+
| `src/shared/tool-registry/registry.ts` | `ToolRegistry` — single-source resolver for every external binary/module |
|
|
337
|
+
| `src/shared/tool-registry/definitions.ts` | Registers standard tool set with ordered strategy chains |
|
|
338
|
+
| `packages/shared/bin/pi-dashboard-resolve-tool.cjs` | Shell-callable resolver wrapper (CommonJS, no TS deps) for build-time tools |
|
|
339
|
+
| `src/shared/__tests__/no-hardcoded-node-modules-paths.test.ts` | Repo-lint: forbid hardcoded `node_modules/electron` / `node_modules/node-pty` |
|
|
340
|
+
| `src/shared/tool-registry/strategies.ts` | Reusable resolution strategies (override / managed / npm-global / where / bare-import) |
|
|
341
|
+
| `src/shared/tool-registry/overrides.ts` | Read/write `~/.pi/dashboard/tool-overrides.json` with atomic write |
|
|
342
|
+
| `src/shared/tool-registry/types.ts` | `ToolDefinition`, `Strategy`, `Resolution`, error classes |
|
|
194
343
|
| `src/shared/tool-registry/index.ts` | Barrel export + `getDefaultRegistry()` singleton accessor |
|
|
195
|
-
| `src/server/routes/tool-routes.ts` | REST routes
|
|
196
|
-
| `packages/shared/src/bootstrap-install.ts` | Shared bootstrap installer
|
|
197
|
-
| `packages/server/src/bootstrap-state.ts` | In-memory bootstrap state store (
|
|
198
|
-
| `packages/server/src/routes/bootstrap-routes.ts` | REST routes:
|
|
199
|
-
| `packages/server/src/bootstrap-queue.ts` | In-memory ticket queue
|
|
200
|
-
| `packages/server/src/pi-version-skew.ts` | Pi compatibility range reader
|
|
201
|
-
| `packages/client/src/hooks/useBootstrapStatus.ts` | Client hook for bootstrap state
|
|
202
|
-
| `packages/client/src/components/BootstrapBanner.tsx` | Banner
|
|
203
|
-
| `src/client/lib/tools-api.ts` | Client-side fetch helpers for `/api/tools*`
|
|
204
|
-
| `src/client/components/ToolsSection.tsx` | Settings → General →
|
|
205
|
-
| `src/server/npm-search-proxy.ts` | Cached proxy for npm registry search (`keywords:pi-package`) and README
|
|
344
|
+
| `src/server/routes/tool-routes.ts` | REST routes for `/api/tools*` (list, rescan, override, diagnostics) |
|
|
345
|
+
| `packages/shared/src/bootstrap-install.ts` | Shared bootstrap installer for pi/openspec/tsx into `~/.pi-dashboard/` |
|
|
346
|
+
| `packages/server/src/bootstrap-state.ts` | In-memory bootstrap state store (status/progress/error/version/compatibility) |
|
|
347
|
+
| `packages/server/src/routes/bootstrap-routes.ts` | REST routes: bootstrap status, upgrade-pi, retry |
|
|
348
|
+
| `packages/server/src/bootstrap-queue.ts` | In-memory ticket queue, flushes on bootstrap-state ready transition |
|
|
349
|
+
| `packages/server/src/pi-version-skew.ts` | Pi compatibility range reader + comparator + bootstrap compatibility writer |
|
|
350
|
+
| `packages/client/src/hooks/useBootstrapStatus.ts` | Client hook for bootstrap state (fetch + WS subscribe) |
|
|
351
|
+
| `packages/client/src/components/BootstrapBanner.tsx` | Banner above MobileShell for installing/failed/upgrade states |
|
|
352
|
+
| `src/client/lib/tools-api.ts` | Client-side fetch helpers for `/api/tools*` |
|
|
353
|
+
| `src/client/components/ToolsSection.tsx` | Settings → General → Tools section (per-tool status/source/override UI) |
|
|
354
|
+
| `src/server/npm-search-proxy.ts` | Cached proxy for npm registry search (`keywords:pi-package`) and README |
|
|
206
355
|
| `src/server/routes/package-routes.ts` | REST routes: search, readme, installed, install, remove, update, check-updates |
|
|
207
356
|
| `src/client/components/SortablePinnedGroup.tsx` | Drag-to-reorder wrapper for pinned directory groups |
|
|
208
357
|
| `src/server/preferences-store.ts` | Global UI preferences (pinned dirs, session order) in `preferences.json` |
|
|
209
358
|
| `src/server/meta-persistence.ts` | Per-session debounced `.meta.json` writer |
|
|
210
|
-
| `src/server/session-scanner.ts` | Startup session discovery
|
|
359
|
+
| `src/server/session-scanner.ts` | Startup session discovery scanning `~/.pi/agent/sessions/` |
|
|
211
360
|
| `src/server/migrate-persistence.ts` | One-time migration from `sessions.json` + `state.json` to `.meta.json` |
|
|
212
|
-
| `src/server/session-order-manager.ts` | Per-cwd session ordering with persistence
|
|
213
|
-
| `src/server/directory-service.ts` | Server-side session discovery, event loading,
|
|
361
|
+
| `src/server/session-order-manager.ts` | Per-cwd session ordering with persistence; `moveToFront` semantic |
|
|
362
|
+
| `src/server/directory-service.ts` | Server-side session discovery, event loading, OpenSpec polling (mtime-gated) |
|
|
214
363
|
| `src/server/pending-fork-registry.ts` | Tracks pending fork operations for session placement |
|
|
215
364
|
| `src/server/pending-resume-registry.ts` | Queues prompts for auto-resume of ended sessions |
|
|
216
|
-
| `src/server/pending-resume-intent-registry.ts` | In-memory
|
|
217
|
-
| `src/server/reattach-placement.ts` | Pure `decideReattachAction
|
|
365
|
+
| `src/server/pending-resume-intent-registry.ts` | In-memory user-resume intent map (60s TTL); 4-way intent contract on reattach |
|
|
366
|
+
| `src/server/reattach-placement.ts` | Pure `decideReattachAction` + I/O `applyReattachPolicy` for bridge-reattach placement |
|
|
218
367
|
| `src/server/json-store.ts` | Atomic JSON file read/write helpers |
|
|
219
|
-
| `src/server/process-manager.ts` | Session spawning
|
|
220
|
-
| `src/shared/platform/detached-spawn.ts` |
|
|
221
|
-
| `src/shared/platform/node-version-check.ts` |
|
|
222
|
-
| `src/shared/platform/preload-fastify.ts` |
|
|
223
|
-
| `packages/server/preload-fastify.cjs` |
|
|
224
|
-
| `src/shared/platform/spawn-mechanism.ts` | `SpawnMechanism` enum
|
|
225
|
-
| `src/shared/platform/process-identify.ts` | `findPidByMarker` + `isProcessLikePi` + `isPiCommandLine`
|
|
226
|
-
| `src/shared/platform/process.ts` |
|
|
227
|
-
| `src/shared/platform/node-spawn.ts` |
|
|
228
|
-
| `src/shared/__tests__/no-raw-node-import.test.ts` | Repo-
|
|
229
|
-
| `src/shared/__tests__/no-direct-process-kill.test.ts` | Repo-
|
|
230
|
-
| `src/shared/__tests__/bootstrap/` | In-memory bootstrap resolution harness (memfs-backed)
|
|
368
|
+
| `src/server/process-manager.ts` | Session spawning via `selectMechanism` → tmux/wt/wsl-tmux/headless |
|
|
369
|
+
| `src/shared/platform/detached-spawn.ts` | `spawnDetached` + `waitForNoCrash` + `waitForReady` primitives |
|
|
370
|
+
| `src/shared/platform/node-version-check.ts` | `isKnownBadNode` + `buildNodeVersionWarning` (nodejs/node#58515 ranges) |
|
|
371
|
+
| `src/shared/platform/preload-fastify.ts` | Resolver returning native path to `preload-fastify.cjs` for `--require` injection |
|
|
372
|
+
| `packages/server/preload-fastify.cjs` | CJS preload populating `require.cache` with fastify + ajv-compiler |
|
|
373
|
+
| `src/shared/platform/spawn-mechanism.ts` | `SpawnMechanism` enum + `selectMechanism` selector + `sessionFlagsToArgv` |
|
|
374
|
+
| `src/shared/platform/process-identify.ts` | `findPidByMarker` + `isProcessLikePi` + `isPiCommandLine` |
|
|
375
|
+
| `src/shared/platform/process.ts` | Sole source of process termination + liveness primitives (kill/alive/group) |
|
|
376
|
+
| `src/shared/platform/node-spawn.ts` | Sole source of `node --import <loader> <entry>` argv construction |
|
|
377
|
+
| `src/shared/__tests__/no-raw-node-import.test.ts` | Repo-lint: forbid raw `--import`/`--loader` argv outside `node-spawn.ts` |
|
|
378
|
+
| `src/shared/__tests__/no-direct-process-kill.test.ts` | Repo-lint: forbid `process.kill(` outside `platform/` |
|
|
379
|
+
| `src/shared/__tests__/bootstrap/` | In-memory bootstrap resolution harness (memfs-backed); 1080-cell scenario cube |
|
|
231
380
|
| `src/server/editor-registry.ts` | Detects available native editors (running processes + CLI) |
|
|
232
|
-
| `src/server/editor-manager.ts` | Lifecycle manager for code-server child processes
|
|
381
|
+
| `src/server/editor-manager.ts` | Lifecycle manager for code-server child processes |
|
|
233
382
|
| `src/server/editor-proxy.ts` | Reverse proxy for `/editor/:id/*` to code-server instances |
|
|
234
383
|
| `src/server/editor-detection.ts` | Auto-detect code-server/openvscode-server binary on PATH |
|
|
235
384
|
| `src/server/routes/editor-routes.ts` | REST routes: editor start, stop, heartbeat, status, detect |
|
|
236
|
-
| `src/server/event-status-extraction.ts` | Extracts session status/tool updates
|
|
237
|
-
| `src/server/viewed-session-tracker.ts` |
|
|
385
|
+
| `src/server/event-status-extraction.ts` | Extracts session status/tool updates; hosts `isActivityEvent` + `isUnreadTrigger` |
|
|
386
|
+
| `src/server/viewed-session-tracker.ts` | Per-browser viewed-session map; gates unread-trigger stamping |
|
|
238
387
|
| `src/server/headless-pid-registry.ts` | Maps headless child PIDs to session IDs |
|
|
239
388
|
| `src/server/auth.ts` | OAuth2 authentication: provider registry, JWT helpers, user allowlist |
|
|
240
389
|
| `src/server/provider-auth-handlers.ts` | Pi provider OAuth handlers (Anthropic, Codex, GitHub Copilot, Gemini CLI, Antigravity) |
|
|
241
|
-
| `src/server/provider-auth-storage.ts` | Read/write
|
|
390
|
+
| `src/server/provider-auth-storage.ts` | Read/write `~/.pi/agent/auth.json` with lockfile for pi provider credentials |
|
|
242
391
|
| `src/server/routes/provider-auth-routes.ts` | REST routes: provider OAuth authorize/exchange/callback, device-code, API key CRUD |
|
|
243
|
-
| `src/server/routes/provider-routes.ts` | REST routes: custom LLM provider CRUD
|
|
244
|
-
| `src/server/provider-probe.ts` | Pure per-API
|
|
245
|
-
| `src/extension/provider-register.ts` | Reads
|
|
246
|
-
| `src/client/lib/providers-api.ts` | Client
|
|
392
|
+
| `src/server/routes/provider-routes.ts` | REST routes: custom LLM provider CRUD + connection probe |
|
|
393
|
+
| `src/server/provider-probe.ts` | Pure per-API probe builders + I/O `probeProvider` (8s timeout, no apiKey echo) |
|
|
394
|
+
| `src/extension/provider-register.ts` | Reads `providers.json`, calls `pi.registerProvider`, hot-reload on credentials change |
|
|
395
|
+
| `src/client/lib/providers-api.ts` | Client fetch helper for `/api/providers/test` connection probe |
|
|
247
396
|
| `src/client/components/ProviderAuthSection.tsx` | Settings section: OAuth login buttons, device-code modal, API key inputs |
|
|
248
397
|
| `src/server/auth-plugin.ts` | Fastify plugin: auth routes, onRequest hook, WS upgrade validation |
|
|
249
|
-
| `src/server/config-api.ts` | Config REST API: read (redacted), write (partial merge), secret preservation
|
|
398
|
+
| `src/server/config-api.ts` | Config REST API: read (redacted), write (partial merge), secret preservation |
|
|
250
399
|
| `src/client/components/SettingsPanel.tsx` | Settings UI: all dashboard config fields, grouped form, save to server |
|
|
251
400
|
| `src/client/hooks/useAuthStatus.ts` | Client auth status hook and login redirect helper |
|
|
252
|
-
| `src/server/localhost-guard.ts` | Network access guard
|
|
401
|
+
| `src/server/localhost-guard.ts` | Network access guard (loopback/trusted/authenticated, CIDR/wildcard bypass) |
|
|
253
402
|
| `src/server/server-pid.ts` | PID file management for daemon mode |
|
|
254
|
-
| `src/client/components/ServerSelector.tsx` | Server selector dropdown
|
|
255
|
-
| `packages/client/src/lib/staging-socket.ts` | `openStagingSocket(url, {timeoutMs})
|
|
256
|
-
| `packages/client/src/lib/server-switch.ts` | `performServerSwitch
|
|
257
|
-
| `packages/client/src/components/ConnectionStatusBanner.tsx` | Disconnection banner
|
|
403
|
+
| `src/client/components/ServerSelector.tsx` | Server selector dropdown (open-only probing, transactional staging-socket switch) |
|
|
404
|
+
| `packages/client/src/lib/staging-socket.ts` | `openStagingSocket(url, {timeoutMs})` — single-settle WS staging helper |
|
|
405
|
+
| `packages/client/src/lib/server-switch.ts` | `performServerSwitch` two-phase transaction (stage → commit) |
|
|
406
|
+
| `packages/client/src/components/ConnectionStatusBanner.tsx` | Disconnection banner (>3s non-OPEN, hidden during staging switch) |
|
|
258
407
|
| `src/client/components/KnownServersSection.tsx` | Settings section: list/add/remove persisted known remote servers |
|
|
259
|
-
| `src/client/components/NetworkDiscoverySection.tsx` | Settings section: mDNS network scan with
|
|
260
|
-
| `src/client/lib/parse-host-input.ts` | Pure
|
|
408
|
+
| `src/client/components/NetworkDiscoverySection.tsx` | Settings section: mDNS network scan with manual-add fallback on empty result |
|
|
409
|
+
| `src/client/lib/parse-host-input.ts` | Pure `parseHostInput(input, defaultPort)` accepting URLs/host:port/IPv6 |
|
|
261
410
|
| `src/client/lib/known-servers-api.ts` | Client-side fetch helpers for known servers CRUD and discovery endpoints |
|
|
262
411
|
| `src/server/routes/known-servers-routes.ts` | REST routes: known servers CRUD, on-demand mDNS discovery scan |
|
|
263
412
|
| `src/server/terminal-manager.ts` | PTY lifecycle, ring buffer, spawn/attach/kill terminals |
|
|
264
413
|
| `src/server/terminal-gateway.ts` | Binary WebSocket upgrade handler for `/ws/terminal/:id` |
|
|
265
414
|
| `scripts/fix-pty-permissions.cjs` | Postinstall: fix node-pty spawn-helper execute permissions |
|
|
266
|
-
| `src/server/tunnel.ts` | Zrok tunnel with reserved shares
|
|
267
|
-
| `src/client/components/TunnelButton.tsx` | Unified tunnel/QR button
|
|
268
|
-
| `src/client/components/QrCodeDialog.tsx` | QR code dialog showing tunnel URL
|
|
415
|
+
| `src/server/tunnel.ts` | Zrok tunnel with reserved shares, binary detection, PID tracking |
|
|
416
|
+
| `src/client/components/TunnelButton.tsx` | Unified tunnel/QR button (icon state varies by tunnel status) |
|
|
417
|
+
| `src/client/components/QrCodeDialog.tsx` | QR code dialog showing tunnel URL with copy/disconnect/setup |
|
|
269
418
|
| `public/manifest.json` | PWA web app manifest for installability |
|
|
270
419
|
| `public/sw.js` | Minimal service worker for PWA installability |
|
|
271
|
-
| `src/client/components/ZrokInstallGuide.tsx` | OS-aware zrok installation guide view
|
|
272
|
-
| `src/server/cli.ts` | CLI entry
|
|
273
|
-
| `src/server/restart-helper.ts` | Cross-platform `/api/restart` orchestrator
|
|
274
|
-
| `src/shared/resolve-jiti.ts` | Resolves pi's jiti register hook as a `file://` URL
|
|
275
|
-
| `src/shared/platform/paths.ts` | OS-aware path primitives
|
|
276
|
-
| `src/client/lib/session-grouping.ts` |
|
|
277
|
-
| `src/shared/platform/` | Unified cross-OS primitives
|
|
420
|
+
| `src/client/components/ZrokInstallGuide.tsx` | OS-aware zrok installation guide view |
|
|
421
|
+
| `src/server/cli.ts` | CLI entry: start/stop/restart/status; `cmdRestart` delegates to `/api/restart` when up |
|
|
422
|
+
| `src/server/restart-helper.ts` | Cross-platform `/api/restart` orchestrator (detached node-built-ins-only spawner) |
|
|
423
|
+
| `src/shared/resolve-jiti.ts` | Resolves pi's jiti register hook as a `file://` URL |
|
|
424
|
+
| `src/shared/platform/paths.ts` | OS-aware path primitives (`normalizePath`, `samePath`, `parsePathInput`) |
|
|
425
|
+
| `src/client/lib/session-grouping.ts` | Sessions grouped by directory; `resolveSessionGroupPath` (pin > jjState.workspaceRoot > cwd) |
|
|
426
|
+
| `src/shared/platform/` | Unified cross-OS primitives barrel (exec/runner/git/openspec/npm/process/binary-lookup/...) |
|
|
278
427
|
| `src/shared/rest-api.ts` | REST API type definitions |
|
|
279
|
-
|
|
280
|
-
| `.pi/skills/
|
|
281
|
-
| `.pi/skills/spec-coherence-check/SKILL.md` | Skill: sweep proposals for staleness, conflicts, obsolescence against codebase |
|
|
428
|
+
| `.pi/skills/release-cut/SKILL.md` | Release-cut skill: bump versions, promote CHANGELOG, tag, push (fires publish.yml) |
|
|
429
|
+
| `.pi/skills/spec-coherence-check/SKILL.md` | Skill: sweep proposals for staleness, conflicts, obsolescence |
|
|
282
430
|
| `.pi/skills/spec-coherence-check/references/proposal-queue-schema.md` | JSON schema for `.pi/proposal-queue.json` |
|
|
283
|
-
| `.pi/skills/code-review/SKILL.md` | Skill: comprehensive code review with severity labels
|
|
284
|
-
| `.pi/skills/code-review/references/` |
|
|
431
|
+
| `.pi/skills/code-review/SKILL.md` | Skill: comprehensive code review with severity labels |
|
|
432
|
+
| `.pi/skills/code-review/references/` | Language guides + architecture/performance/security review references |
|
|
285
433
|
| `.pi/skills/nano-banana-imagegen/SKILL.md` | Skill: AI image generation/editing via Google Gemini (nano-banana CLI) |
|
|
286
|
-
| `.pi/skills/nano-banana-imagegen/references/` | Prompting guide, example prompts
|
|
287
|
-
| `.pi/skills/browser-visual-debug/SKILL.md` | Skill: visual debugging with a real browser
|
|
288
|
-
| `.pi/skills/browser-visual-debug/references/` | Dashboard recipes, responsive
|
|
289
|
-
| `.pi/skills/browser-visual-debug/scripts/detect-dashboard.sh` | Auto-detect dashboard URL, mode,
|
|
290
|
-
| `packages/electron/src/main.ts` | Electron main
|
|
291
|
-
| `packages/electron/src/lib/link-handling.ts` | Pure
|
|
292
|
-
| `packages/client/src/components/MarkdownContent.tsx` | ReactMarkdown
|
|
293
|
-
| `packages/client/src/
|
|
294
|
-
| `packages/
|
|
295
|
-
| `packages/
|
|
434
|
+
| `.pi/skills/nano-banana-imagegen/references/` | Prompting guide, example prompts |
|
|
435
|
+
| `.pi/skills/browser-visual-debug/SKILL.md` | Skill: visual debugging with a real browser via pi-agent-browser |
|
|
436
|
+
| `.pi/skills/browser-visual-debug/references/` | Dashboard recipes, responsive presets, agent-browser cheatsheet |
|
|
437
|
+
| `.pi/skills/browser-visual-debug/scripts/detect-dashboard.sh` | Auto-detect dashboard URL, mode, Vite dev server status |
|
|
438
|
+
| `packages/electron/src/main.ts` | Electron main: single-instance, wizard, server launch, loading page, tray |
|
|
439
|
+
| `packages/electron/src/lib/link-handling.ts` | Pure `isSameOriginUrl` + OAuth-aware `decideWillNavigate` for external-link guard |
|
|
440
|
+
| `packages/client/src/components/MarkdownContent.tsx` | ReactMarkdown renderer (chat/thinking/READMEs/previews); external-link hardening + KaTeX math + `pi-asset:` image scheme |
|
|
441
|
+
| `packages/client/src/lib/SessionAssetsContext.tsx` | Per-session image-asset registry context resolving `pi-asset:<hash>` srcs in `MarkdownContent` |
|
|
442
|
+
| `packages/extension/src/markdown-image-inliner.ts` | Bridge helper rewriting assistant `` → `` (SHA-256/16, MIME allowlist, 5 MB/img + 20 MB/msg caps) |
|
|
443
|
+
| `packages/client/src/__tests__/no-bare-external-anchor.test.ts` | Repo-lint: forbid bare `<a href="http(s)://">` without `target="_blank"` |
|
|
444
|
+
| `packages/electron/src/lib/pick-node.ts` | Pure `pickNodeForServer` — prefer system Node when version-safe, else bundled |
|
|
445
|
+
| `packages/electron/src/lib/ensure-windows-path.ts` | `ensureWindowsSystemPath` — prepend System32/npm/Git dirs on Windows; no-op on POSIX |
|
|
446
|
+
| `packages/electron/src/lib/server-lifecycle.ts` | Health check → server spawn; `setSpawnedPid` + `decideShutdownOnQuit` for V2 ownership rule |
|
|
447
|
+
| `packages/electron/src/lib/launch-source.ts` | `selectLaunchSource()` resolver: attach→devMonorepo→piExtension→npmGlobal→extracted; `spawnFromSource` |
|
|
448
|
+
| `packages/electron/src/lib/bundle-extract.ts` | `needsExtraction`, `migrateConfigs`, `extractBundle` with survive-extract whitelist for `~/.pi-dashboard/` |
|
|
449
|
+
| `packages/shared/src/installable-list.ts` | `InstallablePackage`/`InstallableList` types; `readInstallableList`, `writeInstallableList`, `mergeInstallableList` |
|
|
450
|
+
| `packages/server/src/bootstrap-install-from-list.ts` | Per-package reconcile loop reading `~/.pi/dashboard/installable.json`; no-op when file absent |
|
|
451
|
+
| `packages/shared/src/bridge-register.ts` | Shared bridge registration: `findBundledExtension(baseDir)` + `registerBridgeExtension(path)`; non-destructive cleanup, AppImage guard. Used by server startup and Electron wizard. |
|
|
296
452
|
| `packages/electron/src/lib/doctor.ts` | Doctor diagnostic: checks all binaries, versions, server status, offers setup |
|
|
453
|
+
| `packages/shared/src/doctor-core.ts` | Shared doctor primitives: types, SECTION_OF, SUGGESTIONS, safeExec/safeCheck/assumedMandatory, runSharedChecks, formatDoctorReportMarkdown |
|
|
454
|
+
| `packages/electron/src/lib/doctor-bridge-contract.ts` | Typed `DoctorBridge` interface + frozen `DOCTOR_IPC_CHANNELS` (channel-name-drift lint) |
|
|
455
|
+
| `packages/electron/src/lib/doctor-window.ts` | `openDoctorWindow()` factory + IPC handlers (`doctor:run` etc.); concurrent-run serialization; closed→null leak fix |
|
|
456
|
+
| `packages/electron/src/preload/doctor-preload.ts` | Preload bridge exposing `window.electron.doctor` to `doctor.html` |
|
|
457
|
+
| `packages/electron/src/renderer/doctor.html` | Hand-rolled Doctor renderer — sections, status pills, suggestion callouts, toolbar |
|
|
458
|
+
| `packages/server/src/routes/doctor-routes.ts` | `GET /api/doctor` route — auth-gated; runs `runSharedChecks`; 200 + fallback row on internal failure |
|
|
459
|
+
| `packages/client/src/lib/doctor-api.ts` | Client fetch helper for `/api/doctor` with `DoctorFetchError` typed envelope |
|
|
460
|
+
| `packages/client/src/components/DiagnosticsSection.tsx` | Settings → Diagnostics — fetch, sections, suggestions, copy-to-clipboard with textarea fallback |
|
|
297
461
|
| `packages/electron/src/lib/app-menu.ts` | App menu with About dialog and Doctor on all platforms |
|
|
298
|
-
| `packages/electron/src/lib/tray.ts` | System tray with platform-specific icons
|
|
299
|
-
| `packages/electron/src/lib/dependency-installer.ts` | Async npm install of pi
|
|
300
|
-
| `packages/electron/src/lib/dependency-detector.ts` | Detects pi
|
|
462
|
+
| `packages/electron/src/lib/tray.ts` | System tray with platform-specific icons |
|
|
463
|
+
| `packages/electron/src/lib/dependency-installer.ts` | Async npm install of pi/openspec/tsx into `~/.pi-dashboard/` (Windows-hardened) |
|
|
464
|
+
| `packages/electron/src/lib/dependency-detector.ts` | Detects pi/openspec/Node on PATH and managed install (AppImage + Win-ext guards) |
|
|
301
465
|
| `packages/electron/src/lib/bundled-node.ts` | Resolves bundled Node.js/npm paths in Electron resources |
|
|
302
466
|
| `packages/electron/src/lib/wizard-window.ts` | First-run setup wizard window with preload bridge |
|
|
303
|
-
| `packages/electron/forge.config.ts` | Electron Forge config: DMG
|
|
304
|
-
| `packages/electron/scripts/build-installer.sh` | Build script: native + Docker cross-platform
|
|
305
|
-
| `packages/electron/scripts/docker-make.sh` | Docker entrypoint:
|
|
306
|
-
| `packages/electron/scripts/Dockerfile.build` | Docker image for cross-platform builds (node:22-bookworm-slim
|
|
307
|
-
| `packages/electron/scripts/bundle-server.mjs` | Bundles dashboard server
|
|
308
|
-
| `packages/electron/offline-packages.json` | Pinned versions of pi
|
|
309
|
-
| `packages/electron/scripts/bundle-offline-packages.sh` | Build-time script
|
|
310
|
-
| `packages/electron/resources/offline-packages/manifest.json` | Offline-cache manifest
|
|
311
|
-
| `packages/electron/resources/offline-packages/npm-cache.tar.gz` | gzipped npm cacache
|
|
312
|
-
| `packages/electron/src/lib/offline-packages.ts` | Pure helpers
|
|
313
|
-
| `packages/electron/scripts/bundle-recommended-extensions.sh` | Opt-in
|
|
314
|
-
| `packages/electron/src/lib/dependency-installer.ts` → `installBundledExtensions` | First-run activation of pre-bundled extensions
|
|
315
|
-
| `packages/electron/src/lib/wizard-badge.ts` | Pure `classifyProgressBadge(output)`
|
|
316
|
-
| `packages/shared/src/recommended-extensions.ts` → `BUNDLED_EXTENSION_IDS` | Single source of truth for
|
|
317
|
-
| `packages/electron/scripts/docker-make.sh` | Docker entrypoint: bundles server, installs native deps, runs Forge make |
|
|
318
|
-
| `packages/electron/scripts/Dockerfile.build` | Docker image for cross-platform builds (node:22-bookworm-slim + build tools) |
|
|
467
|
+
| `packages/electron/forge.config.ts` | Electron Forge config: DMG/DEB/AppImage/NSIS makers; arch-tagged DMG; macOS 10.15 floor |
|
|
468
|
+
| `packages/electron/scripts/build-installer.sh` | Build script: native + Docker cross-platform; `--mac-both` arm64+x64 sequence |
|
|
469
|
+
| `packages/electron/scripts/docker-make.sh` | Docker entrypoint: bundles server, native deps, runs Forge make |
|
|
470
|
+
| `packages/electron/scripts/Dockerfile.build` | Docker image for cross-platform builds (node:22-bookworm-slim) |
|
|
471
|
+
| `packages/electron/scripts/bundle-server.mjs` | Bundles dashboard server + workspace deps into `resources/server/` (Node-native ESM) |
|
|
472
|
+
| `packages/electron/offline-packages.json` | Pinned versions of pi/openspec/tsx for offline npm cacache |
|
|
473
|
+
| `packages/electron/scripts/bundle-offline-packages.sh` | Build-time script: pack pinned versions into cacache tarball with SHA-256 |
|
|
474
|
+
| `packages/electron/resources/offline-packages/manifest.json` | Offline-cache manifest consumed at runtime by `dependency-installer.ts` |
|
|
475
|
+
| `packages/electron/resources/offline-packages/npm-cache.tar.gz` | gzipped npm cacache for first-run offline install |
|
|
476
|
+
| `packages/electron/src/lib/offline-packages.ts` | Pure offline-cache helpers (parse, resolve, verify SHA-256, extract) |
|
|
477
|
+
| `packages/electron/scripts/bundle-recommended-extensions.sh` | Opt-in: clone bundled-extension ids with SPDX allowlist + 15MB budget |
|
|
478
|
+
| `packages/electron/src/lib/dependency-installer.ts` → `installBundledExtensions` | First-run activation of pre-bundled extensions into pi git cache |
|
|
479
|
+
| `packages/electron/src/lib/wizard-badge.ts` | Pure `classifyProgressBadge(output)` (`bundled`/`system`/null) |
|
|
480
|
+
| `packages/shared/src/recommended-extensions.ts` → `BUNDLED_EXTENSION_IDS` | Single source of truth for bundled extension ids in Electron installer |
|
|
319
481
|
| `packages/electron/scripts/test-server-launch.sh` | Docker-based test for server launch on clean Linux |
|
|
320
482
|
| `packages/electron/scripts/test-electron-install.sh` | Full e2e Docker test: install, wizard, server launch, health check |
|
|
321
483
|
| `packages/electron/scripts/test-electron-install-inner.sh` | Inner test script run inside Docker container |
|
|
322
|
-
| `packages/electron/resources/icon.png` | Master 1024×1024 app icon
|
|
323
|
-
| `.github/workflows/publish.yml` | CI:
|
|
324
|
-
| `packages/shared/src/__tests__/publish-workflow-contract.test.ts` | Repo-
|
|
325
|
-
| `packages/shared/src/__tests__/no-bash-on-windows.test.ts` | Repo-
|
|
484
|
+
| `packages/electron/resources/icon.png` | Master 1024×1024 app icon |
|
|
485
|
+
| `.github/workflows/publish.yml` | CI: build matrix × 6 (platform,arch); idempotent ordered npm publish; no-bash-on-Windows |
|
|
486
|
+
| `packages/shared/src/__tests__/publish-workflow-contract.test.ts` | Repo-lint: pin electron job's `needs:` array and `fail-fast: false` |
|
|
487
|
+
| `packages/shared/src/__tests__/no-bash-on-windows.test.ts` | Repo-lint: forbid `shell: bash` on steps reachable on Windows runners |
|
|
326
488
|
|
|
327
489
|
## Build & Restart Workflow
|
|
328
490
|
|
|
@@ -389,17 +551,4 @@ When creating OpenSpec change artifacts, always place them at `openspec/changes/
|
|
|
389
551
|
|
|
390
552
|
When creating diagrams, use Mermaid syntax (```mermaid blocks) instead of ASCII box drawings. This applies to explore mode, design documents, and all other artifacts.
|
|
391
553
|
|
|
392
|
-
## Code Instructions
|
|
393
|
-
|
|
394
|
-
1. First think through the problem, read the codebase for relevant files.
|
|
395
|
-
2. Before you make any major changes, check in with me and I will verify the plan.
|
|
396
|
-
3. Please every step of the way just give me a high level explanation of what changes you made.
|
|
397
|
-
4. Make every task and code change you do as simple as possible. We want to avoid making any massive or complex changes. Every change should impact as little code as possible. Everything is about simplicity.
|
|
398
|
-
5. Maintain a documentation file that describes how the architecture of the app works inside and out.
|
|
399
|
-
6. Never speculate about code you have not opened. If the user references a specific file, you MUST read the file before answering. Make sure to investigate and read relevant files BEFORE answering questions about the codebase. Never make any claims about code before investigating unless you are certain of the correct answer - give grounded and hallucination-free answers.
|
|
400
|
-
7. For implementation use TDD (Test-Driven Development): write or update tests first to define the expected behaviour, verify they fail, then write the minimal implementation to make them pass.
|
|
401
|
-
8. Use DRY (Don't Repeat Yourself): extract reusable logic into separate classes, utilities, or components. If the same pattern appears in multiple places, refactor it into a shared helper.
|
|
402
|
-
|
|
403
|
-
## Document changes
|
|
404
554
|
|
|
405
|
-
When an implementation is ready, update AGENTS.md, README.md, and docs/architecture.md. AGENTS.md contains instructions for AI agents, key files, and commands needed to build and operate. README.md contains end-user and developer documentation with CI badges, prerequisites, configuration, and project structure. docs/architecture.md contains detailed data flows, persistence model, reconnection logic, and configuration reference.
|