@fungi.computer/shiitake-extensions 0.0.2 → 0.1.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.
Files changed (66) hide show
  1. package/README.md +43 -13
  2. package/dist/almanac/contract.d.ts +94 -0
  3. package/dist/almanac/contract.js +71 -5
  4. package/dist/goal/client.d.ts +5 -2
  5. package/dist/goal/client.js +66 -72
  6. package/dist/goal/contract.d.ts +181 -64
  7. package/dist/goal/contract.js +102 -12
  8. package/dist/goal/host.js +206 -124
  9. package/dist/home/contract.d.ts +18 -0
  10. package/dist/home/contract.js +24 -3
  11. package/dist/home/host.d.ts +3 -0
  12. package/dist/home/host.js +1 -2
  13. package/dist/home/routing.js +13 -24
  14. package/dist/internal/history.d.ts +16 -0
  15. package/dist/internal/history.js +8 -0
  16. package/dist/loop/client.d.ts +1 -1
  17. package/dist/loop/client.js +28 -34
  18. package/dist/loop/contract.d.ts +129 -84
  19. package/dist/loop/contract.js +79 -9
  20. package/dist/loop/host.d.ts +1 -0
  21. package/dist/loop/host.js +89 -48
  22. package/dist/plan/client.d.ts +1 -1
  23. package/dist/plan/contract.d.ts +33 -0
  24. package/dist/plan/contract.js +28 -3
  25. package/dist/plan/host.js +12 -7
  26. package/dist/question/client.d.ts +1 -1
  27. package/dist/question/contract.d.ts +158 -0
  28. package/dist/question/contract.js +92 -7
  29. package/dist/question/host.js +34 -20
  30. package/dist/roster/conversation-agents.d.ts +31 -0
  31. package/dist/roster/conversation-agents.js +114 -0
  32. package/dist/roster.js +1 -0
  33. package/dist/skills/host.d.ts +1 -0
  34. package/dist/skills/host.js +22 -17
  35. package/dist/skills/source.d.ts +34 -0
  36. package/dist/subagents/client.d.ts +1 -1
  37. package/dist/subagents/client.js +43 -12
  38. package/dist/subagents/contract.d.ts +46 -8
  39. package/dist/subagents/contract.js +38 -8
  40. package/dist/subagents/host.d.ts +20 -8
  41. package/dist/subagents/host.js +58 -12
  42. package/docs/api/README.md +35 -0
  43. package/docs/api/almanac/contract.md +90 -0
  44. package/docs/api/almanac/host.md +19 -0
  45. package/docs/api/goal/client.md +26 -0
  46. package/docs/api/goal/contract.md +247 -0
  47. package/docs/api/goal/host.md +29 -0
  48. package/docs/api/home/contract.md +58 -0
  49. package/docs/api/home/host.md +55 -0
  50. package/docs/api/loop/client.md +25 -0
  51. package/docs/api/loop/contract.md +161 -0
  52. package/docs/api/loop/host.md +30 -0
  53. package/docs/api/plan/client.md +26 -0
  54. package/docs/api/plan/contract.md +163 -0
  55. package/docs/api/plan/host.md +19 -0
  56. package/docs/api/question/client.md +25 -0
  57. package/docs/api/question/contract.md +377 -0
  58. package/docs/api/question/host.md +19 -0
  59. package/docs/api/roster/conversation-agents.md +80 -0
  60. package/docs/api/roster.md +40 -0
  61. package/docs/api/skills/host.md +39 -0
  62. package/docs/api/skills/source.md +104 -0
  63. package/docs/api/subagents/client.md +26 -0
  64. package/docs/api/subagents/contract.md +131 -0
  65. package/docs/api/subagents/host.md +115 -0
  66. package/package.json +14 -8
