@animalabs/connectome-host 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.example +20 -0
- package/.github/workflows/publish.yml +65 -0
- package/ARCHITECTURE.md +355 -0
- package/CHANGELOG.md +30 -0
- package/HEADLESS-FLEET-PLAN.md +330 -0
- package/README.md +189 -0
- package/UNIFIED-TREE-PLAN.md +242 -0
- package/bun.lock +288 -0
- package/docs/AGENT-MEMORY-GUIDE.md +214 -0
- package/docs/AGENT-ONBOARDING.md +541 -0
- package/docs/ATTENTION-AND-GATING.md +120 -0
- package/docs/DEPLOYMENTS.md +130 -0
- package/docs/DEV-ENVIRONMENT.md +215 -0
- package/docs/LIBRARY-PIPELINE.md +286 -0
- package/docs/LOCUS-ROUTING-DESIGN.md +115 -0
- package/docs/claudeai-evacuation.md +228 -0
- package/docs/debug-context-api.md +208 -0
- package/docs/webui-deployment.md +219 -0
- package/package.json +33 -0
- package/recipes/SETUP.md +308 -0
- package/recipes/TRIUMVIRATE-SETUP.md +467 -0
- package/recipes/claude-export-revive.json +19 -0
- package/recipes/clerk.json +157 -0
- package/recipes/knowledge-miner.json +174 -0
- package/recipes/knowledge-reviewer.json +76 -0
- package/recipes/mcpl-editor-test.json +38 -0
- package/recipes/prompts/transplant-addendum.md +17 -0
- package/recipes/triumvirate.json +63 -0
- package/recipes/webui-fleet-test.json +27 -0
- package/recipes/webui-test.json +16 -0
- package/recipes/zulip-miner.json +87 -0
- package/scripts/connectome-doctor +373 -0
- package/scripts/evacuator.ts +956 -0
- package/scripts/import-claudeai-export.ts +747 -0
- package/scripts/lib/line-reader.ts +53 -0
- package/scripts/test-historical-thinking.ts +148 -0
- package/scripts/warmup-session.ts +336 -0
- package/src/agent-name.ts +58 -0
- package/src/commands.ts +1074 -0
- package/src/headless.ts +528 -0
- package/src/index.ts +867 -0
- package/src/logging-adapter.ts +208 -0
- package/src/mcpl-config.ts +199 -0
- package/src/modules/activity-module.ts +270 -0
- package/src/modules/channel-mode-module.ts +260 -0
- package/src/modules/fleet-module.ts +1705 -0
- package/src/modules/fleet-types.ts +225 -0
- package/src/modules/lessons-module.ts +465 -0
- package/src/modules/mcpl-admin-module.ts +345 -0
- package/src/modules/retrieval-module.ts +327 -0
- package/src/modules/settings-module.ts +143 -0
- package/src/modules/subagent-module.ts +2074 -0
- package/src/modules/subscription-gc-module.ts +322 -0
- package/src/modules/time-module.ts +85 -0
- package/src/modules/tui-module.ts +76 -0
- package/src/modules/web-ui-curve-page.ts +249 -0
- package/src/modules/web-ui-module.ts +2595 -0
- package/src/recipe.ts +1003 -0
- package/src/session-manager.ts +278 -0
- package/src/state/agent-tree-reducer.ts +431 -0
- package/src/state/fleet-tree-aggregator.ts +195 -0
- package/src/strategies/frontdesk-strategy.ts +364 -0
- package/src/synesthete.ts +68 -0
- package/src/tui.ts +2200 -0
- package/src/types/bun-ffi.d.ts +6 -0
- package/src/web/protocol.ts +648 -0
- package/test/agent-name.test.ts +62 -0
- package/test/agent-tree-fleet-launch.test.ts +64 -0
- package/test/agent-tree-reducer-parity.test.ts +194 -0
- package/test/agent-tree-reducer.test.ts +443 -0
- package/test/agent-tree-rollup.test.ts +109 -0
- package/test/autobio-progress-snapshot.test.ts +40 -0
- package/test/claudeai-export-importer.test.ts +386 -0
- package/test/evacuator.test.ts +332 -0
- package/test/fleet-commands.test.ts +244 -0
- package/test/fleet-no-subfleets.test.ts +147 -0
- package/test/fleet-orchestration.test.ts +353 -0
- package/test/fleet-recipe.test.ts +124 -0
- package/test/fleet-route.test.ts +44 -0
- package/test/fleet-smoke.test.ts +479 -0
- package/test/fleet-subscribe-union-e2e.test.ts +123 -0
- package/test/fleet-subscribe-union.test.ts +85 -0
- package/test/fleet-tree-aggregator-e2e.test.ts +110 -0
- package/test/fleet-tree-aggregator.test.ts +215 -0
- package/test/frontdesk-strategy.test.ts +326 -0
- package/test/headless-describe.test.ts +182 -0
- package/test/headless-smoke.test.ts +190 -0
- package/test/logging-adapter.test.ts +87 -0
- package/test/mcpl-admin-module.test.ts +213 -0
- package/test/mcpl-agent-overlay.test.ts +126 -0
- package/test/mock-headless-child.ts +133 -0
- package/test/recipe-cache-ttl.test.ts +37 -0
- package/test/recipe-env.test.ts +157 -0
- package/test/recipe-path-resolution.test.ts +170 -0
- package/test/subagent-async-timeout.test.ts +381 -0
- package/test/subagent-fork-materialise.test.ts +241 -0
- package/test/subagent-peek-scoping.test.ts +180 -0
- package/test/subagent-peek-zombie.test.ts +148 -0
- package/test/subagent-reaper-in-flight.test.ts +229 -0
- package/test/subscription-gc-module.test.ts +136 -0
- package/test/warmup-handoff.test.ts +150 -0
- package/test/web-ui-bind.test.ts +51 -0
- package/test/web-ui-module.test.ts +246 -0
- package/test/web-ui-protocol.test.ts +0 -0
- package/tsconfig.json +14 -0
- package/web/bun.lock +357 -0
- package/web/index.html +12 -0
- package/web/package.json +24 -0
- package/web/src/App.tsx +1931 -0
- package/web/src/Context.tsx +158 -0
- package/web/src/ContextDocument.tsx +150 -0
- package/web/src/Files.tsx +271 -0
- package/web/src/Lessons.tsx +164 -0
- package/web/src/Mcpl.tsx +310 -0
- package/web/src/Stream.tsx +119 -0
- package/web/src/TreeSidebar.tsx +283 -0
- package/web/src/Usage.tsx +182 -0
- package/web/src/main.tsx +7 -0
- package/web/src/styles.css +26 -0
- package/web/src/tree.ts +268 -0
- package/web/src/wire.ts +120 -0
- package/web/tsconfig.json +21 -0
- package/web/vite.config.ts +32 -0
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
# Unified Tree Plan: Fleet Children as Subagents in the TUI
|
|
2
|
+
|
|
3
|
+
Goal: collapse the two-paradigm UI (`SubagentModule`'s in-process tree vs. `FleetModule`'s flat child list) into a single tree-rendering paradigm where fleet children appear and behave like subagents — same readouts (context tokens, phase, tool-call count), same unfold-children affordance, same row component.
|
|
4
|
+
|
|
5
|
+
Companion to [HEADLESS-FLEET-PLAN.md](./HEADLESS-FLEET-PLAN.md), which defines the underlying IPC.
|
|
6
|
+
|
|
7
|
+
## Design summary
|
|
8
|
+
|
|
9
|
+
- **Event stream is the primary path.** Children already pipe `framework.onTrace()` over the IPC socket verbatim (`headless.ts:141`). The same fold logic that builds the in-process subagent tree from those events can build a tree per fleet child; just run the reducer N+1 times (once on local traces, once per child via `onChildEvent`).
|
|
10
|
+
- **One reducer, three call sites.** The reducer extracted in Phase 2 runs on (a) parent's local trace stream, (b) parent's per-fleet-child stream, and (c) *inside each headless child* to support `describe`. Same code everywhere; `describe` is just `serialize(reducer.getTree())`.
|
|
11
|
+
- **`describe` is a recovery verb, not a query verb.** Modeled on lockstep game engines' state-dump: requested rarely, at known sync points (TUI cold start, reconnect, after child restart), to seed/reseed the per-child reducer with ground truth. Then the live event stream takes over.
|
|
12
|
+
- **No subfleets.** Depth-1 invariant enforced at startup. Eliminates the "grandchild events are invisible to grandparent" problem entirely. If subfleets ever become necessary, the wire protocol additions here are forward-compatible with a future `via:` re-broadcast scheme.
|
|
13
|
+
|
|
14
|
+
## Why this works (and why it didn't before)
|
|
15
|
+
|
|
16
|
+
Today's fleet IPC is structurally fine but data-thin:
|
|
17
|
+
- Pure event stream, fire-and-forget commands, no request/response.
|
|
18
|
+
- `fleet-module.ts` keeps a 500-event rolling buffer per child but does almost no folding (just `lastEventAt` and `lastCompletedSpeech`).
|
|
19
|
+
- Every consumer (TUI, conductor) currently has to fold events itself if it wants counts or phase.
|
|
20
|
+
- This is why the fleet UI shows status only and requires `/usage` to see context size — nobody has done the fold yet.
|
|
21
|
+
|
|
22
|
+
The in-process subagent path *has* done that fold (in `subagent-module.ts:262-340` and scattered across `tui.ts:174-175, 1019-1037, 1280-1341`). Extracting that fold into a reusable reducer and running it against fleet child event streams is the unification.
|
|
23
|
+
|
|
24
|
+
## Phase 0 — De-risk the unknowns ✓ COMPLETE
|
|
25
|
+
|
|
26
|
+
Two investigations completed before committing to the plan:
|
|
27
|
+
|
|
28
|
+
**0a — agentName uniqueness audit (`tui.ts` and consumers)**: VERDICT GREEN. Namespacing is mechanical: ~50-60 touch sites, no hidden invariant violations forcing redesign. Three findings folded into Phase 4 below:
|
|
29
|
+
- Centralize scope derivation at event ingest (`tui.ts:970-971`, `subagent-module.ts:264-267`), not scattered through map ops.
|
|
30
|
+
- ~8-10 sites compare `if (agent === rootAgentName)` to detect researcher events. Replace with `isLocalRoot(agent)` helper, not direct string compare.
|
|
31
|
+
- Fleet child IDs are already user-chosen and unique by design; collisions only happen between in-process subagent names across processes. Less work than initially flagged.
|
|
32
|
+
- The `subagent--spawn` tool-call detection at `tui.ts:1101-1106` already builds `agentParent` from tool call traces. The same pattern extends to `fleet--spawn` for conductor → fleet-child edges. No new mechanism.
|
|
33
|
+
|
|
34
|
+
**0b — Snapshot data sources audit (`SubagentModule.peek()` vs. framework state)**: VERDICT REVISES PHASE 1. `peek()` is the wrong source — it's optimized for live-streaming UI, missing cumulative tokens / phase / `lastEventAt` / `completedAt`. Top-level framework agents aren't in SubagentModule at all. Tokens and phase are event-derived; they live nowhere as durable state. Findings folded into Phase 1 + Phase 2 below:
|
|
35
|
+
- The Phase 2 reducer **is** the snapshot source. Run it inside the child too; `describe` calls `reducer.getTree()`.
|
|
36
|
+
- Phase 1 is now structurally trivial *after* Phase 2; Phase 2 becomes a hard prerequisite.
|
|
37
|
+
- No upstream changes to framework or SubagentModule. `framework.onTrace()` + `framework.getAllAgents()` + read access to `SubagentModule.activeSubagents` for metadata enrichment is enough.
|
|
38
|
+
- `peek()` stays as-is, used by the streaming peek window — it's a separate concern.
|
|
39
|
+
|
|
40
|
+
## Phase 1 — Wire-protocol additions
|
|
41
|
+
|
|
42
|
+
Files: `src/modules/fleet-types.ts`, `src/headless.ts`
|
|
43
|
+
|
|
44
|
+
Depends on: Phase 2 (reducer must exist before `describe` handler can call it).
|
|
45
|
+
|
|
46
|
+
Add one new `IncomingCommand` variant and one new event type:
|
|
47
|
+
|
|
48
|
+
```typescript
|
|
49
|
+
// IncomingCommand
|
|
50
|
+
| { type: 'describe'; corrId?: string }
|
|
51
|
+
|
|
52
|
+
// New child→parent event: a serialized AgentTreeReducer.getTree() output
|
|
53
|
+
{
|
|
54
|
+
type: 'snapshot';
|
|
55
|
+
corrId?: string;
|
|
56
|
+
asOfTs: number;
|
|
57
|
+
child: {
|
|
58
|
+
name: string;
|
|
59
|
+
status: 'ready' | 'idle' | 'exiting';
|
|
60
|
+
pid: number;
|
|
61
|
+
recipe?: string;
|
|
62
|
+
startedAt: number;
|
|
63
|
+
};
|
|
64
|
+
tree: AgentTreeNode; // root + children, recursively, same shape as Phase 2 reducer output
|
|
65
|
+
}
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
`headless.ts` adds:
|
|
69
|
+
- A long-lived `AgentTreeReducer` instance subscribed to `app.framework.onTrace()` from process startup, accumulating state for the lifetime of the child. Initialized with the framework's existing agents from `framework.getAllAgents()`.
|
|
70
|
+
- Read access to `SubagentModule.activeSubagents` (if mounted) for metadata enrichment (`type`, `task`, `parent`, `findingsCount`) at snapshot time.
|
|
71
|
+
- A `describe` arm in `dispatchCommand`: assembles `{type:'snapshot', child:{...}, tree: reducer.getTree(), asOfTs: Date.now()}` and `emit()`s it.
|
|
72
|
+
- Subscription filter must always allow `snapshot` through (it's a response, not telemetry — exempt from `subscribe` filtering).
|
|
73
|
+
|
|
74
|
+
**Acceptance**: integration test in `connectome-host/test/fleet/` — open socket, send `describe`, receive a well-formed snapshot whose tree matches what an independent reducer fold of the same trace stream produces.
|
|
75
|
+
|
|
76
|
+
## Phase 2 — Extract the agent-tree reducer
|
|
77
|
+
|
|
78
|
+
New file: `src/state/agent-tree-reducer.ts`
|
|
79
|
+
|
|
80
|
+
This is the keystone phase: extracting the fold logic that's currently smeared across `subagent-module.ts:262-340` and `tui.ts:174-175, 1019-1037, 1280-1341` into a single reusable module.
|
|
81
|
+
|
|
82
|
+
```typescript
|
|
83
|
+
class AgentTreeReducer {
|
|
84
|
+
applyEvent(e: TraceEvent | WireEvent): void
|
|
85
|
+
applySnapshot(s: SnapshotEvent): void // resets state, then stream resumes
|
|
86
|
+
reset(): void // for child restart / disconnect
|
|
87
|
+
getTree(): AgentTreeNode // root with recursive children
|
|
88
|
+
getNode(name: string): AgentTreeNode | undefined
|
|
89
|
+
}
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
The reducer must handle the canonical phase-transition mapping (mirror `tui.ts:1280-1341`):
|
|
93
|
+
|
|
94
|
+
| Event | Action |
|
|
95
|
+
|---|---|
|
|
96
|
+
| `inference:started` | phase ← 'sending', lastEventAt ← ts |
|
|
97
|
+
| `inference:tokens` | phase ← 'streaming', lastEventAt ← ts |
|
|
98
|
+
| `inference:tool_calls_yielded` | phase ← 'invoking' |
|
|
99
|
+
| `inference:usage` | **accumulate** contextTokens (NOT overwrite — current SubagentModule.lastInputTokens is broken in this respect) |
|
|
100
|
+
| `inference:completed` | phase ← 'done', completedAt ← ts, absorb final token counts |
|
|
101
|
+
| `inference:failed` | phase ← 'failed', completedAt ← ts |
|
|
102
|
+
| `tool:started` | phase ← 'executing', toolCallsCount++ |
|
|
103
|
+
| `tool:completed` | (durations / output handling) |
|
|
104
|
+
| `subagent--spawn` tool call observed | parent edge: parentMap.set(child, agent) |
|
|
105
|
+
| `fleet--spawn` tool call observed | parent edge for fleet child node |
|
|
106
|
+
|
|
107
|
+
Initial population:
|
|
108
|
+
- Top-level framework agents come from `framework.getAllAgents()`, registered as root nodes (parent=null, type='framework').
|
|
109
|
+
- Subagents discovered via `subagent--spawn` / `subagent--fork` tool-call observations OR seeded from `SubagentModule.activeSubagents` if available at construction time.
|
|
110
|
+
|
|
111
|
+
Strategy: **dual-path validation**. Initially leave `subagent-module` and `tui.ts` logic intact; *also* construct an `AgentTreeReducer` from the same event stream. Diff the two trees in a test harness over a recorded trace stream. Once they match on all displayed fields, switch the TUI over and remove the duplicated logic.
|
|
112
|
+
|
|
113
|
+
**Acceptance**: in single-process mode, `AgentTreeReducer.getTree()` matches the existing rendering byte-for-byte on context tokens, phase, tool count, parent edges across a representative session (recorded trace stream replayed).
|
|
114
|
+
|
|
115
|
+
## Phase 3 — Per-child reducers wired through fleet-module
|
|
116
|
+
|
|
117
|
+
Files: `src/modules/fleet-module.ts`, `src/tui.ts`
|
|
118
|
+
|
|
119
|
+
Depends on: Phase 1 + Phase 2.
|
|
120
|
+
|
|
121
|
+
Instantiate one `AgentTreeReducer` per fleet child via `fleetModule.onChildEvent(childName, ...)`, plus one for local via `framework.onTrace()`. Trigger `describe` at sync points:
|
|
122
|
+
|
|
123
|
+
- TUI cold start, after fleet children reconnect or are reattached.
|
|
124
|
+
- `lifecycle:ready` arrives for a child whose reducer is empty (covers initial attach and parent-side reconnect; child-side reconnect already re-emits `ready`).
|
|
125
|
+
- `process:exited` (via fleet-module) → `reducer.reset()` for that child; next `lifecycle:ready` triggers fresh `describe`.
|
|
126
|
+
|
|
127
|
+
On `describe` response, `applySnapshot()` blows away local state and resumes folding. Events that arrived during the request window are discarded if their `ts < snapshot.asOfTs` (cheap dedupe).
|
|
128
|
+
|
|
129
|
+
**Acceptance**: `kill -9` a fleet child, watch the parent's reducer clear and rebuild on restart with no ghost agents from the previous incarnation.
|
|
130
|
+
|
|
131
|
+
## Phase 4 — Namespace agent keys
|
|
132
|
+
|
|
133
|
+
Depends on: Phase 2 (the reducer is the natural place to apply scope).
|
|
134
|
+
|
|
135
|
+
Per Phase 0a findings, this is mechanical but requires diligence at three zones:
|
|
136
|
+
|
|
137
|
+
**Zone 1 — Map keys** (~12 declarations + ~40-50 set/get sites): replace `Map<string, X>` with `Map<string, X>` keyed on `${scope}/${agentName}` (or tuple key if preferred). Targets enumerated in 0a report: `subagentPhase`, `agentParent`, `agentContextTokens`, `summaryCache`, `peekLogs`, `peekCurrentTool`, `procPeekLogs`, `procPeekTokenLine`, `peekTokenLine`, `activeSubagents`, `parentMap`.
|
|
138
|
+
|
|
139
|
+
**Zone 2 — Event-ingest scope derivation** (`tui.ts:970-971`, `subagent-module.ts:264-267`): centralize at the listener. One function `scopeOf(event) → scope` applied before any map ops, so the rest of the code reads scoped names.
|
|
140
|
+
|
|
141
|
+
**Zone 3 — Root-agent comparisons** (~8-10 sites at `tui.ts:975, 1040, 1069, 1110, 1129, 1153, 1187, 1557, 1562`): replace `if (agent === rootAgentName)` with `isLocalRoot(agent)` helper. Don't string-compare directly.
|
|
142
|
+
|
|
143
|
+
The conductor → fleet-child edge: the reducer's existing `subagent--spawn` tool-call detection extends naturally to `fleet--spawn` (same `tool:started` event shape, different tool name). No new mechanism.
|
|
144
|
+
|
|
145
|
+
**Acceptance**: a session where parent's `commander` and a fleet child's `commander` coexist renders both correctly, no collisions, no swapped readouts.
|
|
146
|
+
|
|
147
|
+
## Phase 5 — TUI rendering: N trees in one tab
|
|
148
|
+
|
|
149
|
+
File: `src/tui.ts`
|
|
150
|
+
|
|
151
|
+
Depends on: Phase 3 + Phase 4.
|
|
152
|
+
|
|
153
|
+
Replace the single subagent tree with one local tree + one tree per fleet child. The fleet-child node renders as a header row (name + recipe + lifecycle status) with its agents/subagents indented beneath using the same row component already used by in-process subagents.
|
|
154
|
+
|
|
155
|
+
The `[tab]` window's existing unfold mechanism is reused. No new key bindings needed.
|
|
156
|
+
|
|
157
|
+
**Acceptance**: tabbing through the subagent window shows context tokens, phase, tool calls for every node — local and fleet alike — without invoking `/usage`. Unfolding a fleet child reveals its agents and subagents.
|
|
158
|
+
|
|
159
|
+
## Phase 6 — No-subfleets invariant
|
|
160
|
+
|
|
161
|
+
File: `src/modules/fleet-module.ts` (start path)
|
|
162
|
+
|
|
163
|
+
Independent — can land any time after Phase 0.
|
|
164
|
+
|
|
165
|
+
Reject any recipe loaded into `FleetModule.spawn()` that itself declares a `fleet` module. Single check, comprehensible error message:
|
|
166
|
+
|
|
167
|
+
```
|
|
168
|
+
fleet child recipe '<name>' declares its own 'fleet' module;
|
|
169
|
+
nested fleets are not supported (see UNIFIED-TREE-PLAN.md §6)
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
Document the invariant in HEADLESS-FLEET-PLAN.md.
|
|
173
|
+
|
|
174
|
+
**Acceptance**: a recipe with a `fleet` module inside fails at spawn time, before any child process starts, with the error above.
|
|
175
|
+
|
|
176
|
+
## Ordering & parallelism
|
|
177
|
+
|
|
178
|
+
```
|
|
179
|
+
Phase 0 ✓ DONE
|
|
180
|
+
↓
|
|
181
|
+
Phase 2 (extract reducer) ──→ Phase 1 (wire protocol; needs reducer for describe handler)
|
|
182
|
+
│ │
|
|
183
|
+
└→ Phase 4 (namespace) ─────────────┤
|
|
184
|
+
↓
|
|
185
|
+
Phase 3 (per-child wiring)
|
|
186
|
+
↓
|
|
187
|
+
Phase 5 (rendering)
|
|
188
|
+
|
|
189
|
+
Phase 6 (invariant) — independent, land any time
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
Phase 2 is now the keystone. Phase 1 simplifies dramatically once Phase 2 exists (`describe` handler is one line: `emit(reducer.getTree())`). Phases 1 and 4 can be done in parallel after Phase 2. Phase 3 needs both. Phase 5 needs 3.
|
|
193
|
+
|
|
194
|
+
## Implementation outcome (all phases shipped)
|
|
195
|
+
|
|
196
|
+
**Phase 0** — investigations completed, plan adjusted (`peek()` ruled out as snapshot source; reducer became the keystone; namespacing confirmed mechanical).
|
|
197
|
+
|
|
198
|
+
**Phase 1** — `describe` IncomingCommand + `snapshot` WireEvent in `fleet-types.ts`; `headless.ts` runs a long-lived reducer subscribed to `framework.onTrace` from startup, seeded with `framework.getAllAgents()`; `describe` handler emits the reducer's snapshot exempt from subscription filtering.
|
|
199
|
+
|
|
200
|
+
**Phase 2** — `src/state/agent-tree-reducer.ts` with the full canonical fold (phase transitions, token semantics, parent-edge inference for `subagent--spawn`/`fork` and `fleet--launch`, callId routing for tool events, snapshot apply with deep-copy safety, lazy node creation).
|
|
201
|
+
|
|
202
|
+
**Phase 3** — `src/state/fleet-tree-aggregator.ts` owns one reducer per fleet child + one local; orchestrates `describe` at sync points (registration, `lifecycle:ready`); drops events with `ts < lastSnapshotTs`; clean read API for the TUI.
|
|
203
|
+
|
|
204
|
+
**Phase 4** — pragmatically reduced. The aggregator's per-child reducers are *already namespaced* by construction (one reducer per scope), so the local TUI maps stayed as-is. Only the `FleetNode` shape grew a `kind` discriminator (`researcher` | `subagent` | `fleet-child` | `fleet-child-agent`), and `renderNode` switches data sources by kind. No rewrites to the existing 50-60 sites; the namespacing happened at the *data source*, not at the rendering call sites.
|
|
205
|
+
|
|
206
|
+
**Phase 5** — `buildFleetTree()` appends fleet-child header nodes as additional descendants of the researcher root, each carrying a subtree built from the aggregator's per-child nodes. Auto-expanded on first display. Same `renderNode` handles all four node kinds. Peek/stop/restart key bindings dispatch by node-id prefix (`proc:NAME` for headers, `NAME:agent` for agents-inside-children). The legacy `processes` view (flat per-process button list) was retired in favor of the unified tree — Tab now toggles `chat ↔ fleet`, `/fleet view` opens the unified tree, and process-level actions (peek/kill/restart) live on fleet-child header nodes.
|
|
207
|
+
|
|
208
|
+
**Phase 6** — `FleetModule.handleLaunch` rejects nested-fleet recipes before subprocess spawn, narrowly (only on confirmed-loaded recipes that declare a `fleet` module), with a clear error message pointing to this plan. Documented in HEADLESS-FLEET-PLAN.md decision §13.
|
|
209
|
+
|
|
210
|
+
**Test coverage**: 38 new tests across reducer, aggregator, describe IPC, fleet-launch edge inference, no-subfleets invariant, and an e2e integration that wires real spawn → real IPC → reducer-populated tree. Full suite: 157 pass / 0 fail.
|
|
211
|
+
|
|
212
|
+
**Out of scope (left as designed)**: subfleets, snapshot delta-events, cross-child unified timeline, snapshot checksums. Late-attach replay gap accepted.
|
|
213
|
+
|
|
214
|
+
## Out of scope (deliberately)
|
|
215
|
+
|
|
216
|
+
- **Subfleets.** Phase 6 forbids them. The wire protocol stays compatible with a future `via:` re-broadcast scheme if the requirement ever appears.
|
|
217
|
+
- **Delta events on top of `describe`.** The lockstep analogy says snapshot-on-recovery is sufficient; revisit only if late-attach drift turns up in practice.
|
|
218
|
+
- **Cross-child unified timeline view.** Each tree is per-process; no merging across processes.
|
|
219
|
+
- **Snapshot checksums / desync detection.** Add only if reducer drift is observed.
|
|
220
|
+
- **Extending `SubagentModule.peek()`.** Per 0b, peek stays optimized for the live streaming peek window. The reducer is the snapshot source.
|
|
221
|
+
- **Per-agent token tracking inside the framework.** Per 0b, no upstream changes to `agent-framework`. The reducer accumulates from trace events.
|
|
222
|
+
|
|
223
|
+
## Risks the plan does NOT address
|
|
224
|
+
|
|
225
|
+
- **Late-attach replay gap** between child startup and TUI attach is partially papered over by `describe`-on-attach, but events that fired before the parent existed at all (e.g. child started by a previous TUI session) are gone from the framework's perspective; only the snapshot's current state is recoverable. This is the same property single-process traces have and is accepted.
|
|
226
|
+
- **Clock skew across children.** Each child stamps `ts` with its own `Date.now()`. Per-tree rendering doesn't care; only matters if a future cross-child timeline view is built (out of scope here).
|
|
227
|
+
- **`findingsCount` for framework agents.** Currently only tracked per-subagent in `ActiveSubagent`. Top-level framework agents will report 0 / undefined. If this ever matters, extend the reducer to count "findings-shaped" tool calls; not addressed here.
|
|
228
|
+
- **TUI subscription density at scale.** Chatty events (token streams, per-round usage) can be narrowed by recipes, but the reducer-required floor is mandatory: ~13 event types per child, always. Fine for current recipes (≤ ~5 children); if fleet sizes grow much larger the floor itself becomes the bottleneck. Mitigations would require either making rendering opt-in per child (reducer can't render what it doesn't know) or moving the rollup logic into the child process (so the wire only carries summarized state). Not addressed here.
|
|
229
|
+
|
|
230
|
+
## Subscription contract
|
|
231
|
+
|
|
232
|
+
Recipe authors can narrow the wire-level event subscription per fleet child to keep traffic lean (e.g. `["lifecycle", "inference:completed"]`). But the unified-tree reducer needs a specific set of events to function — without `inference:tool_calls_yielded` it never discovers subagents; without `tool:started` it can't route tool events to the right agent; without `inference:usage` it can't accumulate token totals; without `inference:started`/`inference:tokens` it can't show phase transitions.
|
|
233
|
+
|
|
234
|
+
To prevent recipes from accidentally disabling the rendering layer, `FleetModule.sendToChild` forces the reducer-required events (`REDUCER_REQUIRED_EVENTS` exported from `agent-tree-reducer.ts`) into every `subscribe` it sends. The recipe-specified subscription becomes "events I want *in addition* to what rendering needs" rather than "events I'm willing to receive at all." The contract:
|
|
235
|
+
|
|
236
|
+
- `["*"]` is left unchanged — everything already flows.
|
|
237
|
+
- Glob coverage is honored (e.g. `tool:*` covers `tool:started`/`tool:completed`/`tool:failed`).
|
|
238
|
+
- Only literal events not already covered are added.
|
|
239
|
+
|
|
240
|
+
The chokepoint is `sendToChild`, which is the one outgoing-command function FleetModule uses; this means the union applies to every code path that subscribes (initial setup, post-launch, agent-callable subscribe tool, reattach-on-restart).
|
|
241
|
+
|
|
242
|
+
When `REDUCER_REQUIRED_EVENTS` changes (new event types added to the reducer's fold), update the constant; old recipes self-heal on next session start with no recipe edits required.
|
package/bun.lock
ADDED
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
{
|
|
2
|
+
"lockfileVersion": 1,
|
|
3
|
+
"configVersion": 1,
|
|
4
|
+
"workspaces": {
|
|
5
|
+
"": {
|
|
6
|
+
"name": "connectome-host",
|
|
7
|
+
"dependencies": {
|
|
8
|
+
"@animalabs/agent-framework": "^0.6.0",
|
|
9
|
+
"@animalabs/chronicle": "^0.2.0",
|
|
10
|
+
"@animalabs/context-manager": "^0.5.5",
|
|
11
|
+
"@animalabs/membrane": "^0.5.68",
|
|
12
|
+
"@opentui/core": "^0.1.82",
|
|
13
|
+
},
|
|
14
|
+
"devDependencies": {
|
|
15
|
+
"@types/bun": "^1.3.13",
|
|
16
|
+
"@types/node": "^22.0.0",
|
|
17
|
+
"typescript": "^5.7.0",
|
|
18
|
+
},
|
|
19
|
+
},
|
|
20
|
+
},
|
|
21
|
+
"packages": {
|
|
22
|
+
"@animalabs/agent-framework": ["@animalabs/agent-framework@0.6.0", "", { "dependencies": { "@animalabs/chronicle": "^0.2.0", "@animalabs/context-manager": "^0.5.5", "@animalabs/membrane": "^0.5.64", "chokidar": "^4.0.3", "discord.js": "^14.25.1", "ws": "^8.18.0" }, "bin": { "agent-framework-mcp": "dist/src/api/mcp-server.js" } }, "sha512-LsR2eYveMkC+aZTq0a58bEYoi8+Iq3XQSrSCZ1fbcg+mf9YNOk8ooBRUl0VM03fyPymdOf/fkVx2tdMZM7HjSQ=="],
|
|
23
|
+
|
|
24
|
+
"@animalabs/chronicle": ["@animalabs/chronicle@0.2.1", "", { "optionalDependencies": { "@animalabs/chronicle-darwin-arm64": "0.2.1", "@animalabs/chronicle-darwin-x64": "0.2.1", "@animalabs/chronicle-linux-arm64-gnu": "0.2.1", "@animalabs/chronicle-linux-x64-gnu": "0.2.1", "@animalabs/chronicle-win32-x64-msvc": "0.2.1" } }, "sha512-rDFc069yfi7BQUusgsXBwBdqljUWLByXSYaTF40AP+tonBh0No3eF9VzKTSy1I8DYg/jAUHIKtVdKDGsVMVubw=="],
|
|
25
|
+
|
|
26
|
+
"@animalabs/context-manager": ["@animalabs/context-manager@0.5.5", "", { "dependencies": { "@animalabs/chronicle": "^0.2.0", "@animalabs/membrane": "^0.5.64" } }, "sha512-KWTluwU5VIZKIPF/IdfUbkvPNZ5zMxSfZjaxZb81IXe+DBPmjHuUVNIqgXIQ2Mv1pCn1vCNqieZ/iSrc6dFH8w=="],
|
|
27
|
+
|
|
28
|
+
"@animalabs/membrane": ["@animalabs/membrane@0.5.68", "", { "dependencies": { "@anthropic-ai/sdk": "^0.52.0" } }, "sha512-MfSERy0ECxdBZ4NelHdZbqsP/ORWJsfeAI6vuyy6gP77aGcdJL8qf4XrUkOox5yZa5MqB50y0K58Ffv79jCnbg=="],
|
|
29
|
+
|
|
30
|
+
"@anthropic-ai/sdk": ["@anthropic-ai/sdk@0.52.0", "", { "bin": { "anthropic-ai-sdk": "bin/cli" } }, "sha512-d4c+fg+xy9e46c8+YnrrgIQR45CZlAi7PwdzIfDXDM6ACxEZli1/fxhURsq30ZpMZy6LvSkr41jGq5aF5TD7rQ=="],
|
|
31
|
+
|
|
32
|
+
"@dimforge/rapier2d-simd-compat": ["@dimforge/rapier2d-simd-compat@0.17.3", "", {}, "sha512-bijvwWz6NHsNj5e5i1vtd3dU2pDhthSaTUZSh14DUGGKJfw8eMnlWZsxwHBxB/a3AXVNDjL9abuHw1k9FGR+jg=="],
|
|
33
|
+
|
|
34
|
+
"@discordjs/builders": ["@discordjs/builders@1.14.1", "", { "dependencies": { "@discordjs/formatters": "^0.6.2", "@discordjs/util": "^1.2.0", "@sapphire/shapeshift": "^4.0.0", "discord-api-types": "^0.38.40", "fast-deep-equal": "^3.1.3", "ts-mixer": "^6.0.4", "tslib": "^2.6.3" } }, "sha512-gSKkhXLqs96TCzk66VZuHHl8z2bQMJFGwrXC0f33ngK+FLNau4hU1PYny3DNJfNdSH+gVMzE85/d5FQ2BpcNwQ=="],
|
|
35
|
+
|
|
36
|
+
"@discordjs/collection": ["@discordjs/collection@1.5.3", "", {}, "sha512-SVb428OMd3WO1paV3rm6tSjM4wC+Kecaa1EUGX7vc6/fddvw/6lg90z4QtCqm21zvVe92vMMDt9+DkIvjXImQQ=="],
|
|
37
|
+
|
|
38
|
+
"@discordjs/formatters": ["@discordjs/formatters@0.6.2", "", { "dependencies": { "discord-api-types": "^0.38.33" } }, "sha512-y4UPwWhH6vChKRkGdMB4odasUbHOUwy7KL+OVwF86PvT6QVOwElx+TiI1/6kcmcEe+g5YRXJFiXSXUdabqZOvQ=="],
|
|
39
|
+
|
|
40
|
+
"@discordjs/rest": ["@discordjs/rest@2.6.1", "", { "dependencies": { "@discordjs/collection": "^2.1.1", "@discordjs/util": "^1.2.0", "@sapphire/async-queue": "^1.5.3", "@sapphire/snowflake": "^3.5.5", "@vladfrangu/async_event_emitter": "^2.4.6", "discord-api-types": "^0.38.40", "magic-bytes.js": "^1.13.0", "tslib": "^2.6.3", "undici": "6.24.1" } }, "sha512-wwQdgjeaoYFiaG+atbqx6aJDpqW7JHAo0HrQkBTbYzM3/PJ3GweQIpgElNcGZ26DCUOXMyawYd0YF7vtr+fZXg=="],
|
|
41
|
+
|
|
42
|
+
"@discordjs/util": ["@discordjs/util@1.2.0", "", { "dependencies": { "discord-api-types": "^0.38.33" } }, "sha512-3LKP7F2+atl9vJFhaBjn4nOaSWahZ/yWjOvA4e5pnXkt2qyXRCHLxoBQy81GFtLGCq7K9lPm9R517M1U+/90Qg=="],
|
|
43
|
+
|
|
44
|
+
"@discordjs/ws": ["@discordjs/ws@1.2.3", "", { "dependencies": { "@discordjs/collection": "^2.1.0", "@discordjs/rest": "^2.5.1", "@discordjs/util": "^1.1.0", "@sapphire/async-queue": "^1.5.2", "@types/ws": "^8.5.10", "@vladfrangu/async_event_emitter": "^2.2.4", "discord-api-types": "^0.38.1", "tslib": "^2.6.2", "ws": "^8.17.0" } }, "sha512-wPlQDxEmlDg5IxhJPuxXr3Vy9AjYq5xCvFWGJyD7w7Np8ZGu+Mc+97LCoEc/+AYCo2IDpKioiH0/c/mj5ZR9Uw=="],
|
|
45
|
+
|
|
46
|
+
"@jimp/core": ["@jimp/core@1.6.0", "", { "dependencies": { "@jimp/file-ops": "1.6.0", "@jimp/types": "1.6.0", "@jimp/utils": "1.6.0", "await-to-js": "^3.0.0", "exif-parser": "^0.1.12", "file-type": "^16.0.0", "mime": "3" } }, "sha512-EQQlKU3s9QfdJqiSrZWNTxBs3rKXgO2W+GxNXDtwchF3a4IqxDheFX1ti+Env9hdJXDiYLp2jTRjlxhPthsk8w=="],
|
|
47
|
+
|
|
48
|
+
"@jimp/diff": ["@jimp/diff@1.6.0", "", { "dependencies": { "@jimp/plugin-resize": "1.6.0", "@jimp/types": "1.6.0", "@jimp/utils": "1.6.0", "pixelmatch": "^5.3.0" } }, "sha512-+yUAQ5gvRC5D1WHYxjBHZI7JBRusGGSLf8AmPRPCenTzh4PA+wZ1xv2+cYqQwTfQHU5tXYOhA0xDytfHUf1Zyw=="],
|
|
49
|
+
|
|
50
|
+
"@jimp/file-ops": ["@jimp/file-ops@1.6.0", "", {}, "sha512-Dx/bVDmgnRe1AlniRpCKrGRm5YvGmUwbDzt+MAkgmLGf+jvBT75hmMEZ003n9HQI/aPnm/YKnXjg/hOpzNCpHQ=="],
|
|
51
|
+
|
|
52
|
+
"@jimp/js-bmp": ["@jimp/js-bmp@1.6.0", "", { "dependencies": { "@jimp/core": "1.6.0", "@jimp/types": "1.6.0", "@jimp/utils": "1.6.0", "bmp-ts": "^1.0.9" } }, "sha512-FU6Q5PC/e3yzLyBDXupR3SnL3htU7S3KEs4e6rjDP6gNEOXRFsWs6YD3hXuXd50jd8ummy+q2WSwuGkr8wi+Gw=="],
|
|
53
|
+
|
|
54
|
+
"@jimp/js-gif": ["@jimp/js-gif@1.6.0", "", { "dependencies": { "@jimp/core": "1.6.0", "@jimp/types": "1.6.0", "gifwrap": "^0.10.1", "omggif": "^1.0.10" } }, "sha512-N9CZPHOrJTsAUoWkWZstLPpwT5AwJ0wge+47+ix3++SdSL/H2QzyMqxbcDYNFe4MoI5MIhATfb0/dl/wmX221g=="],
|
|
55
|
+
|
|
56
|
+
"@jimp/js-jpeg": ["@jimp/js-jpeg@1.6.0", "", { "dependencies": { "@jimp/core": "1.6.0", "@jimp/types": "1.6.0", "jpeg-js": "^0.4.4" } }, "sha512-6vgFDqeusblf5Pok6B2DUiMXplH8RhIKAryj1yn+007SIAQ0khM1Uptxmpku/0MfbClx2r7pnJv9gWpAEJdMVA=="],
|
|
57
|
+
|
|
58
|
+
"@jimp/js-png": ["@jimp/js-png@1.6.0", "", { "dependencies": { "@jimp/core": "1.6.0", "@jimp/types": "1.6.0", "pngjs": "^7.0.0" } }, "sha512-AbQHScy3hDDgMRNfG0tPjL88AV6qKAILGReIa3ATpW5QFjBKpisvUaOqhzJ7Reic1oawx3Riyv152gaPfqsBVg=="],
|
|
59
|
+
|
|
60
|
+
"@jimp/js-tiff": ["@jimp/js-tiff@1.6.0", "", { "dependencies": { "@jimp/core": "1.6.0", "@jimp/types": "1.6.0", "utif2": "^4.1.0" } }, "sha512-zhReR8/7KO+adijj3h0ZQUOiun3mXUv79zYEAKvE0O+rP7EhgtKvWJOZfRzdZSNv0Pu1rKtgM72qgtwe2tFvyw=="],
|
|
61
|
+
|
|
62
|
+
"@jimp/plugin-blit": ["@jimp/plugin-blit@1.6.0", "", { "dependencies": { "@jimp/types": "1.6.0", "@jimp/utils": "1.6.0", "zod": "^3.23.8" } }, "sha512-M+uRWl1csi7qilnSK8uxK4RJMSuVeBiO1AY0+7APnfUbQNZm6hCe0CCFv1Iyw1D/Dhb8ph8fQgm5mwM0eSxgVA=="],
|
|
63
|
+
|
|
64
|
+
"@jimp/plugin-blur": ["@jimp/plugin-blur@1.6.0", "", { "dependencies": { "@jimp/core": "1.6.0", "@jimp/utils": "1.6.0" } }, "sha512-zrM7iic1OTwUCb0g/rN5y+UnmdEsT3IfuCXCJJNs8SZzP0MkZ1eTvuwK9ZidCuMo4+J3xkzCidRwYXB5CyGZTw=="],
|
|
65
|
+
|
|
66
|
+
"@jimp/plugin-circle": ["@jimp/plugin-circle@1.6.0", "", { "dependencies": { "@jimp/types": "1.6.0", "zod": "^3.23.8" } }, "sha512-xt1Gp+LtdMKAXfDp3HNaG30SPZW6AQ7dtAtTnoRKorRi+5yCJjKqXRgkewS5bvj8DEh87Ko1ydJfzqS3P2tdWw=="],
|
|
67
|
+
|
|
68
|
+
"@jimp/plugin-color": ["@jimp/plugin-color@1.6.0", "", { "dependencies": { "@jimp/core": "1.6.0", "@jimp/types": "1.6.0", "@jimp/utils": "1.6.0", "tinycolor2": "^1.6.0", "zod": "^3.23.8" } }, "sha512-J5q8IVCpkBsxIXM+45XOXTrsyfblyMZg3a9eAo0P7VPH4+CrvyNQwaYatbAIamSIN1YzxmO3DkIZXzRjFSz1SA=="],
|
|
69
|
+
|
|
70
|
+
"@jimp/plugin-contain": ["@jimp/plugin-contain@1.6.0", "", { "dependencies": { "@jimp/core": "1.6.0", "@jimp/plugin-blit": "1.6.0", "@jimp/plugin-resize": "1.6.0", "@jimp/types": "1.6.0", "@jimp/utils": "1.6.0", "zod": "^3.23.8" } }, "sha512-oN/n+Vdq/Qg9bB4yOBOxtY9IPAtEfES8J1n9Ddx+XhGBYT1/QTU/JYkGaAkIGoPnyYvmLEDqMz2SGihqlpqfzQ=="],
|
|
71
|
+
|
|
72
|
+
"@jimp/plugin-cover": ["@jimp/plugin-cover@1.6.0", "", { "dependencies": { "@jimp/core": "1.6.0", "@jimp/plugin-crop": "1.6.0", "@jimp/plugin-resize": "1.6.0", "@jimp/types": "1.6.0", "zod": "^3.23.8" } }, "sha512-Iow0h6yqSC269YUJ8HC3Q/MpCi2V55sMlbkkTTx4zPvd8mWZlC0ykrNDeAy9IJegrQ7v5E99rJwmQu25lygKLA=="],
|
|
73
|
+
|
|
74
|
+
"@jimp/plugin-crop": ["@jimp/plugin-crop@1.6.0", "", { "dependencies": { "@jimp/core": "1.6.0", "@jimp/types": "1.6.0", "@jimp/utils": "1.6.0", "zod": "^3.23.8" } }, "sha512-KqZkEhvs+21USdySCUDI+GFa393eDIzbi1smBqkUPTE+pRwSWMAf01D5OC3ZWB+xZsNla93BDS9iCkLHA8wang=="],
|
|
75
|
+
|
|
76
|
+
"@jimp/plugin-displace": ["@jimp/plugin-displace@1.6.0", "", { "dependencies": { "@jimp/types": "1.6.0", "@jimp/utils": "1.6.0", "zod": "^3.23.8" } }, "sha512-4Y10X9qwr5F+Bo5ME356XSACEF55485j5nGdiyJ9hYzjQP9nGgxNJaZ4SAOqpd+k5sFaIeD7SQ0Occ26uIng5Q=="],
|
|
77
|
+
|
|
78
|
+
"@jimp/plugin-dither": ["@jimp/plugin-dither@1.6.0", "", { "dependencies": { "@jimp/types": "1.6.0" } }, "sha512-600d1RxY0pKwgyU0tgMahLNKsqEcxGdbgXadCiVCoGd6V6glyCvkNrnnwC0n5aJ56Htkj88PToSdF88tNVZEEQ=="],
|
|
79
|
+
|
|
80
|
+
"@jimp/plugin-fisheye": ["@jimp/plugin-fisheye@1.6.0", "", { "dependencies": { "@jimp/types": "1.6.0", "@jimp/utils": "1.6.0", "zod": "^3.23.8" } }, "sha512-E5QHKWSCBFtpgZarlmN3Q6+rTQxjirFqo44ohoTjzYVrDI6B6beXNnPIThJgPr0Y9GwfzgyarKvQuQuqCnnfbA=="],
|
|
81
|
+
|
|
82
|
+
"@jimp/plugin-flip": ["@jimp/plugin-flip@1.6.0", "", { "dependencies": { "@jimp/types": "1.6.0", "zod": "^3.23.8" } }, "sha512-/+rJVDuBIVOgwoyVkBjUFHtP+wmW0r+r5OQ2GpatQofToPVbJw1DdYWXlwviSx7hvixTWLKVgRWQ5Dw862emDg=="],
|
|
83
|
+
|
|
84
|
+
"@jimp/plugin-hash": ["@jimp/plugin-hash@1.6.0", "", { "dependencies": { "@jimp/core": "1.6.0", "@jimp/js-bmp": "1.6.0", "@jimp/js-jpeg": "1.6.0", "@jimp/js-png": "1.6.0", "@jimp/js-tiff": "1.6.0", "@jimp/plugin-color": "1.6.0", "@jimp/plugin-resize": "1.6.0", "@jimp/types": "1.6.0", "@jimp/utils": "1.6.0", "any-base": "^1.1.0" } }, "sha512-wWzl0kTpDJgYVbZdajTf+4NBSKvmI3bRI8q6EH9CVeIHps9VWVsUvEyb7rpbcwVLWYuzDtP2R0lTT6WeBNQH9Q=="],
|
|
85
|
+
|
|
86
|
+
"@jimp/plugin-mask": ["@jimp/plugin-mask@1.6.0", "", { "dependencies": { "@jimp/types": "1.6.0", "zod": "^3.23.8" } }, "sha512-Cwy7ExSJMZszvkad8NV8o/Z92X2kFUFM8mcDAhNVxU0Q6tA0op2UKRJY51eoK8r6eds/qak3FQkXakvNabdLnA=="],
|
|
87
|
+
|
|
88
|
+
"@jimp/plugin-print": ["@jimp/plugin-print@1.6.0", "", { "dependencies": { "@jimp/core": "1.6.0", "@jimp/js-jpeg": "1.6.0", "@jimp/js-png": "1.6.0", "@jimp/plugin-blit": "1.6.0", "@jimp/types": "1.6.0", "parse-bmfont-ascii": "^1.0.6", "parse-bmfont-binary": "^1.0.6", "parse-bmfont-xml": "^1.1.6", "simple-xml-to-json": "^1.2.2", "zod": "^3.23.8" } }, "sha512-zarTIJi8fjoGMSI/M3Xh5yY9T65p03XJmPsuNet19K/Q7mwRU6EV2pfj+28++2PV2NJ+htDF5uecAlnGyxFN2A=="],
|
|
89
|
+
|
|
90
|
+
"@jimp/plugin-quantize": ["@jimp/plugin-quantize@1.6.0", "", { "dependencies": { "image-q": "^4.0.0", "zod": "^3.23.8" } }, "sha512-EmzZ/s9StYQwbpG6rUGBCisc3f64JIhSH+ncTJd+iFGtGo0YvSeMdAd+zqgiHpfZoOL54dNavZNjF4otK+mvlg=="],
|
|
91
|
+
|
|
92
|
+
"@jimp/plugin-resize": ["@jimp/plugin-resize@1.6.0", "", { "dependencies": { "@jimp/core": "1.6.0", "@jimp/types": "1.6.0", "zod": "^3.23.8" } }, "sha512-uSUD1mqXN9i1SGSz5ov3keRZ7S9L32/mAQG08wUwZiEi5FpbV0K8A8l1zkazAIZi9IJzLlTauRNU41Mi8IF9fA=="],
|
|
93
|
+
|
|
94
|
+
"@jimp/plugin-rotate": ["@jimp/plugin-rotate@1.6.0", "", { "dependencies": { "@jimp/core": "1.6.0", "@jimp/plugin-crop": "1.6.0", "@jimp/plugin-resize": "1.6.0", "@jimp/types": "1.6.0", "@jimp/utils": "1.6.0", "zod": "^3.23.8" } }, "sha512-JagdjBLnUZGSG4xjCLkIpQOZZ3Mjbg8aGCCi4G69qR+OjNpOeGI7N2EQlfK/WE8BEHOW5vdjSyglNqcYbQBWRw=="],
|
|
95
|
+
|
|
96
|
+
"@jimp/plugin-threshold": ["@jimp/plugin-threshold@1.6.0", "", { "dependencies": { "@jimp/core": "1.6.0", "@jimp/plugin-color": "1.6.0", "@jimp/plugin-hash": "1.6.0", "@jimp/types": "1.6.0", "@jimp/utils": "1.6.0", "zod": "^3.23.8" } }, "sha512-M59m5dzLoHOVWdM41O8z9SyySzcDn43xHseOH0HavjsfQsT56GGCC4QzU1banJidbUrePhzoEdS42uFE8Fei8w=="],
|
|
97
|
+
|
|
98
|
+
"@jimp/types": ["@jimp/types@1.6.0", "", { "dependencies": { "zod": "^3.23.8" } }, "sha512-7UfRsiKo5GZTAATxm2qQ7jqmUXP0DxTArztllTcYdyw6Xi5oT4RaoXynVtCD4UyLK5gJgkZJcwonoijrhYFKfg=="],
|
|
99
|
+
|
|
100
|
+
"@jimp/utils": ["@jimp/utils@1.6.0", "", { "dependencies": { "@jimp/types": "1.6.0", "tinycolor2": "^1.6.0" } }, "sha512-gqFTGEosKbOkYF/WFj26jMHOI5OH2jeP1MmC/zbK6BF6VJBf8rIC5898dPfSzZEbSA0wbbV5slbntWVc5PKLFA=="],
|
|
101
|
+
|
|
102
|
+
"@opentui/core": ["@opentui/core@0.1.107", "", { "dependencies": { "bun-ffi-structs": "0.1.2", "diff": "8.0.2", "jimp": "1.6.0", "marked": "17.0.1", "string-width": "7.2.0", "strip-ansi": "7.1.2", "yoga-layout": "3.2.1" }, "optionalDependencies": { "@dimforge/rapier2d-simd-compat": "^0.17.3", "@opentui/core-darwin-arm64": "0.1.107", "@opentui/core-darwin-x64": "0.1.107", "@opentui/core-linux-arm64": "0.1.107", "@opentui/core-linux-x64": "0.1.107", "@opentui/core-win32-arm64": "0.1.107", "@opentui/core-win32-x64": "0.1.107", "bun-webgpu": "0.1.7", "planck": "^1.4.2", "three": "0.177.0" }, "peerDependencies": { "web-tree-sitter": "0.25.10" } }, "sha512-gadu9EtNR+sOGyHN0buZryllavkWHRkCcX4yW/1ldp/l7HGS52hvkjYmo+74cuzUcfds/5Rbw2cgiy0Z7RxXmQ=="],
|
|
103
|
+
|
|
104
|
+
"@opentui/core-darwin-arm64": ["@opentui/core-darwin-arm64@0.1.107", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Yqt2/9Ntw0IdtPA/qmHvXCE16y4Jq5/btCmuzN9/opzqZ5rYGYYVtiBii3LezGcTZYuJQZthjvh8MLPXXwA2EQ=="],
|
|
105
|
+
|
|
106
|
+
"@opentui/core-darwin-x64": ["@opentui/core-darwin-x64@0.1.107", "", { "os": "darwin", "cpu": "x64" }, "sha512-p6yeHsIWRLy/J30nZTyUuwgFYEpk8NS0H0Cmh9P8a1+eHA406MMMP4FAC0YpqlF4SHb7R7LNkUSsfCx9yMtS8w=="],
|
|
107
|
+
|
|
108
|
+
"@opentui/core-linux-arm64": ["@opentui/core-linux-arm64@0.1.107", "", { "os": "linux", "cpu": "arm64" }, "sha512-w6MpRTd06KUH4KdgH4x7rVB2I67KE62w3W3jQVBDEMeJejdJVOSwwUdgaTY9ffoHglcZc3WA2PFH1PCpgzna4A=="],
|
|
109
|
+
|
|
110
|
+
"@opentui/core-linux-x64": ["@opentui/core-linux-x64@0.1.107", "", { "os": "linux", "cpu": "x64" }, "sha512-oxKbIpWZRgY+8KQZ9dXq8lzDEhMVpBMCiZGDiHtK8/DP1MvK5kFE/vtwgUK9YkmT4OSgZsFeojjvyePXV+PcfQ=="],
|
|
111
|
+
|
|
112
|
+
"@opentui/core-win32-arm64": ["@opentui/core-win32-arm64@0.1.107", "", { "os": "win32", "cpu": "arm64" }, "sha512-T7hbLgoTkb5eAsP5GJdTRyDl48WI/hMEtj+BGlIITzSaOBSN7ZPCeblcfUz+uXrdF6g3dF1a9uyEQSJlzeGaKA=="],
|
|
113
|
+
|
|
114
|
+
"@opentui/core-win32-x64": ["@opentui/core-win32-x64@0.1.107", "", { "os": "win32", "cpu": "x64" }, "sha512-e/uFLPyKK/hFDvDZtTxp6L3Zx0FWuZv5Gf2qIKf/7FAAadD0hala+K41OJAmYWxu1X3cT5XozKCT8gN/S1N08A=="],
|
|
115
|
+
|
|
116
|
+
"@sapphire/async-queue": ["@sapphire/async-queue@1.5.5", "", {}, "sha512-cvGzxbba6sav2zZkH8GPf2oGk9yYoD5qrNWdu9fRehifgnFZJMV+nuy2nON2roRO4yQQ+v7MK/Pktl/HgfsUXg=="],
|
|
117
|
+
|
|
118
|
+
"@sapphire/shapeshift": ["@sapphire/shapeshift@4.0.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "lodash": "^4.17.21" } }, "sha512-d9dUmWVA7MMiKobL3VpLF8P2aeanRTu6ypG2OIaEv/ZHH/SUQ2iHOVyi5wAPjQ+HmnMuL0whK9ez8I/raWbtIg=="],
|
|
119
|
+
|
|
120
|
+
"@sapphire/snowflake": ["@sapphire/snowflake@3.5.3", "", {}, "sha512-jjmJywLAFoWeBi1W7994zZyiNWPIiqRRNAmSERxyg93xRGzNYvGjlZ0gR6x0F4gPRi2+0O6S71kOZYyr3cxaIQ=="],
|
|
121
|
+
|
|
122
|
+
"@tokenizer/token": ["@tokenizer/token@0.3.0", "", {}, "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A=="],
|
|
123
|
+
|
|
124
|
+
"@types/bun": ["@types/bun@1.3.14", "", { "dependencies": { "bun-types": "1.3.14" } }, "sha512-h1hFqFVcvAvD9j9K7ZW7vd82aSA+rTdznZa+5bwvCwqSB1jmmfLcbIWhOLx1/+boy/xmjgCs/OMUL8hRJSmnPw=="],
|
|
125
|
+
|
|
126
|
+
"@types/node": ["@types/node@22.19.19", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-dyh/xO2Fh5bYrfWaaqGrRQQGkNdmYw6AmaAUvYeUMNTWQtvb796ikLdmTchRmOlOiIJ1TDXfWgVx1QkUlQ6Hew=="],
|
|
127
|
+
|
|
128
|
+
"@types/ws": ["@types/ws@8.18.1", "", { "dependencies": { "@types/node": "*" } }, "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg=="],
|
|
129
|
+
|
|
130
|
+
"@vladfrangu/async_event_emitter": ["@vladfrangu/async_event_emitter@2.4.7", "", {}, "sha512-Xfe6rpCTxSxfbswi/W/Pz7zp1WWSNn4A0eW4mLkQUewCrXXtMj31lCg+iQyTkh/CkusZSq9eDflu7tjEDXUY6g=="],
|
|
131
|
+
|
|
132
|
+
"@webgpu/types": ["@webgpu/types@0.1.70", "", {}, "sha512-LFiNHHKMvmAEvwVew3JLJmTdShhbdwRFSImUshGhE2mGE8ybQzIo63l5uRp+YKnNx+8Qno8Kf6gN+DKMreIJCA=="],
|
|
133
|
+
|
|
134
|
+
"abort-controller": ["abort-controller@3.0.0", "", { "dependencies": { "event-target-shim": "^5.0.0" } }, "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg=="],
|
|
135
|
+
|
|
136
|
+
"ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="],
|
|
137
|
+
|
|
138
|
+
"any-base": ["any-base@1.1.0", "", {}, "sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg=="],
|
|
139
|
+
|
|
140
|
+
"await-to-js": ["await-to-js@3.0.0", "", {}, "sha512-zJAaP9zxTcvTHRlejau3ZOY4V7SRpiByf3/dxx2uyKxxor19tpmpV2QRsTKikckwhaPmr2dVpxxMr7jOCYVp5g=="],
|
|
141
|
+
|
|
142
|
+
"base64-js": ["base64-js@1.5.1", "", {}, "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="],
|
|
143
|
+
|
|
144
|
+
"bmp-ts": ["bmp-ts@1.0.9", "", {}, "sha512-cTEHk2jLrPyi+12M3dhpEbnnPOsaZuq7C45ylbbQIiWgDFZq4UVYPEY5mlqjvsj/6gJv9qX5sa+ebDzLXT28Vw=="],
|
|
145
|
+
|
|
146
|
+
"buffer": ["buffer@6.0.3", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" } }, "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA=="],
|
|
147
|
+
|
|
148
|
+
"bun-ffi-structs": ["bun-ffi-structs@0.1.2", "", { "peerDependencies": { "typescript": "^5" } }, "sha512-Lh1oQAYHDcnesJauieA4UNkWGXY9hYck7OA5IaRwE3Bp6K2F2pJSNYqq+hIy7P3uOvo3km3oxS8304g5gDMl/w=="],
|
|
149
|
+
|
|
150
|
+
"bun-types": ["bun-types@1.3.14", "", { "dependencies": { "@types/node": "*" } }, "sha512-4N0ig0fEomHt5R0KCFWjovxow98rIoRwKolrYdCcknNwMekCXRnWEUvgu5soYV8QXtVsrUD8B95MBOZGPvr6KQ=="],
|
|
151
|
+
|
|
152
|
+
"bun-webgpu": ["bun-webgpu@0.1.7", "", { "dependencies": { "@webgpu/types": "^0.1.60" }, "optionalDependencies": { "bun-webgpu-darwin-arm64": "^0.1.7", "bun-webgpu-darwin-x64": "^0.1.7", "bun-webgpu-linux-x64": "^0.1.7", "bun-webgpu-win32-x64": "^0.1.7" } }, "sha512-KUxUp+oQIf7pPBMD4Hv1TUu7DWaOZ4ciKulTk9to9+Uc8yHoYrMW7L2SJCJ4FHHkywgf/7aLRgRx0b7i6DvGIQ=="],
|
|
153
|
+
|
|
154
|
+
"bun-webgpu-darwin-arm64": ["bun-webgpu-darwin-arm64@0.1.7", "", { "os": "darwin", "cpu": "arm64" }, "sha512-mRrFFyHzPWjsTRidAZBRcu808CPQBOUL0P6b4nxLhp+XHcV/mbUHERZMgW9s58tsojQfSdzschiQa8q+JCgRWA=="],
|
|
155
|
+
|
|
156
|
+
"bun-webgpu-darwin-x64": ["bun-webgpu-darwin-x64@0.1.7", "", { "os": "darwin", "cpu": "x64" }, "sha512-g0NXGNgvaVCSH/jCWWlfdiquOHkbUN6vP4zqzSkIxWKQeLnqm3oADcok7SO3yIgI7v5mKpRc/ks7NDEKNH+jNQ=="],
|
|
157
|
+
|
|
158
|
+
"bun-webgpu-linux-x64": ["bun-webgpu-linux-x64@0.1.7", "", { "os": "linux", "cpu": "x64" }, "sha512-UEP7UZdEhx9otvkZczjsszL8ZVlrODANQvgl+C88/bNVmxDoFi7w1fWzGi1sZyakiETjmtFDq2/xCLhbSZxjqw=="],
|
|
159
|
+
|
|
160
|
+
"bun-webgpu-win32-x64": ["bun-webgpu-win32-x64@0.1.7", "", { "os": "win32", "cpu": "x64" }, "sha512-KZktiFkBz6sN7PEm1NVdeaLP5Q5X/PlSHZqefY4nNuWtf0LNvh54NhZe7yVv/Plz/nGbv92b0KHMBY3ki/pp6g=="],
|
|
161
|
+
|
|
162
|
+
"chokidar": ["chokidar@4.0.3", "", { "dependencies": { "readdirp": "^4.0.1" } }, "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA=="],
|
|
163
|
+
|
|
164
|
+
"diff": ["diff@8.0.2", "", {}, "sha512-sSuxWU5j5SR9QQji/o2qMvqRNYRDOcBTgsJ/DeCf4iSN4gW+gNMXM7wFIP+fdXZxoNiAnHUTGjCr+TSWXdRDKg=="],
|
|
165
|
+
|
|
166
|
+
"discord-api-types": ["discord-api-types@0.38.48", "", {}, "sha512-WFUE/2o0lBlLeCQonQ+Pu2RqHAqbytBJ2RlXR91gzk05InSS6k9ShzzLYoymrA4c2oRgRKGE7/VqQJNNdGWSxQ=="],
|
|
167
|
+
|
|
168
|
+
"discord.js": ["discord.js@14.26.4", "", { "dependencies": { "@discordjs/builders": "^1.14.1", "@discordjs/collection": "1.5.3", "@discordjs/formatters": "^0.6.2", "@discordjs/rest": "^2.6.1", "@discordjs/util": "^1.2.0", "@discordjs/ws": "^1.2.3", "@sapphire/snowflake": "3.5.3", "discord-api-types": "^0.38.40", "fast-deep-equal": "3.1.3", "lodash.snakecase": "4.1.1", "magic-bytes.js": "^1.13.0", "tslib": "^2.6.3", "undici": "6.24.1" } }, "sha512-4oBp8tc6Kf8IDBwAHhbsMaAqx1b5fob9SNasZT7V6yyyUydoO5i5fGuX7TmvRtR+q/WgKRnRViRoAWnG7fNyvA=="],
|
|
169
|
+
|
|
170
|
+
"emoji-regex": ["emoji-regex@10.6.0", "", {}, "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A=="],
|
|
171
|
+
|
|
172
|
+
"event-target-shim": ["event-target-shim@5.0.1", "", {}, "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ=="],
|
|
173
|
+
|
|
174
|
+
"events": ["events@3.3.0", "", {}, "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q=="],
|
|
175
|
+
|
|
176
|
+
"exif-parser": ["exif-parser@0.1.12", "", {}, "sha512-c2bQfLNbMzLPmzQuOr8fy0csy84WmwnER81W88DzTp9CYNPJ6yzOj2EZAh9pywYpqHnshVLHQJ8WzldAyfY+Iw=="],
|
|
177
|
+
|
|
178
|
+
"fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="],
|
|
179
|
+
|
|
180
|
+
"file-type": ["file-type@16.5.4", "", { "dependencies": { "readable-web-to-node-stream": "^3.0.0", "strtok3": "^6.2.4", "token-types": "^4.1.1" } }, "sha512-/yFHK0aGjFEgDJjEKP0pWCplsPFPhwyfwevf/pVxiN0tmE4L9LmwWxWukdJSHdoCli4VgQLehjJtwQBnqmsKcw=="],
|
|
181
|
+
|
|
182
|
+
"get-east-asian-width": ["get-east-asian-width@1.6.0", "", {}, "sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA=="],
|
|
183
|
+
|
|
184
|
+
"gifwrap": ["gifwrap@0.10.1", "", { "dependencies": { "image-q": "^4.0.0", "omggif": "^1.0.10" } }, "sha512-2760b1vpJHNmLzZ/ubTtNnEx5WApN/PYWJvXvgS+tL1egTTthayFYIQQNi136FLEDcN/IyEY2EcGpIITD6eYUw=="],
|
|
185
|
+
|
|
186
|
+
"ieee754": ["ieee754@1.2.1", "", {}, "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="],
|
|
187
|
+
|
|
188
|
+
"image-q": ["image-q@4.0.0", "", { "dependencies": { "@types/node": "16.9.1" } }, "sha512-PfJGVgIfKQJuq3s0tTDOKtztksibuUEbJQIYT3by6wctQo+Rdlh7ef4evJ5NCdxY4CfMbvFkocEwbl4BF8RlJw=="],
|
|
189
|
+
|
|
190
|
+
"jimp": ["jimp@1.6.0", "", { "dependencies": { "@jimp/core": "1.6.0", "@jimp/diff": "1.6.0", "@jimp/js-bmp": "1.6.0", "@jimp/js-gif": "1.6.0", "@jimp/js-jpeg": "1.6.0", "@jimp/js-png": "1.6.0", "@jimp/js-tiff": "1.6.0", "@jimp/plugin-blit": "1.6.0", "@jimp/plugin-blur": "1.6.0", "@jimp/plugin-circle": "1.6.0", "@jimp/plugin-color": "1.6.0", "@jimp/plugin-contain": "1.6.0", "@jimp/plugin-cover": "1.6.0", "@jimp/plugin-crop": "1.6.0", "@jimp/plugin-displace": "1.6.0", "@jimp/plugin-dither": "1.6.0", "@jimp/plugin-fisheye": "1.6.0", "@jimp/plugin-flip": "1.6.0", "@jimp/plugin-hash": "1.6.0", "@jimp/plugin-mask": "1.6.0", "@jimp/plugin-print": "1.6.0", "@jimp/plugin-quantize": "1.6.0", "@jimp/plugin-resize": "1.6.0", "@jimp/plugin-rotate": "1.6.0", "@jimp/plugin-threshold": "1.6.0", "@jimp/types": "1.6.0", "@jimp/utils": "1.6.0" } }, "sha512-YcwCHw1kiqEeI5xRpDlPPBGL2EOpBKLwO4yIBJcXWHPj5PnA5urGq0jbyhM5KoNpypQ6VboSoxc9D8HyfvngSg=="],
|
|
191
|
+
|
|
192
|
+
"jpeg-js": ["jpeg-js@0.4.4", "", {}, "sha512-WZzeDOEtTOBK4Mdsar0IqEU5sMr3vSV2RqkAIzUEV2BHnUfKGyswWFPFwK5EeDo93K3FohSHbLAjj0s1Wzd+dg=="],
|
|
193
|
+
|
|
194
|
+
"lodash": ["lodash@4.18.1", "", {}, "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q=="],
|
|
195
|
+
|
|
196
|
+
"lodash.snakecase": ["lodash.snakecase@4.1.1", "", {}, "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw=="],
|
|
197
|
+
|
|
198
|
+
"magic-bytes.js": ["magic-bytes.js@1.13.0", "", {}, "sha512-afO2mnxW7GDTXMm5/AoN1WuOcdoKhtgXjIvHmobqTD1grNplhGdv3PFOyjCVmrnOZBIT/gD/koDKpYG+0mvHcg=="],
|
|
199
|
+
|
|
200
|
+
"marked": ["marked@17.0.1", "", { "bin": { "marked": "bin/marked.js" } }, "sha512-boeBdiS0ghpWcSwoNm/jJBwdpFaMnZWRzjA6SkUMYb40SVaN1x7mmfGKp0jvexGcx+7y2La5zRZsYFZI6Qpypg=="],
|
|
201
|
+
|
|
202
|
+
"mime": ["mime@3.0.0", "", { "bin": { "mime": "cli.js" } }, "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A=="],
|
|
203
|
+
|
|
204
|
+
"omggif": ["omggif@1.0.10", "", {}, "sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw=="],
|
|
205
|
+
|
|
206
|
+
"pako": ["pako@1.0.11", "", {}, "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw=="],
|
|
207
|
+
|
|
208
|
+
"parse-bmfont-ascii": ["parse-bmfont-ascii@1.0.6", "", {}, "sha512-U4RrVsUFCleIOBsIGYOMKjn9PavsGOXxbvYGtMOEfnId0SVNsgehXh1DxUdVPLoxd5mvcEtvmKs2Mmf0Mpa1ZA=="],
|
|
209
|
+
|
|
210
|
+
"parse-bmfont-binary": ["parse-bmfont-binary@1.0.6", "", {}, "sha512-GxmsRea0wdGdYthjuUeWTMWPqm2+FAd4GI8vCvhgJsFnoGhTrLhXDDupwTo7rXVAgaLIGoVHDZS9p/5XbSqeWA=="],
|
|
211
|
+
|
|
212
|
+
"parse-bmfont-xml": ["parse-bmfont-xml@1.1.6", "", { "dependencies": { "xml-parse-from-string": "^1.0.0", "xml2js": "^0.5.0" } }, "sha512-0cEliVMZEhrFDwMh4SxIyVJpqYoOWDJ9P895tFuS+XuNzI5UBmBk5U5O4KuJdTnZpSBI4LFA2+ZiJaiwfSwlMA=="],
|
|
213
|
+
|
|
214
|
+
"peek-readable": ["peek-readable@4.1.0", "", {}, "sha512-ZI3LnwUv5nOGbQzD9c2iDG6toheuXSZP5esSHBjopsXH4dg19soufvpUGA3uohi5anFtGb2lhAVdHzH6R/Evvg=="],
|
|
215
|
+
|
|
216
|
+
"pixelmatch": ["pixelmatch@5.3.0", "", { "dependencies": { "pngjs": "^6.0.0" }, "bin": { "pixelmatch": "bin/pixelmatch" } }, "sha512-o8mkY4E/+LNUf6LzX96ht6k6CEDi65k9G2rjMtBe9Oo+VPKSvl+0GKHuH/AlG+GA5LPG/i5hrekkxUc3s2HU+Q=="],
|
|
217
|
+
|
|
218
|
+
"planck": ["planck@1.5.0", "", { "peerDependencies": { "stage-js": "^1.0.0-alpha.12" } }, "sha512-dlvqJE+FscZgrGUXJ5ybd0o5bvZ5XXyZNbm08xGsXp9WjXeAyWSFT6n9s/1PQcUBo4546fDXA5RMA4wbDyZw6g=="],
|
|
219
|
+
|
|
220
|
+
"pngjs": ["pngjs@7.0.0", "", {}, "sha512-LKWqWJRhstyYo9pGvgor/ivk2w94eSjE3RGVuzLGlr3NmD8bf7RcYGze1mNdEHRP6TRP6rMuDHk5t44hnTRyow=="],
|
|
221
|
+
|
|
222
|
+
"process": ["process@0.11.10", "", {}, "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A=="],
|
|
223
|
+
|
|
224
|
+
"readable-stream": ["readable-stream@4.7.0", "", { "dependencies": { "abort-controller": "^3.0.0", "buffer": "^6.0.3", "events": "^3.3.0", "process": "^0.11.10", "string_decoder": "^1.3.0" } }, "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg=="],
|
|
225
|
+
|
|
226
|
+
"readable-web-to-node-stream": ["readable-web-to-node-stream@3.0.4", "", { "dependencies": { "readable-stream": "^4.7.0" } }, "sha512-9nX56alTf5bwXQ3ZDipHJhusu9NTQJ/CVPtb/XHAJCXihZeitfJvIRS4GqQ/mfIoOE3IelHMrpayVrosdHBuLw=="],
|
|
227
|
+
|
|
228
|
+
"readdirp": ["readdirp@4.1.2", "", {}, "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg=="],
|
|
229
|
+
|
|
230
|
+
"safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="],
|
|
231
|
+
|
|
232
|
+
"sax": ["sax@1.6.0", "", {}, "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA=="],
|
|
233
|
+
|
|
234
|
+
"simple-xml-to-json": ["simple-xml-to-json@1.2.7", "", {}, "sha512-mz9VXphOxQWX3eQ/uXCtm6upltoN0DLx8Zb5T4TFC4FHB7S9FDPGre8CfLWqPWQQH/GrQYd2AXhhVM5LDpYx6Q=="],
|
|
235
|
+
|
|
236
|
+
"stage-js": ["stage-js@1.0.2", "", {}, "sha512-EWTRBYlg7Qv9wGUao99/PfRe3KaiQqWmgSvTOXvaWnu1Jk/q/vV8yJVu6bi/3EqDZeMVnCPAjheba6OFc5k1GQ=="],
|
|
237
|
+
|
|
238
|
+
"string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="],
|
|
239
|
+
|
|
240
|
+
"string_decoder": ["string_decoder@1.3.0", "", { "dependencies": { "safe-buffer": "~5.2.0" } }, "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA=="],
|
|
241
|
+
|
|
242
|
+
"strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="],
|
|
243
|
+
|
|
244
|
+
"strtok3": ["strtok3@6.3.0", "", { "dependencies": { "@tokenizer/token": "^0.3.0", "peek-readable": "^4.1.0" } }, "sha512-fZtbhtvI9I48xDSywd/somNqgUHl2L2cstmXCCif0itOf96jeW18MBSyrLuNicYQVkvpOxkZtkzujiTJ9LW5Jw=="],
|
|
245
|
+
|
|
246
|
+
"three": ["three@0.177.0", "", {}, "sha512-EiXv5/qWAaGI+Vz2A+JfavwYCMdGjxVsrn3oBwllUoqYeaBO75J63ZfyaQKoiLrqNHoTlUc6PFgMXnS0kI45zg=="],
|
|
247
|
+
|
|
248
|
+
"tinycolor2": ["tinycolor2@1.6.0", "", {}, "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw=="],
|
|
249
|
+
|
|
250
|
+
"token-types": ["token-types@4.2.1", "", { "dependencies": { "@tokenizer/token": "^0.3.0", "ieee754": "^1.2.1" } }, "sha512-6udB24Q737UD/SDsKAHI9FCRP7Bqc9D/MQUV02ORQg5iskjtLJlZJNdN4kKtcdtwCeWIwIHDGaUsTsCCAa8sFQ=="],
|
|
251
|
+
|
|
252
|
+
"ts-mixer": ["ts-mixer@6.0.4", "", {}, "sha512-ufKpbmrugz5Aou4wcr5Wc1UUFWOLhq+Fm6qa6P0w0K5Qw2yhaUoiWszhCVuNQyNwrlGiscHOmqYoAox1PtvgjA=="],
|
|
253
|
+
|
|
254
|
+
"tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="],
|
|
255
|
+
|
|
256
|
+
"typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="],
|
|
257
|
+
|
|
258
|
+
"undici": ["undici@6.24.1", "", {}, "sha512-sC+b0tB1whOCzbtlx20fx3WgCXwkW627p4EA9uM+/tNNPkSS+eSEld6pAs9nDv7WbY1UUljBMYPtu9BCOrCWKA=="],
|
|
259
|
+
|
|
260
|
+
"undici-types": ["undici-types@6.21.0", "", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="],
|
|
261
|
+
|
|
262
|
+
"utif2": ["utif2@4.1.0", "", { "dependencies": { "pako": "^1.0.11" } }, "sha512-+oknB9FHrJ7oW7A2WZYajOcv4FcDR4CfoGB0dPNfxbi4GO05RRnFmt5oa23+9w32EanrYcSJWspUiJkLMs+37w=="],
|
|
263
|
+
|
|
264
|
+
"web-tree-sitter": ["web-tree-sitter@0.25.10", "", { "peerDependencies": { "@types/emscripten": "^1.40.0" }, "optionalPeers": ["@types/emscripten"] }, "sha512-Y09sF44/13XvgVKgO2cNDw5rGk6s26MgoZPXLESvMXeefBf7i6/73eFurre0IsTW6E14Y0ArIzhUMmjoc7xyzA=="],
|
|
265
|
+
|
|
266
|
+
"ws": ["ws@8.21.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g=="],
|
|
267
|
+
|
|
268
|
+
"xml-parse-from-string": ["xml-parse-from-string@1.0.1", "", {}, "sha512-ErcKwJTF54uRzzNMXq2X5sMIy88zJvfN2DmdoQvy7PAFJ+tPRU6ydWuOKNMyfmOjdyBQTFREi60s0Y0SyI0G0g=="],
|
|
269
|
+
|
|
270
|
+
"xml2js": ["xml2js@0.5.0", "", { "dependencies": { "sax": ">=0.6.0", "xmlbuilder": "~11.0.0" } }, "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA=="],
|
|
271
|
+
|
|
272
|
+
"xmlbuilder": ["xmlbuilder@11.0.1", "", {}, "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA=="],
|
|
273
|
+
|
|
274
|
+
"yoga-layout": ["yoga-layout@3.2.1", "", {}, "sha512-0LPOt3AxKqMdFBZA3HBAt/t/8vIKq7VaQYbuA8WxCgung+p9TVyKRYdpvCb80HcdTN2NkbIKbhNwKUfm3tQywQ=="],
|
|
275
|
+
|
|
276
|
+
"zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="],
|
|
277
|
+
|
|
278
|
+
"@discordjs/rest/@discordjs/collection": ["@discordjs/collection@2.1.1", "", {}, "sha512-LiSusze9Tc7qF03sLCujF5iZp7K+vRNEDBZ86FT9aQAv3vxMLihUvKvpsCWiQ2DJq1tVckopKm1rxomgNUc9hg=="],
|
|
279
|
+
|
|
280
|
+
"@discordjs/rest/@sapphire/snowflake": ["@sapphire/snowflake@3.5.5", "", {}, "sha512-xzvBr1Q1c4lCe7i6sRnrofxeO1QTP/LKQ6A6qy0iB4x5yfiSfARMEQEghojzTNALDTcv8En04qYNIco9/K9eZQ=="],
|
|
281
|
+
|
|
282
|
+
"@discordjs/ws/@discordjs/collection": ["@discordjs/collection@2.1.1", "", {}, "sha512-LiSusze9Tc7qF03sLCujF5iZp7K+vRNEDBZ86FT9aQAv3vxMLihUvKvpsCWiQ2DJq1tVckopKm1rxomgNUc9hg=="],
|
|
283
|
+
|
|
284
|
+
"image-q/@types/node": ["@types/node@16.9.1", "", {}, "sha512-QpLcX9ZSsq3YYUUnD3nFDY8H7wctAhQj/TFKL8Ya8v5fMm3CFXxo8zStsLAl780ltoYoo1WvKUVGBQK+1ifr7g=="],
|
|
285
|
+
|
|
286
|
+
"pixelmatch/pngjs": ["pngjs@6.0.0", "", {}, "sha512-TRzzuFRRmEoSW/p1KVAmiOgPco2Irlah+bGFCeNfJXxxYGwSw7YwAOAcd7X28K/m5bjBWKsC29KyoMfHbypayg=="],
|
|
287
|
+
}
|
|
288
|
+
}
|