@tekmidian/pai 1.0.0 → 1.0.3
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/.claude-plugin/plugin.json +1 -1
- package/README.md +67 -5
- package/dist/aibroker-client-BxzeEHPF.mjs +3 -0
- package/dist/{aibroker-client-CXEYBzbf.mjs → aibroker-client-CQPGqLxL.mjs} +1 -1
- package/dist/atomic-file-BorMa4T3.mjs +21 -0
- package/dist/{auto-route-D5SXrMpB.mjs → auto-route-B7Yu6Uam.mjs} +3 -3
- package/dist/auto-route-CjjQqU1o.mjs +11 -0
- package/dist/budget-Dod6rnA9.mjs +15 -0
- package/dist/{caller-identity-CVTuiLSs.mjs → caller-identity-yLFb7CKq.mjs} +6 -5
- package/dist/{capacity-DaXrVj3J.mjs → capacity-DEveQdFV.mjs} +3 -3
- package/dist/{chain-BcQlIlEd.mjs → chain-7n9Gx56r.mjs} +5 -5
- package/dist/cli/index.mjs +1628 -370
- package/dist/{cockpit-actions-ODmt8yF9.mjs → cockpit-actions-BBHeyEZI.mjs} +84 -42
- package/dist/cockpit-actions-DR9X514g.mjs +20 -0
- package/dist/cockpit-memory--dnShXBA.mjs +20 -0
- package/dist/{config-BSXKyeJ1.mjs → config-Bu1_vbY8.mjs} +42 -3
- package/dist/{config-B955yYmo.mjs → config-Cxi-aBf4.mjs} +2 -2
- package/dist/{config-TaWmdTLx.mjs → config-DtENJ6cL.mjs} +1 -1
- package/dist/{config-D5chi2LO.mjs → config-XpZWOYOG.mjs} +2 -2
- package/dist/{controls-BGkK_Bdi.mjs → controls-CPoeudou.mjs} +37 -22
- package/dist/daemon/index.mjs +43 -42
- package/dist/daemon-DKdBNKfa.mjs +45 -0
- package/dist/{daemon-CorGh6Ub.mjs → daemon-DPAo6WTa.mjs} +103 -55
- package/dist/daemon-mcp/index.mjs +40 -39
- package/dist/{define-DGFu-sCf.mjs → define-CjJsmq-6.mjs} +1 -1
- package/dist/{detect-C1d5cUkT.mjs → detect-9CZNO0yf.mjs} +2 -2
- package/dist/detect-D1ziFFfA.mjs +10 -0
- package/dist/{embed-pass-CeQD8kRE.mjs → embed-pass-DIWjA68P.mjs} +5 -5
- package/dist/{embedding-gate-BHuBsgHD.mjs → embedding-gate-6rZrWRXa.mjs} +5 -5
- package/dist/{embedding-gate-Z7CJSOJk.mjs → embedding-gate-Cnk4YCyX.mjs} +3 -3
- package/dist/{embeddings-D4t6L-EH.mjs → embeddings-BVq3esBF.mjs} +1 -1
- package/dist/{embeddings-OF9Pt4by.mjs → embeddings-CIkJBKd-.mjs} +1 -1
- package/dist/{endreason-x1KOSrcO.mjs → endreason-C577xIQz.mjs} +7 -6
- package/dist/{env-DArqGq-Z.mjs → env-BE8mrsxr.mjs} +1 -1
- package/dist/factory-Bsib-qDG.mjs +9 -0
- package/dist/{factory-BtjbQ0np.mjs → factory-DjAAsqr_.mjs} +15 -13
- package/dist/{fallback-BIyEpPsQ.mjs → fallback-DFlItw1Z.mjs} +5 -5
- package/dist/{fmt-age-BiSHrTKN.mjs → fmt-age-ByDkvkoU.mjs} +1 -1
- package/dist/{health-C6jZWvRG.mjs → health-Dnym-qcT.mjs} +4 -4
- package/dist/{helpers-DFmYRCOa.mjs → helpers-BD6V-p9w.mjs} +2 -2
- package/dist/helpers-CMGjy_0N.mjs +10 -0
- package/dist/{helpers-CJpb_MNB.mjs → helpers-CRuBUas3.mjs} +87 -38
- package/dist/hooks/capture-all-events.mjs +52 -11
- package/dist/hooks/capture-session-summary.mjs +64 -47
- package/dist/hooks/capture-tool-output.mjs +49 -8
- package/dist/hooks/context-compression-hook.mjs +30 -10
- package/dist/hooks/initialize-session.mjs +1 -0
- package/dist/hooks/load-core-context.mjs +1 -1
- package/dist/hooks/load-project-context.mjs +32 -29
- package/dist/hooks/security-validator.mjs +45 -13
- package/dist/hooks/stop-hook.mjs +54 -16
- package/dist/hooks/supervision-banner.mjs +9 -0
- package/dist/hooks/sync-todo-to-md.mjs +147 -113
- package/dist/hooks/worker-edit-repair.mjs +2 -1
- package/dist/hooks/worker-guard.mjs +40 -16
- package/dist/hooks/worker-note.mjs +12 -5
- package/dist/hooks/worker-path-repair.mjs +1 -1
- package/dist/hooks/worker-pool-host.mjs +329 -231
- package/dist/hooks/worker-status-line.mjs +195 -114
- package/dist/index.d.mts +18 -0
- package/dist/index.mjs +12 -12
- package/dist/{indexer-backend-BM2CUSu8.mjs → indexer-backend-Cll7le4P.mjs} +149 -96
- package/dist/{ipc-client-BMqWw_gv.mjs → ipc-client-CaiGJnSM.mjs} +1 -1
- package/dist/{ipc-client-YYDD6zzU.mjs → ipc-client-ZRmDKd5Z.mjs} +1 -1
- package/dist/kill-tree-BG7dRVtp.mjs +10 -0
- package/dist/{kill-tree-BjYz5BxK.mjs → kill-tree-EWYaEk5v.mjs} +8 -8
- package/dist/{launch-CLp0OJxV.mjs → launch-CXVlZjHt.mjs} +8 -8
- package/dist/{launch-DgqQdAjI.mjs → launch-Jh5NVeNe.mjs} +3 -3
- package/dist/local-candidate-DLdwQt0s.mjs +112 -0
- package/dist/local-instances-DOxSgT_L.mjs +210 -0
- package/dist/local-instances-ZeRkkuS5.mjs +6 -0
- package/dist/{local-tiers-DPZYqv9m.mjs → local-tiers-BE4jGaMa.mjs} +2 -2
- package/dist/{local-tiers-DnBIAkbK.mjs → local-tiers-DNMI5W86.mjs} +3 -3
- package/dist/{main-config-ops-C0SflOWk.mjs → main-config-ops-BEMpuhDz.mjs} +3 -3
- package/dist/{main-resolver-DVPpSWVy.mjs → main-resolver-3Ns1HPmS.mjs} +18 -17
- package/dist/{migrate-BUJHadA8.mjs → migrate-DrA_OwlZ.mjs} +45 -14
- package/dist/min-max-DrSRUaWQ.mjs +16 -0
- package/dist/{model-inventory-Dasber3S.mjs → model-inventory-BFVSNFT3.mjs} +13 -12
- package/dist/{models-add-Bt7aUHDs.mjs → models-add-C1QIc1DA.mjs} +39 -38
- package/dist/operator-BTqvTIc8.mjs +7 -0
- package/dist/{operator-DZxcP-g8.mjs → operator-CyuB3aVw.mjs} +3 -3
- package/dist/{pai-marker-kIYuNt3c.mjs → pai-marker-BcZyJguM.mjs} +7 -6
- package/dist/{pane-audit-OGYrOAik.mjs → pane-audit-DKQt71s4.mjs} +7 -7
- package/dist/{paths-DoRuFc60.mjs → paths-CFHTloSe.mjs} +3 -3
- package/dist/{paths-DoIyRnhx.mjs → paths-CHifubDh.mjs} +3 -3
- package/dist/{planner-DLGOYlVb.mjs → planner-BmFACdLa.mjs} +31 -30
- package/dist/{pool-CZ5MZaXg.mjs → pool-Dh-q3iJi.mjs} +45 -6
- package/dist/{pool-cli-BxNSPzzY.mjs → pool-cli-BggU8GRp.mjs} +5 -5
- package/dist/{pool-cli-CbJfl37y.mjs → pool-cli-DQ6OzRy2.mjs} +6 -6
- package/dist/postgres-BdBNkL_l.mjs +7 -0
- package/dist/{postgres-CDnd_k5f.mjs → postgres-C6ti4haA.mjs} +55 -34
- package/dist/{project-setup-DM4npnL3.mjs → project-setup-jvfONJTQ.mjs} +131 -74
- package/dist/providers-BeDiVEb-.mjs +16 -0
- package/dist/{providers-UsKtLcUR.mjs → providers-CblTFrhz.mjs} +6 -6
- package/dist/{query-feedback-I-txSnld.mjs → query-feedback-BRfPtqki.mjs} +2 -2
- package/dist/registrable-BzH4TObg.mjs +9 -0
- package/dist/{registrable-LrRIVYQc.mjs → registrable-DpyTtajg.mjs} +4 -4
- package/dist/{render-BDbb4CF-.mjs → render-BYmQkuLd.mjs} +8 -8
- package/dist/render-CoMvwMPs.mjs +13 -0
- package/dist/{reranker-B4r4vykM.mjs → reranker-8g6xMwP7.mjs} +1 -1
- package/dist/{reranker-DxxMCtA0.mjs → reranker-CqCbpGnX.mjs} +1 -1
- package/dist/root-FtJsxYnm.mjs +36 -0
- package/dist/{root-BMeJuHOb.mjs → root-Xglu0OPD.mjs} +11 -11
- package/dist/route-table-B7zpoypi.mjs +15 -0
- package/dist/{router-L8Nu-OHF.mjs → router-CQSc3lk3.mjs} +17 -7
- package/dist/{router-D6Ec6Fid.mjs → router-DwHJRgG9.mjs} +1 -1
- package/dist/{routing-CUyiglfu.mjs → routing-BAAST9vT.mjs} +27 -308
- package/dist/{routing-ZuGlc0ge.mjs → routing-CENt4HH1.mjs} +13 -12
- package/dist/{run-ulAi5dFD.mjs → run-CSC7mgPf.mjs} +35 -33
- package/dist/{scan-B7I0gPe-.mjs → scan-C_Y5W9py.mjs} +6 -6
- package/dist/{local-candidate-jOjTNlOL.mjs → scheduler-CtUyWJ3O.mjs} +7 -109
- package/dist/scheduler-dmHXoRvm.mjs +3 -0
- package/dist/{scope-D5VSQxe4.mjs → scope-D-h6F6DN.mjs} +4 -4
- package/dist/{search-CPoE0830.mjs → search-RSyeQqj1.mjs} +18 -18
- package/dist/{session-CNXF6DLP.mjs → session-8iqQDkqb.mjs} +55 -31
- package/dist/session-BeqAbNPd.mjs +35 -0
- package/dist/session-scan-BJI_ZO8M.mjs +9 -0
- package/dist/{session-scan-BDLEc4w1.mjs → session-scan-W-gbwJHM.mjs} +6 -6
- package/dist/{sources-CjhUKKtO.mjs → sources-ESUkZaWv.mjs} +1 -1
- package/dist/{status-DYydKQUI.mjs → status-Dm4dYciN.mjs} +4 -4
- package/dist/{status-CvVi9cDf.mjs → status-ggJ7lgVg.mjs} +17 -9
- package/dist/{stop-words-SdSL1WKH.mjs → stop-words-DSEYQdNe.mjs} +1 -1
- package/dist/{test-isolation-CoDeOVXb.mjs → test-isolation-lqSmYxr0.mjs} +1 -1
- package/dist/{timeouts-OwEONmc8.mjs → timeouts-1MLooEBB.mjs} +1 -1
- package/dist/{tool-errors-AeRQuG3Y.mjs → tool-errors-7E13StWd.mjs} +4 -3
- package/dist/{tool-errors-R5E0fCgf.mjs → tool-errors-CJWODvlo.mjs} +6 -6
- package/dist/viewer-CqozWW39.mjs +22 -0
- package/dist/{viewer-DtWj5Vti.mjs → viewer-mDXUNHNy.mjs} +15 -15
- package/dist/{wait-BMUR-U-U.mjs → wait-ByV0OyMZ.mjs} +3 -3
- package/dist/{worker-config-BLqa1yiD.mjs → worker-config-CJhEMk19.mjs} +294 -92
- package/dist/worker-config-DESkIjMF.mjs +41 -0
- package/dist/{workers-config-DEI9lrV4.mjs → workers-config-f8KrkY4L.mjs} +2 -2
- package/dist/{worktree-zmRf556h.mjs → worktree-CRs2gyg0.mjs} +37 -7
- package/dist/{zettelkasten-nigq7fqs.mjs → zettelkasten-B_rRRRvD.mjs} +5 -5
- package/dist/{zettelkasten-Cr_Xj0mG.mjs → zettelkasten-BzMm8REH.mjs} +29 -19
- package/docs/README.md +2 -0
- package/docs/cockpit.md +10 -4
- package/docs/commands/README.md +4 -4
- package/docs/commands/backup.md +2 -0
- package/docs/commands/install.md +29 -4
- package/docs/commands/providers.md +1 -1
- package/docs/commands/restore.md +4 -0
- package/docs/commands/setup.md +29 -4
- package/docs/commands/worker.md +1 -1
- package/docs/config.md +2 -0
- package/docs/features.md +299 -0
- package/docs/images/architecture.drawio +51 -0
- package/docs/images/architecture.png +0 -0
- package/docs/images/architecture.svg +3 -0
- package/docs/images/cockpit-01-system-tokens.jpg +0 -0
- package/docs/images/cockpit-02-totals-cache.jpg +0 -0
- package/docs/images/cockpit-03-local-servers-models-pool.jpg +0 -0
- package/docs/images/cockpit-04-workers-memory.jpg +0 -0
- package/docs/images/cockpit-05-performance.jpg +0 -0
- package/docs/images/cockpit-06-runs-speed-routing.jpg +0 -0
- package/docs/images/cockpit-07-settings-registry.jpg +0 -0
- package/docs/install/index.md +29 -0
- package/docs/three-tier-coding.md +1 -1
- package/gemini-extension.json +1 -1
- package/package.json +1 -5
- package/pai-plugin.json +1 -1
- package/plugins/context-preservation/plugin.json +1 -1
- package/plugins/core/plugin.json +1 -1
- package/plugins/core/skills/setup/SKILL.md +41 -9
- package/plugins/creative/plugin.json +1 -1
- package/plugins/observability/plugin.json +1 -1
- package/plugins/productivity/plugin.json +1 -1
- package/plugins/semantic-search/plugin.json +1 -1
- package/plugins/ui/plugin.json +1 -1
- package/plugins/zettelkasten/plugin.json +1 -1
- package/src/hooks/session-autosave.sh +8 -1
- package/src/hooks/session-stop.sh +8 -1
- package/src/hooks/ts/capture-all-events.ts +7 -12
- package/src/hooks/ts/lib/context-fill.ts +2 -1
- package/src/hooks/ts/lib/path-repair.ts +1 -1
- package/src/hooks/ts/lib/project-utils/notify.ts +1 -0
- package/src/hooks/ts/lib/project-utils/session-notes.ts +23 -6
- package/src/hooks/ts/lib/raw-capture.ts +36 -0
- package/src/hooks/ts/lib/session-summary.ts +129 -0
- package/src/hooks/ts/lib/todo-sync.ts +120 -0
- package/src/hooks/ts/lib/worker-git-guard.ts +1 -1
- package/src/hooks/ts/post-tool-use/capture-tool-output.ts +6 -10
- package/src/hooks/ts/post-tool-use/sync-todo-to-md.ts +5 -105
- package/src/hooks/ts/pre-compact/context-compression-hook.ts +1 -1
- package/src/hooks/ts/pre-tool-use/security-validator.ts +35 -14
- package/src/hooks/ts/session-end/capture-session-summary.ts +20 -128
- package/src/hooks/ts/session-start/load-core-context.ts +3 -3
- package/src/hooks/ts/session-start/load-project-context.ts +18 -22
- package/src/hooks/ts/stop/stop-hook.ts +13 -5
- package/src/hooks/ztk-auto.sh +7 -2
- package/dist/aibroker-client-JjE74jo0.mjs +0 -3
- package/dist/auto-route-BRk8NEFv.mjs +0 -11
- package/dist/budget-DuhQ2zzG.mjs +0 -14
- package/dist/cockpit-actions-DcQ-ucU8.mjs +0 -19
- package/dist/cockpit-memory-KV45PPO2.mjs +0 -19
- package/dist/daemon-C7yt_ptC.mjs +0 -44
- package/dist/detect-DRUkmHnb.mjs +0 -10
- package/dist/factory-DAGG9_n8.mjs +0 -9
- package/dist/helpers-DPJEHPq6.mjs +0 -10
- package/dist/kill-tree-LV0Q7Mte.mjs +0 -10
- package/dist/operator-CfL0HiBK.mjs +0 -7
- package/dist/postgres-DgqWyqhN.mjs +0 -7
- package/dist/providers-CTu2s1z2.mjs +0 -15
- package/dist/registrable-D9aNZOTh.mjs +0 -9
- package/dist/render-BSfVlYHj.mjs +0 -13
- package/dist/root-xI9DqVIe.mjs +0 -35
- package/dist/route-table-HjvnLVEU.mjs +0 -14
- package/dist/session-BJHzmUg2.mjs +0 -34
- package/dist/session-scan-YORKE1NO.mjs +0 -9
- package/dist/viewer-B8709jDN.mjs +0 -22
- package/dist/worker-config-D8tRuvo7.mjs +0 -40
- package/docs/images/cockpit-limits-routing.jpg +0 -0
- package/docs/images/cockpit-models.jpg +0 -0
- package/docs/images/cockpit-usage.jpg +0 -0
- package/docs/images/cockpit-workers-system.jpg +0 -0
- package/scripts/build-docs.mjs +0 -41
- package/scripts/build-hooks.mjs +0 -311
- package/scripts/build-skill-stubs.mjs +0 -216
- package/scripts/copy-defaults.mjs +0 -46
package/docs/features.md
ADDED
|
@@ -0,0 +1,299 @@
|
|
|
1
|
+
# Everything PAI does
|
|
2
|
+
|
|
3
|
+
One page, grouped by what you want to do. Each item gives the command to type or the phrase to say to Claude, and a link to the detail. Every command has a generated page under [commands](commands/README.md); `pai help` lists the everyday ones and `pai more` the rest. Skills (the phrases) are listed with their triggers in [Skills](skills.md).
|
|
4
|
+
|
|
5
|
+
- [Sessions](#sessions)
|
|
6
|
+
- [Memory and search](#memory-and-search)
|
|
7
|
+
- [Notes and vault](#notes-and-vault)
|
|
8
|
+
- [Zettelkasten](#zettelkasten)
|
|
9
|
+
- [Journal, review and plan](#journal-review-and-plan)
|
|
10
|
+
- [Tasks and ingress](#tasks-and-ingress)
|
|
11
|
+
- [Workers and delegation](#workers-and-delegation)
|
|
12
|
+
- [Router and cockpit](#router-and-cockpit)
|
|
13
|
+
- [Messaging](#messaging)
|
|
14
|
+
- [Rules, budget and advisor mode](#rules-budget-and-advisor-mode)
|
|
15
|
+
- [Images, art and sharing](#images-art-and-sharing)
|
|
16
|
+
- [Research](#research)
|
|
17
|
+
- [Setup and health](#setup-and-health)
|
|
18
|
+
|
|
19
|
+
## Sessions
|
|
20
|
+
|
|
21
|
+
### Pick and open a session
|
|
22
|
+
|
|
23
|
+
`pai` shows your sessions; type to filter, Enter opens one. `pai NAME` opens it by name, `pai ls` lists them newest first, `pai new` starts one in a new or existing folder. See [session management](session-management.md), [`pai ls`](commands/ls.md), [`pai new`](commands/new.md), [`pai open`](commands/open.md).
|
|
24
|
+
|
|
25
|
+
### Pause and end a session
|
|
26
|
+
|
|
27
|
+
`pai pause` saves your place; `pai end` finishes with a note, TODO update and commits. Say "pause" or "wrap up" to Claude for the same. See [`pai pause`](commands/pause.md), [`pai end`](commands/end.md), [session management](session-management.md#pausing-and-ending).
|
|
28
|
+
|
|
29
|
+
### Name and rename sessions
|
|
30
|
+
|
|
31
|
+
`pai rename`, or say "name this session". See [`pai rename`](commands/rename.md).
|
|
32
|
+
|
|
33
|
+
### Session setups
|
|
34
|
+
|
|
35
|
+
`pai setups` lists orchestrator and worker combinations; `pai setups save "my mix"` keeps the current one, and `pai NAME --with "glm only"` starts a session that way. See [`pai setups`](commands/setups.md) and [session profiles](session-profiles.md).
|
|
36
|
+
|
|
37
|
+
### Session notes
|
|
38
|
+
|
|
39
|
+
Every session writes its own notes in the background. `pai notes list` shows them; say "consolidate notes" to merge duplicates or "reconstruct sessions" to rebuild notes from old transcripts. See [session notes](session-notes.md), [`pai notes`](commands/notes.md).
|
|
40
|
+
|
|
41
|
+
### Context preservation and auto-compact
|
|
42
|
+
|
|
43
|
+
When Claude compresses a long conversation, PAI saves a checkpoint first and puts it back afterwards, so work carries on. See [context preservation](context-preservation.md) and [auto-compact](auto-compact.md).
|
|
44
|
+
|
|
45
|
+
### Which project is this
|
|
46
|
+
|
|
47
|
+
Say "what project is this" or "tag this session"; `pai topic check` detects when a conversation has moved to another project. See [`pai topic`](commands/topic.md).
|
|
48
|
+
|
|
49
|
+
## Memory and search
|
|
50
|
+
|
|
51
|
+
### Search your memory
|
|
52
|
+
|
|
53
|
+
`pai memory search "text"`, or say "search memory for X". Modes are keyword, semantic (by meaning) and hybrid. See [search](search.md), [`pai memory`](commands/memory.md).
|
|
54
|
+
|
|
55
|
+
### Search past sessions
|
|
56
|
+
|
|
57
|
+
Say "what did we do about X" or "search history"; `pai find "text"` searches your prompt history for sessions. See [`pai find`](commands/find.md).
|
|
58
|
+
|
|
59
|
+
### Index and embeddings
|
|
60
|
+
|
|
61
|
+
`pai memory index` scans your notes and project files, `pai memory embed` adds meaning vectors, `pai memory status` shows progress, `pai memory backend` and `pai memory settings` choose and tune the backend. See [memory](memory.md#embedding-backends).
|
|
62
|
+
|
|
63
|
+
### Knowledge graph
|
|
64
|
+
|
|
65
|
+
`pai kg query`, `pai kg list` and `pai kg stats` show facts extracted from your notes together with the time they were true; `pai kg backfill` extracts them from older notes. See [knowledge graph](memory.md#temporal-knowledge-graph), [`pai kg`](commands/kg.md).
|
|
66
|
+
|
|
67
|
+
### Memory tools for Claude
|
|
68
|
+
|
|
69
|
+
Claude can call `memory_search`, `memory_get`, `memory_outline` (section-aware reading), `memory_kg_search`, `memory_wakeup`, `memory_taxonomy`, `memory_tunnels` and `memory_feedback` itself. See [memory](memory.md) and [search](search.md#section-aware-retrieval).
|
|
70
|
+
|
|
71
|
+
### Observations
|
|
72
|
+
|
|
73
|
+
Notes the system takes while you work. `pai observation list`, `pai observation search "text"`, `pai observation stats`. See [observations](observations.md), [`pai observation`](commands/observation.md).
|
|
74
|
+
|
|
75
|
+
### Projects and registry
|
|
76
|
+
|
|
77
|
+
`pai project list`, `add`, `rename`, `check`; `pai registry scan` finds projects on disk; `pai cd NAME` goes to a project's directory. See [`pai project`](commands/project.md), [`pai registry`](commands/registry.md), [`pai cd`](commands/cd.md).
|
|
78
|
+
|
|
79
|
+
## Notes and vault
|
|
80
|
+
|
|
81
|
+
These use your Obsidian vault (`vaultPath` in the config).
|
|
82
|
+
|
|
83
|
+
### Mirror project notes into Obsidian
|
|
84
|
+
|
|
85
|
+
`pai obsidian sync` copies project notes into the vault, `pai obsidian status` shows the state, `pai obsidian open` opens it. See [`pai obsidian`](commands/obsidian.md).
|
|
86
|
+
|
|
87
|
+
### Morning briefing
|
|
88
|
+
|
|
89
|
+
Say "morning briefing" or "load vault context". Skill `/vault-context`. See [skills](skills.md#obsidian-vault).
|
|
90
|
+
|
|
91
|
+
### Connect two ideas
|
|
92
|
+
|
|
93
|
+
Say "how does X relate to Y". Skill `/vault-connect` finds the path between two topics in the vault. See [skills](skills.md#obsidian-vault).
|
|
94
|
+
|
|
95
|
+
### Find orphans
|
|
96
|
+
|
|
97
|
+
Say "find orphans". Skill `/vault-orphans` finds notes nothing links to and suggests where to link them. See [skills](skills.md#obsidian-vault).
|
|
98
|
+
|
|
99
|
+
### What is emerging
|
|
100
|
+
|
|
101
|
+
Say "what's emerging" or "find patterns". Skill `/vault-emerge` surfaces themes and clusters. See [skills](skills.md#obsidian-vault).
|
|
102
|
+
|
|
103
|
+
### Trace an idea
|
|
104
|
+
|
|
105
|
+
Say "trace the idea X" or "how did X evolve". Skill `/vault-trace` follows an idea through your notes over time. See [skills](skills.md#obsidian-vault).
|
|
106
|
+
|
|
107
|
+
## Zettelkasten
|
|
108
|
+
|
|
109
|
+
PAI indexes the links and meaning of your vault. Details: [Zettelkasten](zettelkasten.md); all commands: [`pai zettel`](commands/zettel.md). Say the phrase to Claude, or type the command.
|
|
110
|
+
|
|
111
|
+
### Explore links
|
|
112
|
+
|
|
113
|
+
`pai zettel explore NOTE --depth 2`, or "explore notes linked to X". Walks links outward from a note.
|
|
114
|
+
|
|
115
|
+
### Surprising connections
|
|
116
|
+
|
|
117
|
+
`pai zettel surprise`, or "find surprising connections to this note".
|
|
118
|
+
|
|
119
|
+
### Ask the vault
|
|
120
|
+
|
|
121
|
+
`pai zettel converse`, or "what does my vault say about X".
|
|
122
|
+
|
|
123
|
+
### Themes
|
|
124
|
+
|
|
125
|
+
`pai zettel themes`, or "what themes are emerging in my vault".
|
|
126
|
+
|
|
127
|
+
### Vault health
|
|
128
|
+
|
|
129
|
+
`pai zettel health`, or "how healthy is my vault". A structural audit of links and orphans.
|
|
130
|
+
|
|
131
|
+
### Link suggestions
|
|
132
|
+
|
|
133
|
+
`pai zettel suggest`, or "suggest connections for this note".
|
|
134
|
+
|
|
135
|
+
## Journal, review and plan
|
|
136
|
+
|
|
137
|
+
### Journal
|
|
138
|
+
|
|
139
|
+
Say "journal" or "note to self". Skill `/journal` creates, reads and searches personal entries. See [skills](skills.md#productivity).
|
|
140
|
+
|
|
141
|
+
### Review
|
|
142
|
+
|
|
143
|
+
Say "review my week" or "what did I do". Skill `/review` writes a daily, weekly or monthly recap. See [skills](skills.md#productivity).
|
|
144
|
+
|
|
145
|
+
### Plan
|
|
146
|
+
|
|
147
|
+
Say "plan my week" or "what should I focus on". Skill `/plan` plans from your open tasks and calendar. See [skills](skills.md#productivity).
|
|
148
|
+
|
|
149
|
+
### Explain as a story
|
|
150
|
+
|
|
151
|
+
Say "explain this as a story". Skill `/story` writes a numbered narrative of any content. See [skills](skills.md#tools--system).
|
|
152
|
+
|
|
153
|
+
## Tasks and ingress
|
|
154
|
+
|
|
155
|
+
### Cross-session task list
|
|
156
|
+
|
|
157
|
+
`pai task list`, `pai task add`, `pai task done`; or say "add a task" or "what's on the bus". Skill `/tasks`. See [`pai task`](commands/task.md).
|
|
158
|
+
|
|
159
|
+
### Todoist as an input channel
|
|
160
|
+
|
|
161
|
+
`pai task poll` and `pai task schedule` pick up Todoist tasks and `pai task dispatch` hands them to a session; `pai task config` sets it up. See [task bus](task-bus.md).
|
|
162
|
+
|
|
163
|
+
### GitHub issues as an input channel
|
|
164
|
+
|
|
165
|
+
Issues and comments from a GitHub, Gitea or Forgejo repository arrive in your session through AIBroker. Ask the session to subscribe to the repository (`aibroker_subscribe_issues`); it registers the webhook and later issue events come in as messages. See [companion projects](companion-projects.md).
|
|
166
|
+
|
|
167
|
+
### Issue claims
|
|
168
|
+
|
|
169
|
+
`pai issue` claims and releases forge issues so two sessions do not take the same one. See [issue claims](issue-claims.md), [`pai issue`](commands/issue.md).
|
|
170
|
+
|
|
171
|
+
## Workers and delegation
|
|
172
|
+
|
|
173
|
+
### Run a worker
|
|
174
|
+
|
|
175
|
+
Say "start a worker" or run `pai worker run`. A worker is a background Claude Code run in its own git checkout and pane; `pai worker ps` lists them, `follow` watches one, `merge` brings its branch back. See [workers](concepts/workers.md), [`pai worker`](commands/worker.md).
|
|
176
|
+
|
|
177
|
+
### Tiers and routing
|
|
178
|
+
|
|
179
|
+
Three tiers (session, orchestrator, workers) each hold an ordered list of models, and a routing policy decides local or cloud per run. See [delegation tiers](concepts/delegation-tiers.md), [routing policy](concepts/routing-policy.md), [escalation](concepts/escalation.md).
|
|
180
|
+
|
|
181
|
+
### Providers
|
|
182
|
+
|
|
183
|
+
`pai providers` lists them, `pai providers use NAME` switches; say "which providers". See [providers](concepts/providers.md), [`pai providers`](commands/providers.md).
|
|
184
|
+
|
|
185
|
+
### Local models
|
|
186
|
+
|
|
187
|
+
`pai models` shows every local runtime with its models, memory and users, and starts or stops one. See [local models](concepts/local-models.md), [`pai models`](commands/models.md).
|
|
188
|
+
|
|
189
|
+
### Pool and panes
|
|
190
|
+
|
|
191
|
+
A pool keeps warm spare workers; `pai pane run` runs a command in a visible pane. See [pool](concepts/pool.md), [panes](concepts/panes.md), [`pai pane`](commands/pane.md).
|
|
192
|
+
|
|
193
|
+
### Plans
|
|
194
|
+
|
|
195
|
+
`pai plan run` runs a planned job on local workers without a model in the loop; `validate`, `status` and `stop` complete it. See [plan runner](plan-runner.md), [`pai plan`](commands/plan.md).
|
|
196
|
+
|
|
197
|
+
### Queue
|
|
198
|
+
|
|
199
|
+
`pai queue add` collects small changes, `pai queue run` runs them on a local worker, `pai queue review` lets you accept or reject them in a batch. See [queue](queue.md), [`pai queue`](commands/queue.md).
|
|
200
|
+
|
|
201
|
+
### Build queue
|
|
202
|
+
|
|
203
|
+
`pai build run` serialises builds across the machine. See [builds](builds.md), [`pai build`](commands/build.md).
|
|
204
|
+
|
|
205
|
+
### Large coding jobs
|
|
206
|
+
|
|
207
|
+
The three-tier pattern for big jobs. See [three-tier coding](three-tier-coding.md).
|
|
208
|
+
|
|
209
|
+
## Router and cockpit
|
|
210
|
+
|
|
211
|
+
### Router
|
|
212
|
+
|
|
213
|
+
`pai router start`, `stop`, `restart`, `status` and `stats` run the local service that records usage per provider and schedules local runtimes. See [router](concepts/router.md), [`pai router`](commands/router.md).
|
|
214
|
+
|
|
215
|
+
### Cockpit
|
|
216
|
+
|
|
217
|
+
Open `http://127.0.0.1:8790/cockpit` for budget per provider, cache hits, models with start and stop, workers, routing and memory progress. See [cockpit](cockpit.md), [`pai cockpit`](commands/cockpit.md).
|
|
218
|
+
|
|
219
|
+
### Where tokens go
|
|
220
|
+
|
|
221
|
+
`pai audit tokens` shows where tokens are being spent; `pai skill telemetry` shows how your skills are used. See [`pai audit`](commands/audit.md), [`pai skill`](commands/skill.md).
|
|
222
|
+
|
|
223
|
+
## Messaging
|
|
224
|
+
|
|
225
|
+
### AIBroker
|
|
226
|
+
|
|
227
|
+
PAI's messaging layer is the separate project AIBroker: messages between sessions, worker reports to the session that started them, tab names, and WhatsApp, Telegram and PAILot. `pai setup` installs it. See [companion projects](companion-projects.md).
|
|
228
|
+
|
|
229
|
+
### PAILot as an input channel
|
|
230
|
+
|
|
231
|
+
Text and voice from the PAILot phone app reach the session through AIBroker as `[PAILot]` messages; the session answers on the same channel. See [companion projects](companion-projects.md).
|
|
232
|
+
|
|
233
|
+
### WhatsApp as an input channel
|
|
234
|
+
|
|
235
|
+
Messages to your WhatsApp self-chat reach the session as `[Whazaa]` messages and are answered there. See [companion projects](companion-projects.md).
|
|
236
|
+
|
|
237
|
+
### Telegram as an input channel
|
|
238
|
+
|
|
239
|
+
Messages to your Telegram bot reach the session as `[Telex]` messages and are answered there. See [companion projects](companion-projects.md).
|
|
240
|
+
|
|
241
|
+
### Notifications
|
|
242
|
+
|
|
243
|
+
`pai notify status`, `set`, `test` and `send` control what reaches your phone. See [notifications](concepts/notifications.md), [`pai notify`](commands/notify.md).
|
|
244
|
+
|
|
245
|
+
## Rules, budget and advisor mode
|
|
246
|
+
|
|
247
|
+
### Whisper rules
|
|
248
|
+
|
|
249
|
+
Say "add whisper rule" or "show whisper rules". Skill `/whisper` keeps behavioural rules that are injected on every prompt. See [rules and privacy](rules-and-privacy.md).
|
|
250
|
+
|
|
251
|
+
### Budget and advisor mode
|
|
252
|
+
|
|
253
|
+
Say "budget mode" or "save budget". Skill `/advisor` chooses subagent models by how much of your weekly Claude budget is used. See [budget advisor](budget-advisor.md).
|
|
254
|
+
|
|
255
|
+
### Privacy tags
|
|
256
|
+
|
|
257
|
+
Wrap text in `<private>...</private>` to keep it out of the memory index. See [rules and privacy](rules-and-privacy.md#privacy-tags).
|
|
258
|
+
|
|
259
|
+
### Cache keepalive
|
|
260
|
+
|
|
261
|
+
Keeps a worker's provider cache warm between turns. See [cache keepalive](cache-keepalive.md).
|
|
262
|
+
|
|
263
|
+
## Images, art and sharing
|
|
264
|
+
|
|
265
|
+
### Art and diagrams
|
|
266
|
+
|
|
267
|
+
Say "create diagram", "flowchart" or "visualize". Skill `/art` makes diagrams and AI-generated images. See [skills](skills.md#tools--system).
|
|
268
|
+
|
|
269
|
+
### Share
|
|
270
|
+
|
|
271
|
+
Say "share on LinkedIn", "tweet about" or "post to Bluesky". Skill `/share` drafts posts about finished work. See [skills](skills.md#productivity).
|
|
272
|
+
|
|
273
|
+
## Research
|
|
274
|
+
|
|
275
|
+
### Research and extraction
|
|
276
|
+
|
|
277
|
+
Say "do research", "extract wisdom" or "analyze content". Skill `/research` runs web research and content analysis with parallel agents. See [skills](skills.md#tools--system).
|
|
278
|
+
|
|
279
|
+
## Setup and health
|
|
280
|
+
|
|
281
|
+
### Setup and update
|
|
282
|
+
|
|
283
|
+
`pai setup` does first-time setup (storage, search, hooks, daemon); `pai update` updates PAI. Or tell Claude "set up PAI". See [install](install/index.md), [`pai setup`](commands/setup.md), [`pai update`](commands/update.md).
|
|
284
|
+
|
|
285
|
+
### Daemon and configuration
|
|
286
|
+
|
|
287
|
+
`pai daemon status`, `start`, `stop`, `restart`, `logs`; `pai config` shows and changes settings; `pai home path` prints where PAI keeps its files. See [`pai daemon`](commands/daemon.md), [`pai config`](commands/config.md), [PAI home](pai-home.md).
|
|
288
|
+
|
|
289
|
+
### Backup and restore
|
|
290
|
+
|
|
291
|
+
`pai backup` saves the registry, config and database; `pai restore` brings them back. See [`pai backup`](commands/backup.md), [`pai restore`](commands/restore.md).
|
|
292
|
+
|
|
293
|
+
### Database and MCP tools
|
|
294
|
+
|
|
295
|
+
`pai db` looks into the PAI database read only; `pai mcp` installs the PAI tools for Claude Code. See [`pai db`](commands/db.md), [`pai mcp`](commands/mcp.md).
|
|
296
|
+
|
|
297
|
+
### Observability dashboard
|
|
298
|
+
|
|
299
|
+
Say "start observability" or "monitor agents". Skill `/observability`. See [skills](skills.md#tools--system).
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
<mxfile host="drawio"><diagram name="PAI architecture" id="arch"><mxGraphModel dx="940" dy="770" grid="0" page="1" pageScale="1" pageWidth="940" pageHeight="770" background="#ffffff" math="0" shadow="0"><root><mxCell id="0"/><mxCell id="1" parent="0"/>
|
|
2
|
+
<mxCell id="bg" value="" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#d5dbe1;" vertex="1" parent="1"><mxGeometry x="0" y="0" width="940" height="760" as="geometry"/></mxCell>
|
|
3
|
+
<mxCell id="title" value="PAI architecture" style="text;html=1;fillColor=none;strokeColor=none;fontColor=#1f2933;fontSize=16;align=left;verticalAlign=middle;whiteSpace=wrap;fontStyle=1;" vertex="1" parent="1"><mxGeometry x="20" y="6" width="400" height="26" as="geometry"/></mxCell>
|
|
4
|
+
<mxCell id="cc" value="Claude Code sessions (front end)" style="rounded=1;arcSize=3;whiteSpace=wrap;html=1;fillColor=#f5f7fa;strokeColor=#52606d;fontColor=#1f2933;fontSize=13;fontStyle=1;verticalAlign=top;align=left;spacingLeft=10;spacingTop=4;" vertex="1" parent="1"><mxGeometry x="40" y="40" width="600" height="90" as="geometry"/></mxCell>
|
|
5
|
+
<mxCell id="hooks" value="PAI hooks" style="rounded=1;arcSize=10;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#52606d;fontColor=#1f2933;fontSize=11;" vertex="1" parent="1"><mxGeometry x="55" y="74" width="180" height="46" as="geometry"/></mxCell>
|
|
6
|
+
<mxCell id="skills" value="PAI skills" style="rounded=1;arcSize=10;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#52606d;fontColor=#1f2933;fontSize=11;" vertex="1" parent="1"><mxGeometry x="250" y="74" width="180" height="46" as="geometry"/></mxCell>
|
|
7
|
+
<mxCell id="you" value="You (terminal)" style="rounded=1;arcSize=10;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#52606d;fontColor=#1f2933;fontSize=11;" vertex="1" parent="1"><mxGeometry x="445" y="74" width="180" height="46" as="geometry"/></mxCell>
|
|
8
|
+
<mxCell id="ing" value="Ingress" style="rounded=1;arcSize=3;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#c2185b;fontColor=#1f2933;fontSize=13;fontStyle=1;verticalAlign=top;align=left;spacingLeft=10;spacingTop=4;dashed=1;" vertex="1" parent="1"><mxGeometry x="660" y="40" width="260" height="90" as="geometry"/></mxCell>
|
|
9
|
+
<mxCell id="i1" value="Todoist" style="rounded=1;arcSize=10;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#c2185b;fontColor=#1f2933;fontSize=10;" vertex="1" parent="1"><mxGeometry x="670" y="70" width="70" height="24" as="geometry"/></mxCell>
|
|
10
|
+
<mxCell id="i2" value="GitHub issues" style="rounded=1;arcSize=10;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#c2185b;fontColor=#1f2933;fontSize=10;" vertex="1" parent="1"><mxGeometry x="745" y="70" width="90" height="24" as="geometry"/></mxCell>
|
|
11
|
+
<mxCell id="i3" value="PAILot" style="rounded=1;arcSize=10;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#c2185b;fontColor=#1f2933;fontSize=10;" vertex="1" parent="1"><mxGeometry x="840" y="70" width="70" height="24" as="geometry"/></mxCell>
|
|
12
|
+
<mxCell id="i4" value="WhatsApp" style="rounded=1;arcSize=10;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#c2185b;fontColor=#1f2933;fontSize=10;" vertex="1" parent="1"><mxGeometry x="670" y="98" width="110" height="24" as="geometry"/></mxCell>
|
|
13
|
+
<mxCell id="i5" value="Telegram" style="rounded=1;arcSize=10;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#c2185b;fontColor=#1f2933;fontSize=10;" vertex="1" parent="1"><mxGeometry x="790" y="98" width="120" height="24" as="geometry"/></mxCell>
|
|
14
|
+
<mxCell id="core" value="PAI core" style="rounded=1;arcSize=3;whiteSpace=wrap;html=1;fillColor=#e8f1fb;strokeColor=#1565c0;fontColor=#1f2933;fontSize=13;fontStyle=1;verticalAlign=top;align=left;spacingLeft=10;spacingTop=4;" vertex="1" parent="1"><mxGeometry x="40" y="160" width="410" height="298" as="geometry"/></mxCell>
|
|
15
|
+
<mxCell id="cli" value="<b>pai</b> CLI" style="rounded=1;arcSize=10;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#1565c0;fontColor=#1f2933;fontSize=11;" vertex="1" parent="1"><mxGeometry x="52" y="192" width="80" height="50" as="geometry"/></mxCell>
|
|
16
|
+
<mxCell id="dmn" value="<b>PAI daemon</b><br>memory index · embeddings<br>scheduler · MCP server" style="rounded=1;arcSize=10;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#1565c0;fontColor=#1f2933;fontSize=11;" vertex="1" parent="1"><mxGeometry x="142" y="192" width="296" height="50" as="geometry"/></mxCell>
|
|
17
|
+
<mxCell id="notes" value="Notes · session notes, vault" style="rounded=1;arcSize=10;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#1565c0;fontColor=#1f2933;fontSize=11;" vertex="1" parent="1"><mxGeometry x="52" y="252" width="180" height="40" as="geometry"/></mxCell>
|
|
18
|
+
<mxCell id="stor" value="Storage · SQLite or Postgres + pgvector" style="rounded=1;arcSize=10;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#1565c0;fontColor=#1f2933;fontSize=11;" vertex="1" parent="1"><mxGeometry x="242" y="252" width="196" height="40" as="geometry"/></mxCell>
|
|
19
|
+
<mxCell id="rtr" value="Router · 127.0.0.1:8790<br><font style="font-size:9px;font-weight:normal">per tier: ordered models, first available serves · set as default or per session</font>" style="rounded=1;arcSize=3;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#1565c0;fontColor=#1f2933;fontSize=13;fontStyle=1;verticalAlign=top;align=left;spacingLeft=10;spacingTop=4;" vertex="1" parent="1"><mxGeometry x="52" y="304" width="386" height="98" as="geometry"/></mxCell>
|
|
20
|
+
<mxCell id="t0" value="t0<br>session" style="rounded=1;arcSize=10;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#1565c0;fontColor=#1f2933;fontSize=10;" vertex="1" parent="1"><mxGeometry x="62" y="350" width="62" height="44" as="geometry"/></mxCell>
|
|
21
|
+
<mxCell id="t1" value="t1<br>orchestrator" style="rounded=1;arcSize=10;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#1565c0;fontColor=#1f2933;fontSize=10;" vertex="1" parent="1"><mxGeometry x="130" y="350" width="88" height="44" as="geometry"/></mxCell>
|
|
22
|
+
<mxCell id="t2" value="t2 workers<br>local first" style="rounded=1;arcSize=10;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#1565c0;fontColor=#1f2933;fontSize=10;" vertex="1" parent="1"><mxGeometry x="224" y="350" width="90" height="44" as="geometry"/></mxCell>
|
|
23
|
+
<mxCell id="ckp" value="Cockpit<br>budget · cache<br>models · routing" style="rounded=1;arcSize=10;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#1565c0;fontColor=#1f2933;fontSize=10;" vertex="1" parent="1"><mxGeometry x="320" y="350" width="108" height="44" as="geometry"/></mxCell>
|
|
24
|
+
<mxCell id="wrk" value="<b>Workers</b> · pane + git worktree<br>pai worker run / merge" style="rounded=1;arcSize=10;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#1565c0;fontColor=#1f2933;fontSize=10;" vertex="1" parent="1"><mxGeometry x="200" y="412" width="238" height="38" as="geometry"/></mxCell>
|
|
25
|
+
<mxCell id="ab" value="AIBroker (separate project)" style="rounded=1;arcSize=3;whiteSpace=wrap;html=1;fillColor=#fdeef4;strokeColor=#c2185b;fontColor=#1f2933;fontSize=13;fontStyle=1;verticalAlign=top;align=left;spacingLeft=10;spacingTop=4;" vertex="1" parent="1"><mxGeometry x="520" y="160" width="400" height="298" as="geometry"/></mxCell>
|
|
26
|
+
<mxCell id="aA" value="<b>Messaging hub</b><br>session messages · worker reports" style="rounded=1;arcSize=10;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#c2185b;fontColor=#1f2933;fontSize=11;" vertex="1" parent="1"><mxGeometry x="532" y="192" width="376" height="60" as="geometry"/></mxCell>
|
|
27
|
+
<mxCell id="aB" value="<b>Session control</b><br>naming · switching · delivering into terminal sessions" style="rounded=1;arcSize=10;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#c2185b;fontColor=#1f2933;fontSize=11;" vertex="1" parent="1"><mxGeometry x="532" y="262" width="376" height="60" as="geometry"/></mxCell>
|
|
28
|
+
<mxCell id="aC" value="<b>Inbound channels</b> into sessions, with prefixes<br>[Whazaa] [Telex] [PAILot] [Task]" style="rounded=1;arcSize=10;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#c2185b;fontColor=#1f2933;fontSize=11;" vertex="1" parent="1"><mxGeometry x="532" y="332" width="376" height="60" as="geometry"/></mxCell>
|
|
29
|
+
<mxCell id="aD" value="AIBroker daemon" style="rounded=1;arcSize=10;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#c2185b;fontColor=#1f2933;fontSize=11;" vertex="1" parent="1"><mxGeometry x="532" y="402" width="376" height="40" as="geometry"/></mxCell>
|
|
30
|
+
<mxCell id="prov" value="Model providers" style="rounded=1;arcSize=3;whiteSpace=wrap;html=1;fillColor=#e9f6ec;strokeColor=#2e7d32;fontColor=#1f2933;fontSize=13;fontStyle=1;verticalAlign=top;align=left;spacingLeft=10;spacingTop=4;" vertex="1" parent="1"><mxGeometry x="40" y="474" width="410" height="70" as="geometry"/></mxCell>
|
|
31
|
+
<mxCell id="p1" value="<b>Anthropic</b><br>Opus · Sonnet" style="rounded=1;arcSize=10;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#2e7d32;fontColor=#1f2933;fontSize=10;" vertex="1" parent="1"><mxGeometry x="50" y="502" width="120" height="36" as="geometry"/></mxCell>
|
|
32
|
+
<mxCell id="p2" value="<b>Other cloud</b><br>e.g. GLM, Kimi" style="rounded=1;arcSize=10;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#2e7d32;fontColor=#1f2933;fontSize=10;" vertex="1" parent="1"><mxGeometry x="176" y="502" width="120" height="36" as="geometry"/></mxCell>
|
|
33
|
+
<mxCell id="p3" value="<b>Local models</b><br>Strata · vllm-mlx · Ollama" style="rounded=1;arcSize=10;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#2e7d32;fontColor=#1f2933;fontSize=10;" vertex="1" parent="1"><mxGeometry x="302" y="502" width="138" height="36" as="geometry"/></mxCell>
|
|
34
|
+
<mxCell id="pnote" value="t2 goes local first, then cloud when local cannot serve or budget is out." style="text;html=1;fillColor=none;strokeColor=none;fontColor=#52606d;fontSize=10;align=left;verticalAlign=middle;whiteSpace=wrap;" vertex="1" parent="1"><mxGeometry x="600" y="482" width="320" height="50" as="geometry"/></mxCell>
|
|
35
|
+
<mxCell id="os" value="Operating system" style="rounded=1;arcSize=3;whiteSpace=wrap;html=1;fillColor=#fff3e0;strokeColor=#e65100;fontColor=#1f2933;fontSize=13;fontStyle=1;verticalAlign=top;align=left;spacingLeft=10;spacingTop=4;" vertex="1" parent="1"><mxGeometry x="40" y="566" width="880" height="150" as="geometry"/></mxCell>
|
|
36
|
+
<mxCell id="term" value="<b>Terminal and session control</b><br>iTerm2 · tmux<br>worker panes · session tabs · typing into sessions" style="rounded=1;arcSize=10;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#e65100;fontColor=#1f2933;fontSize=11;" vertex="1" parent="1"><mxGeometry x="50" y="596" width="560" height="56" as="geometry"/></mxCell>
|
|
37
|
+
<mxCell id="wt" value="<b>Git worktrees on disk</b><br>one per worker (worker/ID)" style="rounded=1;arcSize=10;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#e65100;fontColor=#1f2933;fontSize=11;" vertex="1" parent="1"><mxGeometry x="620" y="596" width="290" height="56" as="geometry"/></mxCell>
|
|
38
|
+
<mxCell id="svc" value="<b>Services</b> · launchd (macOS) / systemd (Linux)<br>run the PAI daemon and the AIBroker daemon" style="rounded=1;arcSize=10;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#e65100;fontColor=#1f2933;fontSize=11;" vertex="1" parent="1"><mxGeometry x="50" y="662" width="860" height="44" as="geometry"/></mxCell>
|
|
39
|
+
<mxCell id="hk" value="hooks · MCP" style="text;html=1;fillColor=none;strokeColor=none;fontColor=#52606d;fontSize=10;align=left;verticalAlign=middle;whiteSpace=wrap;" vertex="1" parent="1"><mxGeometry x="250" y="134" width="100" height="22" as="geometry"/></mxCell>
|
|
40
|
+
<mxCell id="legend" value="Arrows: solid = requests and control · dashed = messages and reports · two heads = both directions" style="text;html=1;fillColor=none;strokeColor=none;fontColor=#52606d;fontSize=10;align=left;verticalAlign=middle;whiteSpace=wrap;" vertex="1" parent="1"><mxGeometry x="40" y="724" width="880" height="24" as="geometry"/></mxCell>
|
|
41
|
+
<mxCell id="e1" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=1;html=1;strokeColor=#52606d;strokeWidth=1.5;fontSize=10;fontColor=#1f2933;labelBackgroundColor=#ffffff;endArrow=block;endFill=1;startArrow=block;startFill=1;exitX=0.333;exitY=1;entryX=0.488;entryY=0;exitPerimeter=0;entryPerimeter=0;" edge="1" parent="1" source="cc" target="core"><mxGeometry relative="1" as="geometry"></mxGeometry></mxCell>
|
|
42
|
+
<mxCell id="e2" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=1;html=1;strokeColor=#52606d;strokeWidth=1.5;fontSize=10;fontColor=#1f2933;labelBackgroundColor=#ffffff;endArrow=block;endFill=1;startArrow=none;exitX=0;exitY=0.9;entryX=0;entryY=0.5;exitPerimeter=0;entryPerimeter=0;" edge="1" parent="1" source="cc" target="rtr"><mxGeometry relative="1" as="geometry"><Array as="points"><mxPoint x="22" y="121"/><mxPoint x="22" y="353"/></Array></mxGeometry></mxCell>
|
|
43
|
+
<mxCell id="e3" value="delivers" style="edgeStyle=orthogonalEdgeStyle;rounded=1;html=1;strokeColor=#c2185b;strokeWidth=1.5;fontSize=10;fontColor=#1f2933;labelBackgroundColor=#ffffff;endArrow=block;endFill=1;startArrow=none;dashed=1;exitX=0.2;exitY=0;entryX=0.933;entryY=1;exitPerimeter=0;entryPerimeter=0;" edge="1" parent="1" source="ab" target="cc"><mxGeometry relative="1" as="geometry"></mxGeometry></mxCell>
|
|
44
|
+
<mxCell id="e4" value="inbound" style="edgeStyle=orthogonalEdgeStyle;rounded=1;html=1;strokeColor=#c2185b;strokeWidth=1.5;fontSize=10;fontColor=#1f2933;labelBackgroundColor=#ffffff;endArrow=block;endFill=1;startArrow=none;dashed=1;exitX=0.5;exitY=1;entryX=0.5;entryY=0;exitPerimeter=0;entryPerimeter=0;" edge="1" parent="1" source="ing" target="ab"><mxGeometry relative="1" as="geometry"></mxGeometry></mxCell>
|
|
45
|
+
<mxCell id="e5" value="messages<br>tab names" style="edgeStyle=orthogonalEdgeStyle;rounded=1;html=1;strokeColor=#c2185b;strokeWidth=1.5;fontSize=10;fontColor=#1f2933;labelBackgroundColor=#ffffff;endArrow=block;endFill=1;startArrow=block;startFill=1;dashed=1;exitX=1;exitY=0.36;entryX=0;entryY=0.3;exitPerimeter=0;entryPerimeter=0;" edge="1" parent="1" source="dmn" target="aA"><mxGeometry relative="1" as="geometry"></mxGeometry></mxCell>
|
|
46
|
+
<mxCell id="e6" value="reports" style="edgeStyle=orthogonalEdgeStyle;rounded=1;html=1;strokeColor=#c2185b;strokeWidth=1.5;fontSize=10;fontColor=#1f2933;labelBackgroundColor=#ffffff;endArrow=block;endFill=1;startArrow=none;dashed=1;exitX=1;exitY=0.25;entryX=0;entryY=0.78;exitPerimeter=0;entryPerimeter=0;" edge="1" parent="1" source="wrk" target="aA"><mxGeometry relative="1" as="geometry"><Array as="points"><mxPoint x="470" y="421"/><mxPoint x="470" y="239"/></Array></mxGeometry></mxCell>
|
|
47
|
+
<mxCell id="e7" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=1;html=1;strokeColor=#1565c0;strokeWidth=1.5;fontSize=10;fontColor=#1f2933;labelBackgroundColor=#ffffff;endArrow=block;endFill=1;startArrow=none;exitX=0.15;exitY=1;entryX=0.171;entryY=0;exitPerimeter=0;entryPerimeter=0;" edge="1" parent="1" source="rtr" target="prov"><mxGeometry relative="1" as="geometry"></mxGeometry></mxCell>
|
|
48
|
+
<mxCell id="e8" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=1;html=1;strokeColor=#1565c0;strokeWidth=1.5;fontSize=10;fontColor=#1f2933;labelBackgroundColor=#ffffff;endArrow=block;endFill=1;startArrow=none;exitX=0.29;exitY=0;entryX=0.5;entryY=1;exitPerimeter=0;entryPerimeter=0;" edge="1" parent="1" source="wrk" target="t2"><mxGeometry relative="1" as="geometry"></mxGeometry></mxCell>
|
|
49
|
+
<mxCell id="e9" value="panes" style="edgeStyle=orthogonalEdgeStyle;rounded=1;html=1;strokeColor=#1565c0;strokeWidth=1.5;fontSize=10;fontColor=#1f2933;labelBackgroundColor=#ffffff;endArrow=block;endFill=1;startArrow=none;exitX=1;exitY=0.75;entryX=0.759;entryY=0;exitPerimeter=0;entryPerimeter=0;" edge="1" parent="1" source="wrk" target="term"><mxGeometry relative="1" as="geometry"><Array as="points"><mxPoint x="475" y="441"/></Array></mxGeometry></mxCell>
|
|
50
|
+
<mxCell id="e10" value="types into sessions" style="edgeStyle=orthogonalEdgeStyle;rounded=1;html=1;strokeColor=#c2185b;strokeWidth=1.5;fontSize=10;fontColor=#1f2933;labelBackgroundColor=#ffffff;endArrow=block;endFill=1;startArrow=none;exitX=0.1;exitY=1;entryX=0.9;entryY=0;exitPerimeter=0;entryPerimeter=0;" edge="1" parent="1" source="ab" target="term"><mxGeometry relative="1" as="geometry"></mxGeometry></mxCell>
|
|
51
|
+
</root></mxGraphModel></diagram></mxfile>
|
|
Binary file
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
|
3
|
+
<svg xmlns="http://www.w3.org/2000/svg" style="background: #ffffff; background-color: light-dark(#ffffff, #121212); color-scheme: light dark;" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="972px" height="792px" viewBox="0 0 972 792"><defs/><rect fill="#ffffff" width="100%" height="100%" x="0" y="0" style="fill: light-dark(rgb(255, 255, 255), rgb(18, 18, 18));"/><g><g data-cell-id="0"><g data-cell-id="1"><g data-cell-id="bg"><g transform="translate(0.5,0.5)"><rect x="10" y="10" width="940" height="760" fill="#ffffff" stroke="#d5dbe1" pointer-events="all" style="fill: light-dark(rgb(255, 255, 255), rgb(18, 18, 18)); stroke: light-dark(rgb(213, 219, 225), rgb(45, 50, 55));"/></g></g><g data-cell-id="title"><g><rect x="30" y="16" width="400" height="26" fill="none" stroke="none" pointer-events="all"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 398px; height: 1px; padding-top: 29px; margin-left: 32px;"><div style="box-sizing: border-box; font-size: 0; text-align: left; color: #1f2933; "><div style="display: inline-block; font-size: 16px; font-family: Helvetica; color: light-dark(#1f2933, #c4ccd5); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; word-wrap: normal; ">PAI architecture</div></div></div></foreignObject><text x="32" y="34" fill="#1f2933" font-family="Helvetica" font-size="16px" font-weight="bold" style="fill: light-dark(rgb(31, 41, 51), rgb(196, 204, 213));">PAI architecture</text></switch></g></g></g><g data-cell-id="cc"><g transform="translate(0.5,0.5)"><rect x="50" y="50" width="600" height="90" rx="2.7" ry="2.7" fill="#f5f7fa" stroke="#52606d" pointer-events="all" style="fill: light-dark(rgb(245, 247, 250), rgb(24, 25, 28)); stroke: light-dark(rgb(82, 96, 109), rgb(146, 158, 170));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe flex-start; width: 588px; height: 1px; padding-top: 61px; margin-left: 62px;"><div style="box-sizing: border-box; font-size: 0; text-align: left; color: #1f2933; "><div style="display: inline-block; font-size: 13px; font-family: Helvetica; color: light-dark(#1f2933, #c4ccd5); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; word-wrap: normal; ">Claude Code sessions (front end)</div></div></div></foreignObject><text x="62" y="74" fill="#1f2933" font-family="Helvetica" font-size="13px" font-weight="bold" style="fill: light-dark(rgb(31, 41, 51), rgb(196, 204, 213));">Claude Code sessions (front end)</text></switch></g></g></g><g data-cell-id="hooks"><g transform="translate(0.5,0.5)"><rect x="65" y="84" width="180" height="46" rx="4.6" ry="4.6" fill="#ffffff" stroke="#52606d" pointer-events="all" style="fill: light-dark(rgb(255, 255, 255), rgb(18, 18, 18)); stroke: light-dark(rgb(82, 96, 109), rgb(146, 158, 170));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 178px; height: 1px; padding-top: 107px; margin-left: 66px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #1f2933; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: light-dark(#1f2933, #c4ccd5); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">PAI hooks</div></div></div></foreignObject><text x="155" y="110" fill="#1f2933" font-family="Helvetica" font-size="11px" text-anchor="middle" style="fill: light-dark(rgb(31, 41, 51), rgb(196, 204, 213));">PAI hooks</text></switch></g></g></g><g data-cell-id="skills"><g transform="translate(0.5,0.5)"><rect x="260" y="84" width="180" height="46" rx="4.6" ry="4.6" fill="#ffffff" stroke="#52606d" pointer-events="all" style="fill: light-dark(rgb(255, 255, 255), rgb(18, 18, 18)); stroke: light-dark(rgb(82, 96, 109), rgb(146, 158, 170));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 178px; height: 1px; padding-top: 107px; margin-left: 261px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #1f2933; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: light-dark(#1f2933, #c4ccd5); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">PAI skills</div></div></div></foreignObject><text x="350" y="110" fill="#1f2933" font-family="Helvetica" font-size="11px" text-anchor="middle" style="fill: light-dark(rgb(31, 41, 51), rgb(196, 204, 213));">PAI skills</text></switch></g></g></g><g data-cell-id="you"><g transform="translate(0.5,0.5)"><rect x="455" y="84" width="180" height="46" rx="4.6" ry="4.6" fill="#ffffff" stroke="#52606d" pointer-events="all" style="fill: light-dark(rgb(255, 255, 255), rgb(18, 18, 18)); stroke: light-dark(rgb(82, 96, 109), rgb(146, 158, 170));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 178px; height: 1px; padding-top: 107px; margin-left: 456px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #1f2933; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: light-dark(#1f2933, #c4ccd5); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">You (terminal)</div></div></div></foreignObject><text x="545" y="110" fill="#1f2933" font-family="Helvetica" font-size="11px" text-anchor="middle" style="fill: light-dark(rgb(31, 41, 51), rgb(196, 204, 213));">You (terminal)</text></switch></g></g></g><g data-cell-id="ing"><g transform="translate(0.5,0.5)"><rect x="670" y="50" width="260" height="90" rx="2.7" ry="2.7" fill="#ffffff" stroke="#c2185b" stroke-dasharray="3 3" pointer-events="all" style="fill: light-dark(rgb(255, 255, 255), rgb(18, 18, 18)); stroke: light-dark(rgb(194, 24, 91), rgb(255, 146, 204));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe flex-start; width: 248px; height: 1px; padding-top: 61px; margin-left: 682px;"><div style="box-sizing: border-box; font-size: 0; text-align: left; color: #1f2933; "><div style="display: inline-block; font-size: 13px; font-family: Helvetica; color: light-dark(#1f2933, #c4ccd5); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; word-wrap: normal; ">Ingress</div></div></div></foreignObject><text x="682" y="74" fill="#1f2933" font-family="Helvetica" font-size="13px" font-weight="bold" style="fill: light-dark(rgb(31, 41, 51), rgb(196, 204, 213));">Ingress</text></switch></g></g></g><g data-cell-id="i1"><g transform="translate(0.5,0.5)"><rect x="680" y="80" width="70" height="24" rx="2.4" ry="2.4" fill="#ffffff" stroke="#c2185b" pointer-events="all" style="fill: light-dark(rgb(255, 255, 255), rgb(18, 18, 18)); stroke: light-dark(rgb(194, 24, 91), rgb(255, 146, 204));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 68px; height: 1px; padding-top: 92px; margin-left: 681px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #1f2933; "><div style="display: inline-block; font-size: 10px; font-family: Helvetica; color: light-dark(#1f2933, #c4ccd5); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">Todoist</div></div></div></foreignObject><text x="715" y="95" fill="#1f2933" font-family="Helvetica" font-size="10px" text-anchor="middle" style="fill: light-dark(rgb(31, 41, 51), rgb(196, 204, 213));">Todoist</text></switch></g></g></g><g data-cell-id="i2"><g transform="translate(0.5,0.5)"><rect x="755" y="80" width="90" height="24" rx="2.4" ry="2.4" fill="#ffffff" stroke="#c2185b" pointer-events="all" style="fill: light-dark(rgb(255, 255, 255), rgb(18, 18, 18)); stroke: light-dark(rgb(194, 24, 91), rgb(255, 146, 204));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 88px; height: 1px; padding-top: 92px; margin-left: 756px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #1f2933; "><div style="display: inline-block; font-size: 10px; font-family: Helvetica; color: light-dark(#1f2933, #c4ccd5); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">GitHub issues</div></div></div></foreignObject><text x="800" y="95" fill="#1f2933" font-family="Helvetica" font-size="10px" text-anchor="middle" style="fill: light-dark(rgb(31, 41, 51), rgb(196, 204, 213));">GitHub issues</text></switch></g></g></g><g data-cell-id="i3"><g transform="translate(0.5,0.5)"><rect x="850" y="80" width="70" height="24" rx="2.4" ry="2.4" fill="#ffffff" stroke="#c2185b" pointer-events="all" style="fill: light-dark(rgb(255, 255, 255), rgb(18, 18, 18)); stroke: light-dark(rgb(194, 24, 91), rgb(255, 146, 204));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 68px; height: 1px; padding-top: 92px; margin-left: 851px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #1f2933; "><div style="display: inline-block; font-size: 10px; font-family: Helvetica; color: light-dark(#1f2933, #c4ccd5); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">PAILot</div></div></div></foreignObject><text x="885" y="95" fill="#1f2933" font-family="Helvetica" font-size="10px" text-anchor="middle" style="fill: light-dark(rgb(31, 41, 51), rgb(196, 204, 213));">PAILot</text></switch></g></g></g><g data-cell-id="i4"><g transform="translate(0.5,0.5)"><rect x="680" y="108" width="110" height="24" rx="2.4" ry="2.4" fill="#ffffff" stroke="#c2185b" pointer-events="all" style="fill: light-dark(rgb(255, 255, 255), rgb(18, 18, 18)); stroke: light-dark(rgb(194, 24, 91), rgb(255, 146, 204));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 108px; height: 1px; padding-top: 120px; margin-left: 681px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #1f2933; "><div style="display: inline-block; font-size: 10px; font-family: Helvetica; color: light-dark(#1f2933, #c4ccd5); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">WhatsApp</div></div></div></foreignObject><text x="735" y="123" fill="#1f2933" font-family="Helvetica" font-size="10px" text-anchor="middle" style="fill: light-dark(rgb(31, 41, 51), rgb(196, 204, 213));">WhatsApp</text></switch></g></g></g><g data-cell-id="i5"><g transform="translate(0.5,0.5)"><rect x="800" y="108" width="120" height="24" rx="2.4" ry="2.4" fill="#ffffff" stroke="#c2185b" pointer-events="all" style="fill: light-dark(rgb(255, 255, 255), rgb(18, 18, 18)); stroke: light-dark(rgb(194, 24, 91), rgb(255, 146, 204));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 120px; margin-left: 801px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #1f2933; "><div style="display: inline-block; font-size: 10px; font-family: Helvetica; color: light-dark(#1f2933, #c4ccd5); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">Telegram</div></div></div></foreignObject><text x="860" y="123" fill="#1f2933" font-family="Helvetica" font-size="10px" text-anchor="middle" style="fill: light-dark(rgb(31, 41, 51), rgb(196, 204, 213));">Telegram</text></switch></g></g></g><g data-cell-id="core"><g transform="translate(0.5,0.5)"><rect x="50" y="170" width="410" height="298" rx="8.94" ry="8.94" fill="#e8f1fb" stroke="#1565c0" pointer-events="all" style="fill: light-dark(rgb(232, 241, 251), rgb(24, 32, 41)); stroke: light-dark(rgb(21, 101, 192), rgb(99, 168, 246));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe flex-start; width: 398px; height: 1px; padding-top: 181px; margin-left: 62px;"><div style="box-sizing: border-box; font-size: 0; text-align: left; color: #1f2933; "><div style="display: inline-block; font-size: 13px; font-family: Helvetica; color: light-dark(#1f2933, #c4ccd5); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; word-wrap: normal; ">PAI core</div></div></div></foreignObject><text x="62" y="194" fill="#1f2933" font-family="Helvetica" font-size="13px" font-weight="bold" style="fill: light-dark(rgb(31, 41, 51), rgb(196, 204, 213));">PAI core</text></switch></g></g></g><g data-cell-id="cli"><g transform="translate(0.5,0.5)"><rect x="62" y="202" width="80" height="50" rx="5" ry="5" fill="#ffffff" stroke="#1565c0" pointer-events="all" style="fill: light-dark(rgb(255, 255, 255), rgb(18, 18, 18)); stroke: light-dark(rgb(21, 101, 192), rgb(99, 168, 246));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 227px; margin-left: 63px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #1f2933; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: light-dark(#1f2933, #c4ccd5); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>pai</b> CLI</div></div></div></foreignObject><text x="102" y="230" fill="#1f2933" font-family="Helvetica" font-size="11px" text-anchor="middle" style="fill: light-dark(rgb(31, 41, 51), rgb(196, 204, 213));">pai CLI</text></switch></g></g></g><g data-cell-id="dmn"><g transform="translate(0.5,0.5)"><rect x="152" y="202" width="296" height="50" rx="5" ry="5" fill="#ffffff" stroke="#1565c0" pointer-events="all" style="fill: light-dark(rgb(255, 255, 255), rgb(18, 18, 18)); stroke: light-dark(rgb(21, 101, 192), rgb(99, 168, 246));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 294px; height: 1px; padding-top: 227px; margin-left: 153px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #1f2933; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: light-dark(#1f2933, #c4ccd5); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>PAI daemon</b><br />memory index · embeddings<br />scheduler · MCP server</div></div></div></foreignObject><text x="300" y="217" fill="#1f2933" font-family="Helvetica" font-size="11px" text-anchor="middle" style="fill: light-dark(rgb(31, 41, 51), rgb(196, 204, 213));"><tspan x="300" y="217">PAI daemon</tspan><tspan x="300" y="230">memory index · embeddings</tspan><tspan x="300" y="243">scheduler · MCP server</tspan></text></switch></g></g></g><g data-cell-id="notes"><g transform="translate(0.5,0.5)"><rect x="62" y="262" width="180" height="40" rx="4" ry="4" fill="#ffffff" stroke="#1565c0" pointer-events="all" style="fill: light-dark(rgb(255, 255, 255), rgb(18, 18, 18)); stroke: light-dark(rgb(21, 101, 192), rgb(99, 168, 246));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 178px; height: 1px; padding-top: 282px; margin-left: 63px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #1f2933; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: light-dark(#1f2933, #c4ccd5); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">Notes · session notes, vault</div></div></div></foreignObject><text x="152" y="285" fill="#1f2933" font-family="Helvetica" font-size="11px" text-anchor="middle" style="fill: light-dark(rgb(31, 41, 51), rgb(196, 204, 213));">Notes · session notes, vault</text></switch></g></g></g><g data-cell-id="stor"><g transform="translate(0.5,0.5)"><rect x="252" y="262" width="196" height="40" rx="4" ry="4" fill="#ffffff" stroke="#1565c0" pointer-events="all" style="fill: light-dark(rgb(255, 255, 255), rgb(18, 18, 18)); stroke: light-dark(rgb(21, 101, 192), rgb(99, 168, 246));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 194px; height: 1px; padding-top: 282px; margin-left: 253px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #1f2933; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: light-dark(#1f2933, #c4ccd5); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">Storage · SQLite or Postgres + pgvector</div></div></div></foreignObject><text x="350" y="279" fill="#1f2933" font-family="Helvetica" font-size="11px" text-anchor="middle" style="fill: light-dark(rgb(31, 41, 51), rgb(196, 204, 213));"><tspan x="350" y="279">Storage · SQLite or Postgres +</tspan><tspan x="350" y="292">pgvector</tspan></text></switch></g></g></g><g data-cell-id="rtr"><g transform="translate(0.5,0.5)"><rect x="62" y="314" width="386" height="98" rx="2.94" ry="2.94" fill="#ffffff" stroke="#1565c0" pointer-events="all" style="fill: light-dark(rgb(255, 255, 255), rgb(18, 18, 18)); stroke: light-dark(rgb(21, 101, 192), rgb(99, 168, 246));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe flex-start; width: 374px; height: 1px; padding-top: 325px; margin-left: 74px;"><div style="box-sizing: border-box; font-size: 0; text-align: left; color: #1f2933; "><div style="display: inline-block; font-size: 13px; font-family: Helvetica; color: light-dark(#1f2933, #c4ccd5); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; word-wrap: normal; ">Router · 127.0.0.1:8790<br /><span style="font-size:9px;font-weight:normal">per tier: ordered models, first available serves · set as default or per session</span></div></div></div></foreignObject><text x="74" y="338" fill="#1f2933" font-family="Helvetica" font-size="13px" font-weight="bold" style="fill: light-dark(rgb(31, 41, 51), rgb(196, 204, 213));"><tspan x="74" y="338">Router · 127.0.0.1:8790</tspan><tspan x="74" y="354">per tier: ordered models, first available serves · set as</tspan><tspan x="74" y="370">default or per session</tspan></text></switch></g></g></g><g data-cell-id="t0"><g transform="translate(0.5,0.5)"><rect x="72" y="360" width="62" height="44" rx="4.4" ry="4.4" fill="#ffffff" stroke="#1565c0" pointer-events="all" style="fill: light-dark(rgb(255, 255, 255), rgb(18, 18, 18)); stroke: light-dark(rgb(21, 101, 192), rgb(99, 168, 246));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 60px; height: 1px; padding-top: 382px; margin-left: 73px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #1f2933; "><div style="display: inline-block; font-size: 10px; font-family: Helvetica; color: light-dark(#1f2933, #c4ccd5); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">t0<br />session</div></div></div></foreignObject><text x="103" y="379" fill="#1f2933" font-family="Helvetica" font-size="10px" text-anchor="middle" style="fill: light-dark(rgb(31, 41, 51), rgb(196, 204, 213));"><tspan x="103" y="379">t0</tspan><tspan x="103" y="391">session</tspan></text></switch></g></g></g><g data-cell-id="t1"><g transform="translate(0.5,0.5)"><rect x="140" y="360" width="88" height="44" rx="4.4" ry="4.4" fill="#ffffff" stroke="#1565c0" pointer-events="all" style="fill: light-dark(rgb(255, 255, 255), rgb(18, 18, 18)); stroke: light-dark(rgb(21, 101, 192), rgb(99, 168, 246));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 86px; height: 1px; padding-top: 382px; margin-left: 141px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #1f2933; "><div style="display: inline-block; font-size: 10px; font-family: Helvetica; color: light-dark(#1f2933, #c4ccd5); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">t1<br />orchestrator</div></div></div></foreignObject><text x="184" y="379" fill="#1f2933" font-family="Helvetica" font-size="10px" text-anchor="middle" style="fill: light-dark(rgb(31, 41, 51), rgb(196, 204, 213));"><tspan x="184" y="379">t1</tspan><tspan x="184" y="391">orchestrator</tspan></text></switch></g></g></g><g data-cell-id="t2"><g transform="translate(0.5,0.5)"><rect x="234" y="360" width="90" height="44" rx="4.4" ry="4.4" fill="#ffffff" stroke="#1565c0" pointer-events="all" style="fill: light-dark(rgb(255, 255, 255), rgb(18, 18, 18)); stroke: light-dark(rgb(21, 101, 192), rgb(99, 168, 246));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 88px; height: 1px; padding-top: 382px; margin-left: 235px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #1f2933; "><div style="display: inline-block; font-size: 10px; font-family: Helvetica; color: light-dark(#1f2933, #c4ccd5); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">t2 workers<br />local first</div></div></div></foreignObject><text x="279" y="379" fill="#1f2933" font-family="Helvetica" font-size="10px" text-anchor="middle" style="fill: light-dark(rgb(31, 41, 51), rgb(196, 204, 213));"><tspan x="279" y="379">t2 workers</tspan><tspan x="279" y="391">local first</tspan></text></switch></g></g></g><g data-cell-id="ckp"><g transform="translate(0.5,0.5)"><rect x="330" y="360" width="108" height="44" rx="4.4" ry="4.4" fill="#ffffff" stroke="#1565c0" pointer-events="all" style="fill: light-dark(rgb(255, 255, 255), rgb(18, 18, 18)); stroke: light-dark(rgb(21, 101, 192), rgb(99, 168, 246));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 106px; height: 1px; padding-top: 382px; margin-left: 331px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #1f2933; "><div style="display: inline-block; font-size: 10px; font-family: Helvetica; color: light-dark(#1f2933, #c4ccd5); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">Cockpit<br />budget · cache<br />models · routing</div></div></div></foreignObject><text x="384" y="373" fill="#1f2933" font-family="Helvetica" font-size="10px" text-anchor="middle" style="fill: light-dark(rgb(31, 41, 51), rgb(196, 204, 213));"><tspan x="384" y="373">Cockpit</tspan><tspan x="384" y="385">budget · cache</tspan><tspan x="384" y="397">models · routing</tspan></text></switch></g></g></g><g data-cell-id="wrk"><g transform="translate(0.5,0.5)"><rect x="210" y="422" width="238" height="38" rx="3.8" ry="3.8" fill="#ffffff" stroke="#1565c0" pointer-events="all" style="fill: light-dark(rgb(255, 255, 255), rgb(18, 18, 18)); stroke: light-dark(rgb(21, 101, 192), rgb(99, 168, 246));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 236px; height: 1px; padding-top: 441px; margin-left: 211px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #1f2933; "><div style="display: inline-block; font-size: 10px; font-family: Helvetica; color: light-dark(#1f2933, #c4ccd5); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>Workers</b> · pane + git worktree<br />pai worker run / merge</div></div></div></foreignObject><text x="329" y="438" fill="#1f2933" font-family="Helvetica" font-size="10px" text-anchor="middle" style="fill: light-dark(rgb(31, 41, 51), rgb(196, 204, 213));"><tspan x="329" y="438">Workers · pane + git worktree</tspan><tspan x="329" y="450">pai worker run / merge</tspan></text></switch></g></g></g><g data-cell-id="ab"><g transform="translate(0.5,0.5)"><rect x="530" y="170" width="400" height="298" rx="8.94" ry="8.94" fill="#fdeef4" stroke="#c2185b" pointer-events="all" style="fill: light-dark(rgb(253, 238, 244), rgb(38, 26, 31)); stroke: light-dark(rgb(194, 24, 91), rgb(255, 146, 204));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe flex-start; width: 388px; height: 1px; padding-top: 181px; margin-left: 542px;"><div style="box-sizing: border-box; font-size: 0; text-align: left; color: #1f2933; "><div style="display: inline-block; font-size: 13px; font-family: Helvetica; color: light-dark(#1f2933, #c4ccd5); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; word-wrap: normal; ">AIBroker (separate project)</div></div></div></foreignObject><text x="542" y="194" fill="#1f2933" font-family="Helvetica" font-size="13px" font-weight="bold" style="fill: light-dark(rgb(31, 41, 51), rgb(196, 204, 213));">AIBroker (separate project)</text></switch></g></g></g><g data-cell-id="aA"><g transform="translate(0.5,0.5)"><rect x="542" y="202" width="376" height="60" rx="6" ry="6" fill="#ffffff" stroke="#c2185b" pointer-events="all" style="fill: light-dark(rgb(255, 255, 255), rgb(18, 18, 18)); stroke: light-dark(rgb(194, 24, 91), rgb(255, 146, 204));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 374px; height: 1px; padding-top: 232px; margin-left: 543px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #1f2933; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: light-dark(#1f2933, #c4ccd5); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>Messaging hub</b><br />session messages · worker reports</div></div></div></foreignObject><text x="730" y="229" fill="#1f2933" font-family="Helvetica" font-size="11px" text-anchor="middle" style="fill: light-dark(rgb(31, 41, 51), rgb(196, 204, 213));"><tspan x="730" y="229">Messaging hub</tspan><tspan x="730" y="242">session messages · worker reports</tspan></text></switch></g></g></g><g data-cell-id="aB"><g transform="translate(0.5,0.5)"><rect x="542" y="272" width="376" height="60" rx="6" ry="6" fill="#ffffff" stroke="#c2185b" pointer-events="all" style="fill: light-dark(rgb(255, 255, 255), rgb(18, 18, 18)); stroke: light-dark(rgb(194, 24, 91), rgb(255, 146, 204));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 374px; height: 1px; padding-top: 302px; margin-left: 543px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #1f2933; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: light-dark(#1f2933, #c4ccd5); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>Session control</b><br />naming · switching · delivering into terminal sessions</div></div></div></foreignObject><text x="730" y="299" fill="#1f2933" font-family="Helvetica" font-size="11px" text-anchor="middle" style="fill: light-dark(rgb(31, 41, 51), rgb(196, 204, 213));"><tspan x="730" y="299">Session control</tspan><tspan x="730" y="312">naming · switching · delivering into terminal sessions</tspan></text></switch></g></g></g><g data-cell-id="aC"><g transform="translate(0.5,0.5)"><rect x="542" y="342" width="376" height="60" rx="6" ry="6" fill="#ffffff" stroke="#c2185b" pointer-events="all" style="fill: light-dark(rgb(255, 255, 255), rgb(18, 18, 18)); stroke: light-dark(rgb(194, 24, 91), rgb(255, 146, 204));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 374px; height: 1px; padding-top: 372px; margin-left: 543px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #1f2933; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: light-dark(#1f2933, #c4ccd5); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>Inbound channels</b> into sessions, with prefixes<br />[Whazaa] [Telex] [PAILot] [Task]</div></div></div></foreignObject><text x="730" y="369" fill="#1f2933" font-family="Helvetica" font-size="11px" text-anchor="middle" style="fill: light-dark(rgb(31, 41, 51), rgb(196, 204, 213));"><tspan x="730" y="369">Inbound channels into sessions, with prefixes</tspan><tspan x="730" y="382">[Whazaa] [Telex] [PAILot] [Task]</tspan></text></switch></g></g></g><g data-cell-id="aD"><g transform="translate(0.5,0.5)"><rect x="542" y="412" width="376" height="40" rx="4" ry="4" fill="#ffffff" stroke="#c2185b" pointer-events="all" style="fill: light-dark(rgb(255, 255, 255), rgb(18, 18, 18)); stroke: light-dark(rgb(194, 24, 91), rgb(255, 146, 204));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 374px; height: 1px; padding-top: 432px; margin-left: 543px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #1f2933; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: light-dark(#1f2933, #c4ccd5); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">AIBroker daemon</div></div></div></foreignObject><text x="730" y="435" fill="#1f2933" font-family="Helvetica" font-size="11px" text-anchor="middle" style="fill: light-dark(rgb(31, 41, 51), rgb(196, 204, 213));">AIBroker daemon</text></switch></g></g></g><g data-cell-id="prov"><g transform="translate(0.5,0.5)"><rect x="50" y="484" width="410" height="70" rx="2.1" ry="2.1" fill="#e9f6ec" stroke="#2e7d32" pointer-events="all" style="fill: light-dark(rgb(233, 246, 236), rgb(21, 32, 24)); stroke: light-dark(rgb(46, 125, 50), rgb(100, 168, 104));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe flex-start; width: 398px; height: 1px; padding-top: 495px; margin-left: 62px;"><div style="box-sizing: border-box; font-size: 0; text-align: left; color: #1f2933; "><div style="display: inline-block; font-size: 13px; font-family: Helvetica; color: light-dark(#1f2933, #c4ccd5); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; word-wrap: normal; ">Model providers</div></div></div></foreignObject><text x="62" y="508" fill="#1f2933" font-family="Helvetica" font-size="13px" font-weight="bold" style="fill: light-dark(rgb(31, 41, 51), rgb(196, 204, 213));">Model providers</text></switch></g></g></g><g data-cell-id="p1"><g transform="translate(0.5,0.5)"><rect x="60" y="512" width="120" height="36" rx="3.6" ry="3.6" fill="#ffffff" stroke="#2e7d32" pointer-events="all" style="fill: light-dark(rgb(255, 255, 255), rgb(18, 18, 18)); stroke: light-dark(rgb(46, 125, 50), rgb(100, 168, 104));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 530px; margin-left: 61px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #1f2933; "><div style="display: inline-block; font-size: 10px; font-family: Helvetica; color: light-dark(#1f2933, #c4ccd5); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>Anthropic</b><br />Opus · Sonnet</div></div></div></foreignObject><text x="120" y="527" fill="#1f2933" font-family="Helvetica" font-size="10px" text-anchor="middle" style="fill: light-dark(rgb(31, 41, 51), rgb(196, 204, 213));"><tspan x="120" y="527">Anthropic</tspan><tspan x="120" y="539">Opus · Sonnet</tspan></text></switch></g></g></g><g data-cell-id="p2"><g transform="translate(0.5,0.5)"><rect x="186" y="512" width="120" height="36" rx="3.6" ry="3.6" fill="#ffffff" stroke="#2e7d32" pointer-events="all" style="fill: light-dark(rgb(255, 255, 255), rgb(18, 18, 18)); stroke: light-dark(rgb(46, 125, 50), rgb(100, 168, 104));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 530px; margin-left: 187px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #1f2933; "><div style="display: inline-block; font-size: 10px; font-family: Helvetica; color: light-dark(#1f2933, #c4ccd5); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>Other cloud</b><br />e.g. GLM, Kimi</div></div></div></foreignObject><text x="246" y="527" fill="#1f2933" font-family="Helvetica" font-size="10px" text-anchor="middle" style="fill: light-dark(rgb(31, 41, 51), rgb(196, 204, 213));"><tspan x="246" y="527">Other cloud</tspan><tspan x="246" y="539">e.g. GLM, Kimi</tspan></text></switch></g></g></g><g data-cell-id="p3"><g transform="translate(0.5,0.5)"><rect x="312" y="512" width="138" height="36" rx="3.6" ry="3.6" fill="#ffffff" stroke="#2e7d32" pointer-events="all" style="fill: light-dark(rgb(255, 255, 255), rgb(18, 18, 18)); stroke: light-dark(rgb(46, 125, 50), rgb(100, 168, 104));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 136px; height: 1px; padding-top: 530px; margin-left: 313px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #1f2933; "><div style="display: inline-block; font-size: 10px; font-family: Helvetica; color: light-dark(#1f2933, #c4ccd5); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>Local models</b><br />Strata · vllm-mlx · Ollama</div></div></div></foreignObject><text x="381" y="527" fill="#1f2933" font-family="Helvetica" font-size="10px" text-anchor="middle" style="fill: light-dark(rgb(31, 41, 51), rgb(196, 204, 213));"><tspan x="381" y="527">Local models</tspan><tspan x="381" y="539">Strata · vllm-mlx · Ollama</tspan></text></switch></g></g></g><g data-cell-id="pnote"><g><rect x="610" y="492" width="320" height="50" fill="none" stroke="none" pointer-events="all"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 318px; height: 1px; padding-top: 517px; margin-left: 612px;"><div style="box-sizing: border-box; font-size: 0; text-align: left; color: #52606d; "><div style="display: inline-block; font-size: 10px; font-family: Helvetica; color: light-dark(#52606d, #929eaa); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">t2 goes local first, then cloud when local cannot serve or budget is out.</div></div></div></foreignObject><text x="612" y="520" fill="#52606d" font-family="Helvetica" font-size="10px" style="fill: light-dark(rgb(82, 96, 109), rgb(146, 158, 170));">t2 goes local first, then cloud when local cannot serve or budget is out.</text></switch></g></g></g><g data-cell-id="os"><g transform="translate(0.5,0.5)"><rect x="50" y="576" width="880" height="150" rx="4.5" ry="4.5" fill="#fff3e0" stroke="#e65100" pointer-events="all" style="fill: light-dark(rgb(255, 243, 224), rgb(36, 26, 9)); stroke: light-dark(rgb(230, 81, 0), rgb(251, 123, 53));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe flex-start; width: 868px; height: 1px; padding-top: 587px; margin-left: 62px;"><div style="box-sizing: border-box; font-size: 0; text-align: left; color: #1f2933; "><div style="display: inline-block; font-size: 13px; font-family: Helvetica; color: light-dark(#1f2933, #c4ccd5); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; word-wrap: normal; ">Operating system</div></div></div></foreignObject><text x="62" y="600" fill="#1f2933" font-family="Helvetica" font-size="13px" font-weight="bold" style="fill: light-dark(rgb(31, 41, 51), rgb(196, 204, 213));">Operating system</text></switch></g></g></g><g data-cell-id="term"><g transform="translate(0.5,0.5)"><rect x="60" y="606" width="560" height="56" rx="5.6" ry="5.6" fill="#ffffff" stroke="#e65100" pointer-events="all" style="fill: light-dark(rgb(255, 255, 255), rgb(18, 18, 18)); stroke: light-dark(rgb(230, 81, 0), rgb(251, 123, 53));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 558px; height: 1px; padding-top: 634px; margin-left: 61px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #1f2933; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: light-dark(#1f2933, #c4ccd5); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>Terminal and session control</b><br />iTerm2 · tmux<br />worker panes · session tabs · typing into sessions</div></div></div></foreignObject><text x="340" y="624" fill="#1f2933" font-family="Helvetica" font-size="11px" text-anchor="middle" style="fill: light-dark(rgb(31, 41, 51), rgb(196, 204, 213));"><tspan x="340" y="624">Terminal and session control</tspan><tspan x="340" y="637">iTerm2 · tmux</tspan><tspan x="340" y="650">worker panes · session tabs · typing into sessions</tspan></text></switch></g></g></g><g data-cell-id="wt"><g transform="translate(0.5,0.5)"><rect x="630" y="606" width="290" height="56" rx="5.6" ry="5.6" fill="#ffffff" stroke="#e65100" pointer-events="all" style="fill: light-dark(rgb(255, 255, 255), rgb(18, 18, 18)); stroke: light-dark(rgb(230, 81, 0), rgb(251, 123, 53));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 288px; height: 1px; padding-top: 634px; margin-left: 631px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #1f2933; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: light-dark(#1f2933, #c4ccd5); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>Git worktrees on disk</b><br />one per worker (worker/ID)</div></div></div></foreignObject><text x="775" y="631" fill="#1f2933" font-family="Helvetica" font-size="11px" text-anchor="middle" style="fill: light-dark(rgb(31, 41, 51), rgb(196, 204, 213));"><tspan x="775" y="631">Git worktrees on disk</tspan><tspan x="775" y="644">one per worker (worker/ID)</tspan></text></switch></g></g></g><g data-cell-id="svc"><g transform="translate(0.5,0.5)"><rect x="60" y="672" width="860" height="44" rx="4.4" ry="4.4" fill="#ffffff" stroke="#e65100" pointer-events="all" style="fill: light-dark(rgb(255, 255, 255), rgb(18, 18, 18)); stroke: light-dark(rgb(230, 81, 0), rgb(251, 123, 53));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 858px; height: 1px; padding-top: 694px; margin-left: 61px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #1f2933; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: light-dark(#1f2933, #c4ccd5); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>Services</b> · launchd (macOS) / systemd (Linux)<br />run the PAI daemon and the AIBroker daemon</div></div></div></foreignObject><text x="490" y="691" fill="#1f2933" font-family="Helvetica" font-size="11px" text-anchor="middle" style="fill: light-dark(rgb(31, 41, 51), rgb(196, 204, 213));"><tspan x="490" y="691">Services · launchd (macOS) / systemd (Linux)</tspan><tspan x="490" y="704">run the PAI daemon and the AIBroker daemon</tspan></text></switch></g></g></g><g data-cell-id="hk"><g><rect x="260" y="144" width="100" height="22" fill="none" stroke="none" pointer-events="all"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 98px; height: 1px; padding-top: 155px; margin-left: 262px;"><div style="box-sizing: border-box; font-size: 0; text-align: left; color: #52606d; "><div style="display: inline-block; font-size: 10px; font-family: Helvetica; color: light-dark(#52606d, #929eaa); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">hooks · MCP</div></div></div></foreignObject><text x="262" y="158" fill="#52606d" font-family="Helvetica" font-size="10px" style="fill: light-dark(rgb(82, 96, 109), rgb(146, 158, 170));">hooks · MCP</text></switch></g></g></g><g data-cell-id="legend"><g><rect x="50" y="734" width="880" height="24" fill="none" stroke="none" pointer-events="all"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 878px; height: 1px; padding-top: 746px; margin-left: 52px;"><div style="box-sizing: border-box; font-size: 0; text-align: left; color: #52606d; "><div style="display: inline-block; font-size: 10px; font-family: Helvetica; color: light-dark(#52606d, #929eaa); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">Arrows: solid = requests and control · dashed = messages and reports · two heads = both directions</div></div></div></foreignObject><text x="52" y="749" fill="#52606d" font-family="Helvetica" font-size="10px" style="fill: light-dark(rgb(82, 96, 109), rgb(146, 158, 170));">Arrows: solid = requests and control · dashed = messages and reports · two heads = both directions</text></switch></g></g></g><g data-cell-id="e1"><g><path d="M 249.8 149.18 L 249.8 152.09 Q 249.8 155 249.85 157.91 L 249.91 160.82" fill="none" stroke="#52606d" stroke-width="1.5" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(82, 96, 109), rgb(146, 158, 170));"/><path d="M 249.8 141.68 L 253.55 149.18 L 246.05 149.18 Z" fill="#52606d" stroke="#52606d" stroke-width="1.5" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(82, 96, 109), rgb(146, 158, 170)); stroke: light-dark(rgb(82, 96, 109), rgb(146, 158, 170));"/><path d="M 250.05 168.32 L 246.16 160.89 L 253.66 160.75 Z" fill="#52606d" stroke="#52606d" stroke-width="1.5" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(82, 96, 109), rgb(146, 158, 170)); stroke: light-dark(rgb(82, 96, 109), rgb(146, 158, 170));"/></g></g><g data-cell-id="e2"><g><path d="M 50 131 L 41 131 Q 32 131 32 141 L 32 353 Q 32 363 42 363 L 52.82 363" fill="none" stroke="#52606d" stroke-width="1.5" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(82, 96, 109), rgb(146, 158, 170));"/><path d="M 60.32 363 L 52.82 366.75 L 52.82 359.25 Z" fill="#52606d" stroke="#52606d" stroke-width="1.5" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(82, 96, 109), rgb(146, 158, 170)); stroke: light-dark(rgb(82, 96, 109), rgb(146, 158, 170));"/></g></g><g data-cell-id="e3"><g><path d="M 610 170 L 610 162.5 Q 610 155 609.96 152.09 L 609.92 149.18" fill="none" stroke="#c2185b" stroke-width="1.5" stroke-miterlimit="10" stroke-dasharray="4.5 4.5" pointer-events="stroke" style="stroke: light-dark(rgb(194, 24, 91), rgb(255, 146, 204));"/><path d="M 609.82 141.68 L 613.67 149.13 L 606.17 149.23 Z" fill="#c2185b" stroke="#c2185b" stroke-width="1.5" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(194, 24, 91), rgb(255, 146, 204)); stroke: light-dark(rgb(194, 24, 91), rgb(255, 146, 204));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 155px; margin-left: 610px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #1f2933; background-color: #ffffff; "><div style="display: inline-block; font-size: 10px; font-family: Helvetica; color: light-dark(#1f2933, #c4ccd5); line-height: 1.2; pointer-events: all; background-color: light-dark(#ffffff, #121212); white-space: nowrap; ">delivers</div></div></div></foreignObject><text x="610" y="158" fill="#1f2933" font-family="Helvetica" font-size="10px" text-anchor="middle" style="fill: light-dark(rgb(31, 41, 51), rgb(196, 204, 213));">delivers</text></switch></g></g></g><g data-cell-id="e4"><g><path d="M 800 140 L 800 147.5 Q 800 155 790 155 L 740 155 Q 730 155 730 157.91 L 730 160.82" fill="none" stroke="#c2185b" stroke-width="1.5" stroke-miterlimit="10" stroke-dasharray="4.5 4.5" pointer-events="stroke" style="stroke: light-dark(rgb(194, 24, 91), rgb(255, 146, 204));"/><path d="M 730 168.32 L 726.25 160.82 L 733.75 160.82 Z" fill="#c2185b" stroke="#c2185b" stroke-width="1.5" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(194, 24, 91), rgb(255, 146, 204)); stroke: light-dark(rgb(194, 24, 91), rgb(255, 146, 204));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 155px; margin-left: 765px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #1f2933; background-color: #ffffff; "><div style="display: inline-block; font-size: 10px; font-family: Helvetica; color: light-dark(#1f2933, #c4ccd5); line-height: 1.2; pointer-events: all; background-color: light-dark(#ffffff, #121212); white-space: nowrap; ">inbound</div></div></div></foreignObject><text x="765" y="158" fill="#1f2933" font-family="Helvetica" font-size="10px" text-anchor="middle" style="fill: light-dark(rgb(31, 41, 51), rgb(196, 204, 213));">inbound</text></switch></g></g></g><g data-cell-id="e5"><g><path d="M 457.18 220 L 532.82 220" fill="none" stroke="#c2185b" stroke-width="1.5" stroke-miterlimit="10" stroke-dasharray="4.5 4.5" pointer-events="stroke" style="stroke: light-dark(rgb(194, 24, 91), rgb(255, 146, 204));"/><path d="M 449.68 220 L 457.18 216.25 L 457.18 223.75 Z" fill="#c2185b" stroke="#c2185b" stroke-width="1.5" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(194, 24, 91), rgb(255, 146, 204)); stroke: light-dark(rgb(194, 24, 91), rgb(255, 146, 204));"/><path d="M 540.32 220 L 532.82 223.75 L 532.82 216.25 Z" fill="#c2185b" stroke="#c2185b" stroke-width="1.5" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(194, 24, 91), rgb(255, 146, 204)); stroke: light-dark(rgb(194, 24, 91), rgb(255, 146, 204));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 220px; margin-left: 495px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #1f2933; background-color: #ffffff; "><div style="display: inline-block; font-size: 10px; font-family: Helvetica; color: light-dark(#1f2933, #c4ccd5); line-height: 1.2; pointer-events: all; background-color: light-dark(#ffffff, #121212); white-space: nowrap; ">messages<br />tab names</div></div></div></foreignObject><text x="495" y="217" fill="#1f2933" font-family="Helvetica" font-size="10px" text-anchor="middle" style="fill: light-dark(rgb(31, 41, 51), rgb(196, 204, 213));"><tspan x="495" y="217">messages</tspan><tspan x="495" y="229">tab names</tspan></text></switch></g></g></g><g data-cell-id="e6"><g><path d="M 448 431.5 L 470 431.5 Q 480 431.5 480 421.5 L 480 258.8 Q 480 248.8 490 248.8 L 532.82 248.8" fill="none" stroke="#c2185b" stroke-width="1.5" stroke-miterlimit="10" stroke-dasharray="4.5 4.5" pointer-events="stroke" style="stroke: light-dark(rgb(194, 24, 91), rgb(255, 146, 204));"/><path d="M 540.32 248.8 L 532.82 252.55 L 532.82 245.05 Z" fill="#c2185b" stroke="#c2185b" stroke-width="1.5" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(194, 24, 91), rgb(255, 146, 204)); stroke: light-dark(rgb(194, 24, 91), rgb(255, 146, 204));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 326px; margin-left: 480px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #1f2933; background-color: #ffffff; "><div style="display: inline-block; font-size: 10px; font-family: Helvetica; color: light-dark(#1f2933, #c4ccd5); line-height: 1.2; pointer-events: all; background-color: light-dark(#ffffff, #121212); white-space: nowrap; ">reports</div></div></div></foreignObject><text x="480" y="329" fill="#1f2933" font-family="Helvetica" font-size="10px" text-anchor="middle" style="fill: light-dark(rgb(31, 41, 51), rgb(196, 204, 213));">reports</text></switch></g></g></g><g data-cell-id="e7"><g><path d="M 119.9 412 L 119.9 438 Q 119.9 448 119.96 458 L 120.06 474.82" fill="none" stroke="#1565c0" stroke-width="1.5" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(21, 101, 192), rgb(99, 168, 246));"/><path d="M 120.1 482.32 L 116.31 474.85 L 123.81 474.8 Z" fill="#1565c0" stroke="#1565c0" stroke-width="1.5" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(21, 101, 192), rgb(99, 168, 246)); stroke: light-dark(rgb(21, 101, 192), rgb(99, 168, 246));"/></g></g><g data-cell-id="e8"><g><path d="M 279.02 422 L 279.01 413.18" fill="none" stroke="#1565c0" stroke-width="1.5" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(21, 101, 192), rgb(99, 168, 246));"/><path d="M 279 405.68 L 282.76 413.17 L 275.26 413.18 Z" fill="#1565c0" stroke="#1565c0" stroke-width="1.5" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(21, 101, 192), rgb(99, 168, 246)); stroke: light-dark(rgb(21, 101, 192), rgb(99, 168, 246));"/></g></g><g data-cell-id="e9"><g><path d="M 448 450.5 L 475 450.5 Q 485 450.5 485 460.5 L 485.04 596.82" fill="none" stroke="#1565c0" stroke-width="1.5" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(21, 101, 192), rgb(99, 168, 246));"/><path d="M 485.04 604.32 L 481.29 596.82 L 488.79 596.82 Z" fill="#1565c0" stroke="#1565c0" stroke-width="1.5" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(21, 101, 192), rgb(99, 168, 246)); stroke: light-dark(rgb(21, 101, 192), rgb(99, 168, 246));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 509px; margin-left: 485px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #1f2933; background-color: #ffffff; "><div style="display: inline-block; font-size: 10px; font-family: Helvetica; color: light-dark(#1f2933, #c4ccd5); line-height: 1.2; pointer-events: all; background-color: light-dark(#ffffff, #121212); white-space: nowrap; ">panes</div></div></div></foreignObject><text x="485" y="512" fill="#1f2933" font-family="Helvetica" font-size="10px" text-anchor="middle" style="fill: light-dark(rgb(31, 41, 51), rgb(196, 204, 213));">panes</text></switch></g></g></g><g data-cell-id="e10"><g><path d="M 570 468 L 570 527 Q 570 537 567 537 L 565.5 537 Q 564 537 564 547 L 564 596.82" fill="none" stroke="#c2185b" stroke-width="1.5" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(194, 24, 91), rgb(255, 146, 204));"/><path d="M 564 604.32 L 560.25 596.82 L 567.75 596.82 Z" fill="#c2185b" stroke="#c2185b" stroke-width="1.5" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(194, 24, 91), rgb(255, 146, 204)); stroke: light-dark(rgb(194, 24, 91), rgb(255, 146, 204));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 537px; margin-left: 567px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #1f2933; background-color: #ffffff; "><div style="display: inline-block; font-size: 10px; font-family: Helvetica; color: light-dark(#1f2933, #c4ccd5); line-height: 1.2; pointer-events: all; background-color: light-dark(#ffffff, #121212); white-space: nowrap; ">types into sessions</div></div></div></foreignObject><text x="567" y="540" fill="#1f2933" font-family="Helvetica" font-size="10px" text-anchor="middle" style="fill: light-dark(rgb(31, 41, 51), rgb(196, 204, 213));">types into sessions</text></switch></g></g></g></g></g></g><switch><g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/><a transform="translate(0,-5)" xlink:href="https://www.drawio.com/doc/faq/svg-export-text-problems" target="_blank"><text text-anchor="middle" font-size="10px" x="50%" y="100%">Text is not SVG - cannot display</text></a></switch></svg>
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|