@@ -0,0 +1,19 @@
1
+ <!-- Generated by Botanical API docs (TypeDoc + typedoc-plugin-markdown). Do not edit. -->
2
+
3
+ [**@fungi.computer/shiitake-extensions**](../README.md)
4
+
5
+ ---
6
+
7
+ [@fungi.computer/shiitake-extensions](../README.md) / question/host
8
+
9
+ # question/host
10
+
11
+ ## Variables
12
+
13
+ ### questionExtension
14
+
15
+ ```ts
16
+ const questionExtension: RosteredExtensionV0;
17
+ ```
18
+
19
+ One durable question owner over the ordinary extension doors.
@@ -0,0 +1,80 @@
1
+ <!-- Generated by Botanical API docs (TypeDoc + typedoc-plugin-markdown). Do not edit. -->
2
+
3
+ [**@fungi.computer/shiitake-extensions**](../README.md)
4
+
5
+ ---
6
+
7
+ [@fungi.computer/shiitake-extensions](../README.md) / roster/conversation-agents
8
+
9
+ # roster/conversation-agents
10
+
11
+ ## Functions
12
+
13
+ ### assertOrdinaryAgentCreation()
14
+
15
+ ```ts
16
+ function assertOrdinaryAgentCreation(input): void;
17
+ ```
18
+
19
+ Host-pack creation admission; attachments/model selection retain their own
20
+ owners.
21
+
22
+ #### Parameters
23
+
24
+ | Parameter | Type |
25
+ | --------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
26
+ | `input` | `Readonly`\<\{ `requestId`: `string`; `name?`: `string`; `model?`: \{ `providerId`: `string`; `modelId`: `string`; `reasoning?`: `"minimal"` \| `"low"` \| `"medium"` \| `"high"` \| `"xhigh"` \| `"max"`; \}; `extensions?`: readonly `string`[]; \}\> |
27
+
28
+ #### Returns
29
+
30
+ `void`
31
+
32
+ ---
33
+
34
+ ### createConversationAgents()
35
+
36
+ ```ts
37
+ function createConversationAgents(storage): object;
38
+ ```
39
+
40
+ This host's own record of the Agents each conversation created or sent accepted
41
+ work to, written as its Agent-control directory accepts them (Wiki:
42
+ agent-runtime-tools-and-clients, read-only sub-agent view). It feeds the footer
43
+ only; it owns no relationship and grants nothing.
44
+
45
+ #### Parameters
46
+
47
+ | Parameter | Type |
48
+ | --------- | --------------------- |
49
+ | `storage` | `WatchdogSqliteOwner` |
50
+
51
+ #### Returns
52
+
53
+ | Name | Type | Description |
54
+ | ------------- | ------------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------- |
55
+ | `recording()` | (`parentSessionId`, `directory`) => `AgentControlDirectory` | Bind acceptance recording to this conversation's existing directory. One conversation's directory: its accepted creates and sends are recorded. |
56
+ | `control()` | (`directoryFor`) => `CapabilitySource` | Agent-control tools bound to the conversation that acquires them. |
57
+ | `source()` | (`directory`) => [`SubagentSource`](../subagents/host.md#subagentsource) | The footer rows for one conversation; archived and unknown Agents leave it. |
58
+
59
+ ---
60
+
61
+ ### oysterAgentExtensions()
62
+
63
+ ```ts
64
+ function oysterAgentExtensions(source): object;
65
+ ```
66
+
67
+ Both hosts compose the ordinary roster and its read-only created-Agent footer.
68
+
69
+ #### Parameters
70
+
71
+ | Parameter | Type |
72
+ | --------- | ------------------------------------------------------- |
73
+ | `source` | [`SubagentSource`](../subagents/host.md#subagentsource) |
74
+
75
+ #### Returns
76
+
77
+ | Name | Type | Description |
78
+ | -------- | --------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------ |
79
+ | `roster` | `RosteredExtensionV0`[] | Ordinary extensions plus the read-only created-Agent footer. |
80
+ | `grants` | `Readonly`\<\{ `id`: `string` & `Brand`\<`"ExtensionId"`\>; `capabilities`: readonly `ExtensionCapabilityV0`[]; `grantKey?`: `string`; \}\>[] | Host grants corresponding to the composed extension roster. |
@@ -0,0 +1,40 @@
1
+ <!-- Generated by Botanical API docs (TypeDoc + typedoc-plugin-markdown). Do not edit. -->
2
+
3
+ [**@fungi.computer/shiitake-extensions**](README.md)
4
+
5
+ ---
6
+
7
+ [@fungi.computer/shiitake-extensions](README.md) / roster
8
+
9
+ # roster
10
+
11
+ ## Variables
12
+
13
+ ### botanicalAgentExtensions
14
+
15
+ ```ts
16
+ const botanicalAgentExtensions: ExtensionRosterV0;
17
+ ```
18
+
19
+ Botanical's product roster with explicit grants. Hub and Local pass this same
20
+ value; a stranger host passes its own (or an empty) roster.
21
+
22
+ ## Functions
23
+
24
+ ### botanicalExtensionsWithSkills()
25
+
26
+ ```ts
27
+ function botanicalExtensionsWithSkills(source): ExtensionRosterV0;
28
+ ```
29
+
30
+ A host with a SkillSource grants read-only skill discovery for its own runs.
31
+
32
+ #### Parameters
33
+
34
+ | Parameter | Type |
35
+ | --------- | --------------------------------------------- |
36
+ | `source` | [`SkillSource`](skills/source.md#skillsource) |
37
+
38
+ #### Returns
39
+
40
+ `ExtensionRosterV0`
@@ -0,0 +1,39 @@
1
+ <!-- Generated by Botanical API docs (TypeDoc + typedoc-plugin-markdown). Do not edit. -->
2
+
3
+ [**@fungi.computer/shiitake-extensions**](../README.md)
4
+
5
+ ---
6
+
7
+ [@fungi.computer/shiitake-extensions](../README.md) / skills/host
8
+
9
+ # skills/host
10
+
11
+ ## Variables
12
+
13
+ ### skillsGrant
14
+
15
+ ```ts
16
+ const skillsGrant: ExtensionGrantV0;
17
+ ```
18
+
19
+ Host admission for skill discovery prompts, load tools and human controls.
20
+
21
+ ## Functions
22
+
23
+ ### skillsExtension()
24
+
25
+ ```ts
26
+ function skillsExtension(__namedParameters): RosteredExtensionV0;
27
+ ```
28
+
29
+ Skills use only the generic prompt and run-tools doors; the host owns files.
30
+
31
+ #### Parameters
32
+
33
+ | Parameter | Type |
34
+ | ------------------- | --------------------------------------------------------------------- |
35
+ | `__namedParameters` | `Readonly`\<\{ `source`: [`SkillSource`](source.md#skillsource); \}\> |
36
+
37
+ #### Returns
38
+
39
+ `RosteredExtensionV0`
@@ -0,0 +1,104 @@
1
+ <!-- Generated by Botanical API docs (TypeDoc + typedoc-plugin-markdown). Do not edit. -->
2
+
3
+ [**@fungi.computer/shiitake-extensions**](../README.md)
4
+
5
+ ---
6
+
7
+ [@fungi.computer/shiitake-extensions](../README.md) / skills/source
8
+
9
+ # skills/source
10
+
11
+ ## Type Aliases
12
+
13
+ ### SkillOrigin
14
+
15
+ ```ts
16
+ type SkillOrigin =
17
+ | Readonly<{
18
+ kind: "project" | "personal";
19
+ }>
20
+ | Readonly<{
21
+ kind: "extension";
22
+ extensionId: string;
23
+ }>;
24
+ ```
25
+
26
+ Where a skill folder came from: the work itself, the person, or an installed
27
+ extension.
28
+
29
+ ---
30
+
31
+ ### SkillDescription
32
+
33
+ ```ts
34
+ type SkillDescription = Readonly<{
35
+ name: string;
36
+ description: string;
37
+ location: string;
38
+ origin: SkillOrigin;
39
+ displayLocation: string;
40
+ }>;
41
+ ```
42
+
43
+ Host-owned discovery metadata; bodies are loaded only through skill.load.
44
+
45
+ ---
46
+
47
+ ### SkillDiagnostic
48
+
49
+ ```ts
50
+ type SkillDiagnostic = Readonly<{
51
+ path: string;
52
+ reason:
53
+ | "invalid"
54
+ | "collision"
55
+ | "unavailable"
56
+ | "bound"
57
+ | "warning"
58
+ | "skipped"
59
+ | "empty";
60
+ message: string;
61
+ cause: unknown;
62
+ }>;
63
+ ```
64
+
65
+ Safe discovery explanation, with the original cause kept separately for redacted
66
+ logs.
67
+
68
+ ---
69
+
70
+ ### SkillCatalog
71
+
72
+ ```ts
73
+ type SkillCatalog = Readonly<{
74
+ skills: readonly SkillDescription[];
75
+ diagnostics: readonly SkillDiagnostic[];
76
+ }>;
77
+ ```
78
+
79
+ Discovered skill descriptions and diagnostics from the same scan.
80
+
81
+ ---
82
+
83
+ ### SkillSource
84
+
85
+ ```ts
86
+ type SkillSource = Readonly<{
87
+ catalog: (signal) => Promise<SkillCatalog>;
88
+ read: (
89
+ name,
90
+ file,
91
+ signal,
92
+ ) => Promise<
93
+ Readonly<{
94
+ name: string;
95
+ file: string;
96
+ content: string;
97
+ baseDirectory: string;
98
+ supportingFiles: readonly string[];
99
+ }>
100
+ >;
101
+ }>;
102
+ ```
103
+
104
+ Read-only host port. The host owns frontmatter, discovery and containment.
@@ -0,0 +1,26 @@
1
+ <!-- Generated by Botanical API docs (TypeDoc + typedoc-plugin-markdown). Do not edit. -->
2
+
3
+ [**@fungi.computer/shiitake-extensions**](../README.md)
4
+
5
+ ---
6
+
7
+ [@fungi.computer/shiitake-extensions](../README.md) / subagents/client
8
+
9
+ # subagents/client
10
+
11
+ ## Variables
12
+
13
+ ### default
14
+
15
+ ```ts
16
+ default: Readonly<{
17
+ protocol: "shiitake.client/v1";
18
+ id: string & Brand<"ExtensionId">;
19
+ promptPresentation?: "footer";
20
+ attach?: (context) => Effect<void, Error, Scope>;
21
+ contribute?: (slot) => object;
22
+ }>;
23
+ ```
24
+
25
+ One footer row per sub-agent; opening a row shows its conversation beside this
26
+ one.
@@ -0,0 +1,131 @@
1
+ <!-- Generated by Botanical API docs (TypeDoc + typedoc-plugin-markdown). Do not edit. -->
2
+
3
+ [**@fungi.computer/shiitake-extensions**](../README.md)
4
+
5
+ ---
6
+
7
+ [@fungi.computer/shiitake-extensions](../README.md) / subagents/contract
8
+
9
+ # subagents/contract
10
+
11
+ ## Type Aliases
12
+
13
+ ### SubagentState
14
+
15
+ ```ts
16
+ type SubagentState = typeof SubagentState.Type;
17
+ ```
18
+
19
+ Display state of one created Agent's conversation.
20
+
21
+ ---
22
+
23
+ ### Subagent
24
+
25
+ ```ts
26
+ type Subagent = typeof Subagent.Type;
27
+ ```
28
+
29
+ Decoded footer row for a created Agent.
30
+
31
+ ---
32
+
33
+ ### SubagentsProjection
34
+
35
+ ```ts
36
+ type SubagentsProjection = typeof SubagentsProjection.Type;
37
+ ```
38
+
39
+ Decoded list and expansion state projected into the footer.
40
+
41
+ ## Variables
42
+
43
+ ### maximumSubagents
44
+
45
+ ```ts
46
+ const maximumSubagents: 16 = 16;
47
+ ```
48
+
49
+ The most Agents one conversation's footer lists; the rest are counted.
50
+
51
+ ---
52
+
53
+ ### SubagentState
54
+
55
+ ```ts
56
+ const SubagentState: Literals<
57
+ readonly ["working", "waiting", "idle", "failed", "unavailable"]
58
+ >;
59
+ ```
60
+
61
+ What the human sees for one ordinary created Agent. `waiting` is any open
62
+ attention on its conversation (a question or a tool approval); `unavailable`
63
+ means its status could not be read, and is never shown as idle.
64
+
65
+ ---
66
+
67
+ ### Subagent
68
+
69
+ ```ts
70
+ const Subagent: Struct<{
71
+ agentId: String;
72
+ name: String;
73
+ sessionId: NullOr<String>;
74
+ state: Literals<
75
+ readonly ["working", "waiting", "idle", "failed", "unavailable"]
76
+ >;
77
+ attention: optionalKey<String>;
78
+ }>;
79
+ ```
80
+
81
+ A footer row for an ordinary Agent created by this Agent, never merely sent
82
+ work.
83
+
84
+ ---
85
+
86
+ ### SubagentsProjection
87
+
88
+ ```ts
89
+ const SubagentsProjection: Struct<{
90
+ agents: $Array<
91
+ Struct<{
92
+ agentId: String;
93
+ name: String;
94
+ sessionId: NullOr<String>;
95
+ state: Literals<
96
+ readonly ["working", "waiting", "idle", "failed", "unavailable"]
97
+ >;
98
+ attention: optionalKey<String>;
99
+ }>
100
+ >;
101
+ more: Int;
102
+ expanded: Boolean;
103
+ }>;
104
+ ```
105
+
106
+ This Agent's created Agents and how many are not listed. `expanded` is whether
107
+ the footer lists each one; a person toggles it with `/agents`, and a collapsed
108
+ footer keeps one summary row.
109
+
110
+ ---
111
+
112
+ ### subagentsContract
113
+
114
+ ```ts
115
+ const subagentsContract: object;
116
+ ```
117
+
118
+ Created-Agent footer control and its visible projection.
119
+
120
+ #### Type Declaration
121
+
122
+ | Name | Type | Default value | Description |
123
+ | --------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------- | ---------------------------------------------------------------------- |
124
+ | <a id="property-id"></a> `id` | `string` & `Brand`\<`"ExtensionId"`\> | - | Stable extension identity. |
125
+ | <a id="property-commands"></a> `commands` | `object` | - | Human footer controls. |
126
+ | `commands.agents` | `object` | - | Toggle the created-Agent footer between expanded and summarized views. |
127
+ | `commands.agents.scope` | `"session"` | `"session"` | The Session owns its footer view. |
128
+ | `commands.agents.input` | `Struct`\<\{ \}\> | - | No additional arguments are required. |
129
+ | `commands.agents.output` | `declare`\<`WhistleCatalogStepV1`, `WhistleCatalogStepV1`\> | `CatalogStep` | Return the server-owned human control step. |
130
+ | <a id="property-projection"></a> `projection` | `object` | - | Footer rows and expansion state. |
131
+ | `projection.schema` | `Struct`\<\{ `agents`: `$Array`\<`Struct`\<\{ `agentId`: `String`; `name`: `String`; `sessionId`: `NullOr`\<`String`\>; `state`: `Literals`\<readonly \[`"working"`, `"waiting"`, `"idle"`, `"failed"`, `"unavailable"`\]\>; `attention`: `optionalKey`\<`String`\>; \}\>\>; `more`: `Int`; `expanded`: `Boolean`; \}\> | `SubagentsProjection` | Decoder for the projected footer. |
@@ -0,0 +1,115 @@
1
+ <!-- Generated by Botanical API docs (TypeDoc + typedoc-plugin-markdown). Do not edit. -->
2
+
3
+ [**@fungi.computer/shiitake-extensions**](../README.md)
4
+
5
+ ---
6
+
7
+ [@fungi.computer/shiitake-extensions](../README.md) / subagents/host
8
+
9
+ # subagents/host
10
+
11
+ ## Type Aliases
12
+
13
+ ### SubagentRecord
14
+
15
+ ```ts
16
+ type SubagentRecord = Readonly<{
17
+ agentId: string;
18
+ name: string;
19
+ sessionId: string | null;
20
+ }>;
21
+ ```
22
+
23
+ A footer row for an ordinary Agent created by the current Agent.
24
+
25
+ ---
26
+
27
+ ### SubagentAgent
28
+
29
+ ```ts
30
+ type SubagentAgent = Readonly<{
31
+ listSessions: ShiitakeAgent["listSessions"];
32
+ session: (sessionId) => Pick<ShiitakeSession, "read">;
33
+ }>;
34
+ ```
35
+
36
+ The two owner reads a status needs from one child Agent.
37
+
38
+ ---
39
+
40
+ ### SubagentSource
41
+
42
+ ```ts
43
+ type SubagentSource = Readonly<{
44
+ read: (
45
+ sessionId,
46
+ limit,
47
+ ) => Promise<
48
+ Readonly<{
49
+ agents: readonly SubagentRecord[];
50
+ more: number;
51
+ }>
52
+ >;
53
+ open: (
54
+ agentId,
55
+ signal,
56
+ ) => Promise<
57
+ Readonly<{
58
+ agent: SubagentAgent;
59
+ release: () => Promise<void>;
60
+ }>
61
+ >;
62
+ }>;
63
+ ```
64
+
65
+ The host's read-only facts. `read` returns ordinary created Agents, at most
66
+ `limit`, with a count of the rest; `open` is the host's existing per-operation
67
+ Agent access (an `AgentControlDirectory`'s `open` fits), and releasing it never
68
+ stops the Agent's work.
69
+
70
+ ---
71
+
72
+ ### SubagentTiming
73
+
74
+ ```ts
75
+ type SubagentTiming = Readonly<{
76
+ refreshMs: number;
77
+ pollMs: number;
78
+ interestMs: number;
79
+ }>;
80
+ ```
81
+
82
+ Private resource ceilings; none of them is product policy.
83
+
84
+ ## Variables
85
+
86
+ ### subagentsGrant
87
+
88
+ ```ts
89
+ const subagentsGrant: ExtensionGrantV0;
90
+ ```
91
+
92
+ Host admission for the read-only created-Agent footer and human toggle.
93
+
94
+ ## Functions
95
+
96
+ ### subagentsExtension()
97
+
98
+ ```ts
99
+ function subagentsExtension(options): RosteredExtensionV0;
100
+ ```
101
+
102
+ The read-only footer: ordinary Agents created by this Agent, one row each, with
103
+ their live status. It owns neither relationships nor durable state; the Agent
104
+ directory owns immutable creation attribution. Its one command, `/agents`, only
105
+ expands or collapses the footer rows.
106
+
107
+ #### Parameters
108
+
109
+ | Parameter | Type |
110
+ | --------- | ------------------------------------------------------------------------------------------------------------------ |
111
+ | `options` | `Readonly`\<\{ `source`: [`SubagentSource`](#subagentsource); `timing?`: [`SubagentTiming`](#subagenttiming); \}\> |
112
+
113
+ #### Returns
114
+
115
+ `RosteredExtensionV0`
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fungi.computer/shiitake-extensions",
3
- "version": "0.0.2",
3
+ "version": "0.1.1",
4
4
  "author": "Levi <levi@technomancy.dev>",
5
5
  "private": false,
6
6
  "description": "Botanical's product Shiitake extensions: goal, loop and Almanac on the generic extension surface",
@@ -46,6 +46,10 @@
46
46
  "types": "./dist/roster.d.ts",
47
47
  "import": "./dist/roster.js"
48
48
  },
49
+ "./roster/conversation-agents": {
50
+ "types": "./dist/roster/conversation-agents.d.ts",
51
+ "import": "./dist/roster/conversation-agents.js"
52
+ },
49
53
  "./plan": {
50
54
  "types": "./dist/plan/contract.d.ts",
51
55
  "import": "./dist/plan/contract.js"
@@ -97,20 +101,22 @@
97
101
  },
98
102
  "files": [
99
103
  "dist",
104
+ "docs/api",
100
105
  "README.md",
101
106
  "LICENSE"
102
107
  ],
103
108
  "dependencies": {
104
- "@fungi.computer/almanac": "0.1.0",
105
- "@fungi.computer/cairn": "0.0.1",
106
- "@fungi.computer/knapsack": "0.1.0",
107
- "@fungi.computer/mycelium": "0.1.0",
108
- "@fungi.computer/shiitake": "0.2.0",
109
- "@fungi.computer/whistle": "0.0.2",
109
+ "@fungi.computer/almanac": "0.2.0",
110
+ "@fungi.computer/cairn": "0.1.0",
111
+ "@fungi.computer/knapsack": "0.2.1",
112
+ "@fungi.computer/mycelium": "0.2.1",
113
+ "@fungi.computer/shiitake": "0.3.1",
114
+ "@fungi.computer/watchdog": "0.1.0",
115
+ "@fungi.computer/whistle": "0.1.0",
110
116
  "effect": "4.0.2",
111
117
  "papaparse": "5.7.0",
112
118
  "zod": "4.4.3",
113
- "@fungi.computer/gills": "0.1.0"
119
+ "@fungi.computer/gills": "0.2.0"
114
120
  },
115
121
  "license": "MIT",
116
122
  "repository": {