@maiaos/agent 0.1.0-canary.2

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 (187) hide show
  1. package/README.md +115 -0
  2. package/dist/auth/index.d.ts +3 -0
  3. package/dist/auth/index.d.ts.map +1 -0
  4. package/dist/auth/index.js +3 -0
  5. package/dist/auth/index.js.map +1 -0
  6. package/dist/auth/maia-auth.d.ts +23 -0
  7. package/dist/auth/maia-auth.d.ts.map +1 -0
  8. package/dist/auth/maia-auth.js +97 -0
  9. package/dist/auth/maia-auth.js.map +1 -0
  10. package/dist/auth/memory-credentials.d.ts +9 -0
  11. package/dist/auth/memory-credentials.d.ts.map +1 -0
  12. package/dist/auth/memory-credentials.js +23 -0
  13. package/dist/auth/memory-credentials.js.map +1 -0
  14. package/dist/extensions/goal/command.d.ts +28 -0
  15. package/dist/extensions/goal/command.d.ts.map +1 -0
  16. package/dist/extensions/goal/command.js +80 -0
  17. package/dist/extensions/goal/command.js.map +1 -0
  18. package/dist/extensions/goal/context.d.ts +24 -0
  19. package/dist/extensions/goal/context.d.ts.map +1 -0
  20. package/dist/extensions/goal/context.js +35 -0
  21. package/dist/extensions/goal/context.js.map +1 -0
  22. package/dist/extensions/goal/extension.d.ts +7 -0
  23. package/dist/extensions/goal/extension.d.ts.map +1 -0
  24. package/dist/extensions/goal/extension.js +179 -0
  25. package/dist/extensions/goal/extension.js.map +1 -0
  26. package/dist/extensions/goal/index.d.ts +2 -0
  27. package/dist/extensions/goal/index.d.ts.map +1 -0
  28. package/dist/extensions/goal/index.js +2 -0
  29. package/dist/extensions/goal/index.js.map +1 -0
  30. package/dist/extensions/goal/section.d.ts +22 -0
  31. package/dist/extensions/goal/section.d.ts.map +1 -0
  32. package/dist/extensions/goal/section.js +49 -0
  33. package/dist/extensions/goal/section.js.map +1 -0
  34. package/dist/extensions/process/extension.d.ts +3 -0
  35. package/dist/extensions/process/extension.d.ts.map +1 -0
  36. package/dist/extensions/process/extension.js +79 -0
  37. package/dist/extensions/process/extension.js.map +1 -0
  38. package/dist/extensions/process/index.d.ts +2 -0
  39. package/dist/extensions/process/index.d.ts.map +1 -0
  40. package/dist/extensions/process/index.js +2 -0
  41. package/dist/extensions/process/index.js.map +1 -0
  42. package/dist/extensions/process/manager.d.ts +30 -0
  43. package/dist/extensions/process/manager.d.ts.map +1 -0
  44. package/dist/extensions/process/manager.js +156 -0
  45. package/dist/extensions/process/manager.js.map +1 -0
  46. package/dist/extensions/prompt-section/index.d.ts +2 -0
  47. package/dist/extensions/prompt-section/index.d.ts.map +1 -0
  48. package/dist/extensions/prompt-section/index.js +2 -0
  49. package/dist/extensions/prompt-section/index.js.map +1 -0
  50. package/dist/extensions/prompt-section/prompt-section.d.ts +26 -0
  51. package/dist/extensions/prompt-section/prompt-section.d.ts.map +1 -0
  52. package/dist/extensions/prompt-section/prompt-section.js +28 -0
  53. package/dist/extensions/prompt-section/prompt-section.js.map +1 -0
  54. package/dist/extensions/safety/command-wrappers.d.ts +31 -0
  55. package/dist/extensions/safety/command-wrappers.d.ts.map +1 -0
  56. package/dist/extensions/safety/command-wrappers.js +247 -0
  57. package/dist/extensions/safety/command-wrappers.js.map +1 -0
  58. package/dist/extensions/safety/destructive-guard.d.ts +24 -0
  59. package/dist/extensions/safety/destructive-guard.d.ts.map +1 -0
  60. package/dist/extensions/safety/destructive-guard.js +178 -0
  61. package/dist/extensions/safety/destructive-guard.js.map +1 -0
  62. package/dist/extensions/safety/index.d.ts +3 -0
  63. package/dist/extensions/safety/index.d.ts.map +1 -0
  64. package/dist/extensions/safety/index.js +3 -0
  65. package/dist/extensions/safety/index.js.map +1 -0
  66. package/dist/extensions/safety/lifecycle.d.ts +3 -0
  67. package/dist/extensions/safety/lifecycle.d.ts.map +1 -0
  68. package/dist/extensions/safety/lifecycle.js +92 -0
  69. package/dist/extensions/safety/lifecycle.js.map +1 -0
  70. package/dist/extensions/safety/shell-tokens.d.ts +13 -0
  71. package/dist/extensions/safety/shell-tokens.d.ts.map +1 -0
  72. package/dist/extensions/safety/shell-tokens.js +115 -0
  73. package/dist/extensions/safety/shell-tokens.js.map +1 -0
  74. package/dist/extensions/search/bounds.d.ts +22 -0
  75. package/dist/extensions/search/bounds.d.ts.map +1 -0
  76. package/dist/extensions/search/bounds.js +35 -0
  77. package/dist/extensions/search/bounds.js.map +1 -0
  78. package/dist/extensions/search/extension.d.ts +7 -0
  79. package/dist/extensions/search/extension.d.ts.map +1 -0
  80. package/dist/extensions/search/extension.js +18 -0
  81. package/dist/extensions/search/extension.js.map +1 -0
  82. package/dist/extensions/search/index.d.ts +2 -0
  83. package/dist/extensions/search/index.d.ts.map +1 -0
  84. package/dist/extensions/search/index.js +2 -0
  85. package/dist/extensions/search/index.js.map +1 -0
  86. package/dist/extensions/tasks/context.d.ts +20 -0
  87. package/dist/extensions/tasks/context.d.ts.map +1 -0
  88. package/dist/extensions/tasks/context.js +36 -0
  89. package/dist/extensions/tasks/context.js.map +1 -0
  90. package/dist/extensions/tasks/extension.d.ts +7 -0
  91. package/dist/extensions/tasks/extension.d.ts.map +1 -0
  92. package/dist/extensions/tasks/extension.js +178 -0
  93. package/dist/extensions/tasks/extension.js.map +1 -0
  94. package/dist/extensions/tasks/index.d.ts +2 -0
  95. package/dist/extensions/tasks/index.d.ts.map +1 -0
  96. package/dist/extensions/tasks/index.js +2 -0
  97. package/dist/extensions/tasks/index.js.map +1 -0
  98. package/dist/extensions/tasks/summary.d.ts +20 -0
  99. package/dist/extensions/tasks/summary.d.ts.map +1 -0
  100. package/dist/extensions/tasks/summary.js +50 -0
  101. package/dist/extensions/tasks/summary.js.map +1 -0
  102. package/dist/extensions/title/extension.d.ts +4 -0
  103. package/dist/extensions/title/extension.d.ts.map +1 -0
  104. package/dist/extensions/title/extension.js +37 -0
  105. package/dist/extensions/title/extension.js.map +1 -0
  106. package/dist/extensions/title/index.d.ts +2 -0
  107. package/dist/extensions/title/index.d.ts.map +1 -0
  108. package/dist/extensions/title/index.js +2 -0
  109. package/dist/extensions/title/index.js.map +1 -0
  110. package/dist/extensions/title/title.d.ts +9 -0
  111. package/dist/extensions/title/title.d.ts.map +1 -0
  112. package/dist/extensions/title/title.js +92 -0
  113. package/dist/extensions/title/title.js.map +1 -0
  114. package/dist/home/index.d.ts +2 -0
  115. package/dist/home/index.d.ts.map +1 -0
  116. package/dist/home/index.js +2 -0
  117. package/dist/home/index.js.map +1 -0
  118. package/dist/home/maia-home.d.ts +17 -0
  119. package/dist/home/maia-home.d.ts.map +1 -0
  120. package/dist/home/maia-home.js +84 -0
  121. package/dist/home/maia-home.js.map +1 -0
  122. package/dist/index.d.ts +9 -0
  123. package/dist/index.d.ts.map +1 -0
  124. package/dist/index.js +9 -0
  125. package/dist/index.js.map +1 -0
  126. package/dist/login/index.d.ts +2 -0
  127. package/dist/login/index.d.ts.map +1 -0
  128. package/dist/login/index.js +2 -0
  129. package/dist/login/index.js.map +1 -0
  130. package/dist/login/provider-login.d.ts +43 -0
  131. package/dist/login/provider-login.d.ts.map +1 -0
  132. package/dist/login/provider-login.js +153 -0
  133. package/dist/login/provider-login.js.map +1 -0
  134. package/dist/managed-worker/index.d.ts +2 -0
  135. package/dist/managed-worker/index.d.ts.map +1 -0
  136. package/dist/managed-worker/index.js +2 -0
  137. package/dist/managed-worker/index.js.map +1 -0
  138. package/dist/managed-worker/main.d.ts +3 -0
  139. package/dist/managed-worker/main.d.ts.map +1 -0
  140. package/dist/managed-worker/main.js +315693 -0
  141. package/dist/managed-worker/main.js.map +1 -0
  142. package/dist/managed-worker/main.meta.json +1 -0
  143. package/dist/managed-worker/operation-channel.d.ts +24 -0
  144. package/dist/managed-worker/operation-channel.d.ts.map +1 -0
  145. package/dist/managed-worker/operation-channel.js +145 -0
  146. package/dist/managed-worker/operation-channel.js.map +1 -0
  147. package/dist/managed-worker/protocol.d.ts +76 -0
  148. package/dist/managed-worker/protocol.d.ts.map +1 -0
  149. package/dist/managed-worker/protocol.js +318 -0
  150. package/dist/managed-worker/protocol.js.map +1 -0
  151. package/dist/managed-worker/worker.d.ts +38 -0
  152. package/dist/managed-worker/worker.d.ts.map +1 -0
  153. package/dist/managed-worker/worker.js +437 -0
  154. package/dist/managed-worker/worker.js.map +1 -0
  155. package/dist/resources/index.d.ts +2 -0
  156. package/dist/resources/index.d.ts.map +1 -0
  157. package/dist/resources/index.js +2 -0
  158. package/dist/resources/index.js.map +1 -0
  159. package/dist/resources/resources.d.ts +21 -0
  160. package/dist/resources/resources.d.ts.map +1 -0
  161. package/dist/resources/resources.js +198 -0
  162. package/dist/resources/resources.js.map +1 -0
  163. package/dist/runner/index.d.ts +2 -0
  164. package/dist/runner/index.d.ts.map +1 -0
  165. package/dist/runner/index.js +2 -0
  166. package/dist/runner/index.js.map +1 -0
  167. package/dist/runner/runner.d.ts +31 -0
  168. package/dist/runner/runner.d.ts.map +1 -0
  169. package/dist/runner/runner.js +346 -0
  170. package/dist/runner/runner.js.map +1 -0
  171. package/dist/runtime/index.d.ts +3 -0
  172. package/dist/runtime/index.d.ts.map +1 -0
  173. package/dist/runtime/index.js +3 -0
  174. package/dist/runtime/index.js.map +1 -0
  175. package/dist/runtime/kernel.d.ts +18 -0
  176. package/dist/runtime/kernel.d.ts.map +1 -0
  177. package/dist/runtime/kernel.js +23 -0
  178. package/dist/runtime/kernel.js.map +1 -0
  179. package/dist/runtime/runtime.d.ts +31 -0
  180. package/dist/runtime/runtime.d.ts.map +1 -0
  181. package/dist/runtime/runtime.js +124 -0
  182. package/dist/runtime/runtime.js.map +1 -0
  183. package/dist/runtime/startup-network-policy.d.ts +9 -0
  184. package/dist/runtime/startup-network-policy.d.ts.map +1 -0
  185. package/dist/runtime/startup-network-policy.js +25 -0
  186. package/dist/runtime/startup-network-policy.js.map +1 -0
  187. package/package.json +73 -0
package/README.md ADDED
@@ -0,0 +1,115 @@
1
+ # `@maiaos/agent`
2
+
3
+ [![npm canary](https://img.shields.io/npm/v/@maiaos/agent/canary?label=npm%20canary)](https://www.npmjs.com/package/@maiaos/agent)
4
+
5
+ Maia's own AI coding agent, `maia agent`, and the managed Pi worker that Maia
6
+ Node runs, both built on the official
7
+ [`@earendil-works/pi-coding-agent`](https://www.npmjs.com/package/@earendil-works/pi-coding-agent)
8
+ SDK.
9
+
10
+ `maia agent` is Pi rebranded for Maia, not a different agent interface: Pi
11
+ supplies the agent loop, models, providers, compaction, steering, TUI, sessions
12
+ and extensions. Maia adds Maia-owned paths and credentials, digest-pinned
13
+ project resources, a few reviewed built-ins, and the boundary to Maia Node. Use
14
+ it as an interactive coding agent, or embed the package when you build on the
15
+ same harness. It never invokes an installed `pi` executable or reads `~/.pi`.
16
+
17
+ ## Install
18
+
19
+ `maia agent` ships with the [`maia` CLI](../../apps/cli/README.md). The library
20
+ is published for installation testing:
21
+
22
+ ```sh
23
+ pnpm add @maiaos/agent@canary
24
+ ```
25
+
26
+ Canary builds are not release-qualified and can lag the source; npm's
27
+ automatic `latest` tag also points at a canary build.
28
+
29
+ ## Example
30
+
31
+ ```sh
32
+ maia agent # interactive session; type /login to sign in
33
+ maia agent --print --no-session -- "Explain this repository"
34
+ maia agent --json-events --no-session -- "Review the current diff"
35
+ maia agent -e <path-to-extension.ts> # load one extension explicitly
36
+ maia agent extension digest <extension-path> # digest to pin in .maia/maia.json
37
+ ```
38
+
39
+ ## Key concepts
40
+
41
+ - **Pi extensions, unchanged.** Extensions use the upstream Pi API to register
42
+ tools, slash commands, CLI flags, shortcuts, renderers, providers and
43
+ lifecycle hooks. There is no Maia-specific plugin API.
44
+ - **Resources.** The agent loads project extensions only when they are listed
45
+ and digest-pinned in `.maia/maia.json`, then reviewed Maia built-ins. `-ne`
46
+ (`--no-extensions`) keeps Pi's meaning: skip discovered extensions, while an
47
+ explicit `-e` path still loads. Skills and `AGENTS.md` stay available.
48
+ - **Built-ins.** A destructive-command guard, bounds on Pi's `find` and
49
+ `grep`, task and goal state keyed by the durable Maia Session, and
50
+ Session-owned background processes stopped at shutdown. Pi's `find` and
51
+ `grep` stay inactive. The standalone `maia agent` adds `/goal` and `/tasks`,
52
+ a bounded goal and open-task section in the system prompt, and a name for an
53
+ unnamed session taken from its first request.
54
+ - **Credentials.** Provider credentials live in Maia's `auth.json` under
55
+ `MAIA_HOME` (default `~/.maia`), one per provider; `maia login <provider>`
56
+ uses Pi's own sign-in. `MAIA_AGENT_HOME` moves only the agent directory.
57
+ - **Offline by default.** Every entry sets `PI_OFFLINE=1` and
58
+ `PI_SKIP_VERSION_CHECK=1`, which stop Pi's update, telemetry and tool
59
+ download traffic but not the model provider you select. Embed the package in
60
+ a process dedicated to the agent.
61
+ - **Managed worker.** The `maia-agent-worker` binary speaks a versioned,
62
+ bounded NDJSON protocol to Maia Node. It keeps Pi state in memory, receives
63
+ durable history from the Node, and holds a leased provider credential only in
64
+ memory.
65
+
66
+ Project extension code runs with the agent process's operating-system
67
+ permissions; review it before pinning its digest. Extensions cannot bypass the
68
+ Node's authorization, confirmation, compare-and-set, idempotency or receipts.
69
+
70
+ ## Status
71
+
72
+ `maia agent` and its built-ins are implemented source candidates. Running Maia
73
+ Agent as a general Node worker for swarms (bound Agent definitions with granted
74
+ tools) is planned; bound activation is denied today. `maia session attach`
75
+ (S12b) renders Codex Sessions; Pi Sessions join with S12c. Replacing
76
+ a full daily Pi harness is tracked as
77
+ [R11](../../docs/maia-agent/pi-harness-migration.md).
78
+
79
+ ## How it fits in Maia
80
+
81
+ The CLI runs `maia agent` locally without a Node. Maia Node launches
82
+ `maia-agent-worker` out of process for managed Pi Sessions and stays the
83
+ authority for Sessions, credential leases and receipts. Swarm scheduling,
84
+ account pools and recursive orchestration belong to Maia Node and Skills, not
85
+ to this package. See the [Agent architecture](../../docs/maia-agent/architecture.md).
86
+
87
+ ## Provenance
88
+
89
+ The destructive-command guard, the `find` and `grep` bounds, `/goal`, `/tasks`,
90
+ the goal and task prompt sections, session naming and the tool-metadata
91
+ contract test are reviewed ports from `vllnt/pi-config` at commit `b90808fb`
92
+ ([D-069](../../docs/decisions.md#d-069)); each file names its source in a
93
+ header comment, and the [port record](../../docs/maia-agent/pi-harness-port.md)
94
+ lists every source extension and where it belongs in Maia. The task, goal and
95
+ process tools are reduced Maia implementations informed by the reviewed
96
+ `pi-tasks`, `pi-goal` and `pi-daemon` contracts.
97
+
98
+ ## Development
99
+
100
+ ```sh
101
+ pnpm --filter @maiaos/agent build
102
+ pnpm --filter @maiaos/agent lint
103
+ pnpm --filter @maiaos/agent typecheck
104
+ pnpm --filter @maiaos/agent test
105
+ ```
106
+
107
+ ## Documentation
108
+
109
+ - [Maia Agent architecture](../../docs/maia-agent/architecture.md)
110
+ - [Pi harness migration (R11)](../../docs/maia-agent/pi-harness-migration.md)
111
+ - [Providers and login](../../docs/providers/architecture.md)
112
+
113
+ ## License
114
+
115
+ No license has been published yet. All rights reserved.
@@ -0,0 +1,3 @@
1
+ export { assertMaiaApiKey, isMaiaOAuthCredential, type MaiaAuthFile, type MaiaOAuthCredential, type MaiaProviderCredential, MAX_MAIA_API_KEY_BYTES, MAX_MAIA_AUTH_PROVIDERS, parseMaiaAuthFile, } from "./maia-auth.js";
2
+ export { createMemoryCredentials, type MaiaAgentProviderCredential, } from "./memory-credentials.js";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAChB,qBAAqB,EACrB,KAAK,YAAY,EACjB,KAAK,mBAAmB,EACxB,KAAK,sBAAsB,EAC3B,sBAAsB,EACtB,uBAAuB,EACvB,iBAAiB,GAClB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,uBAAuB,EACvB,KAAK,2BAA2B,GACjC,MAAM,yBAAyB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { assertMaiaApiKey, isMaiaOAuthCredential, MAX_MAIA_API_KEY_BYTES, MAX_MAIA_AUTH_PROVIDERS, parseMaiaAuthFile, } from "./maia-auth.js";
2
+ export { createMemoryCredentials, } from "./memory-credentials.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAChB,qBAAqB,EAIrB,sBAAsB,EACtB,uBAAuB,EACvB,iBAAiB,GAClB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,uBAAuB,GAExB,MAAM,yBAAyB,CAAC"}
@@ -0,0 +1,23 @@
1
+ export declare const MAX_MAIA_API_KEY_BYTES: number;
2
+ /** Pi's catalog lists about 40 providers; Maia keeps one credential per provider. */
3
+ export declare const MAX_MAIA_AUTH_PROVIDERS = 64;
4
+ export type MaiaOAuthCredential = {
5
+ readonly access: string;
6
+ readonly accountId?: string;
7
+ readonly expires: number;
8
+ readonly refresh: string;
9
+ readonly type: "oauth";
10
+ };
11
+ /** Pi stores a key, provider environment values (such as a region), both, or neither for ambient credentials. */
12
+ type MaiaApiKeyCredential = {
13
+ readonly env?: Readonly<Record<string, string>>;
14
+ readonly key?: string;
15
+ readonly type: "api_key";
16
+ };
17
+ export type MaiaProviderCredential = MaiaApiKeyCredential | MaiaOAuthCredential;
18
+ export type MaiaAuthFile = Readonly<Record<string, MaiaProviderCredential>>;
19
+ export declare const assertMaiaApiKey: (key: string) => string;
20
+ export declare const parseMaiaAuthFile: (text: string) => MaiaAuthFile;
21
+ export declare const isMaiaOAuthCredential: (value: MaiaProviderCredential) => value is MaiaOAuthCredential;
22
+ export {};
23
+ //# sourceMappingURL=maia-auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"maia-auth.d.ts","sourceRoot":"","sources":["../../src/auth/maia-auth.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,sBAAsB,QAAW,CAAC;AAC/C,qFAAqF;AACrF,eAAO,MAAM,uBAAuB,KAAK,CAAC;AAO1C,MAAM,MAAM,mBAAmB,GAAG;IAChC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;CACxB,CAAC;AAEF,iHAAiH;AACjH,KAAK,oBAAoB,GAAG;IAC1B,QAAQ,CAAC,GAAG,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAChD,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG,oBAAoB,GAAG,mBAAmB,CAAC;AAEhF,MAAM,MAAM,YAAY,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC,CAAC;AAa5E,eAAO,MAAM,gBAAgB,QAAS,MAAM,KAAG,MAW9C,CAAC;AA4EF,eAAO,MAAM,iBAAiB,SAAU,MAAM,KAAG,YA2BhD,CAAC;AAEF,eAAO,MAAM,qBAAqB,UACzB,sBAAsB,KAC5B,KAAK,IAAI,mBAA6C,CAAC"}
@@ -0,0 +1,97 @@
1
+ export const MAX_MAIA_API_KEY_BYTES = 8 * 1024;
2
+ /** Pi's catalog lists about 40 providers; Maia keeps one credential per provider. */
3
+ export const MAX_MAIA_AUTH_PROVIDERS = 64;
4
+ const MAX_MAIA_OAUTH_TOKEN_BYTES = 32 * 1024;
5
+ const MAX_MAIA_PROVIDER_ENV_ENTRIES = 16;
6
+ const identifierPattern = /^[A-Za-z0-9][A-Za-z0-9._:-]*$/u;
7
+ const environmentNamePattern = /^[A-Za-z_][A-Za-z0-9_]*$/u;
8
+ const isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
9
+ const isBoundedString = (value, maximum) => typeof value === "string" &&
10
+ value.length > 0 &&
11
+ Buffer.byteLength(value, "utf8") <= maximum;
12
+ const isIdentifier = (value) => isBoundedString(value, 128) && identifierPattern.test(value);
13
+ export const assertMaiaApiKey = (key) => {
14
+ const trimmed = key.trim();
15
+ if (trimmed.length === 0 ||
16
+ trimmed.includes("\0") ||
17
+ trimmed.includes("\n") ||
18
+ Buffer.byteLength(trimmed, "utf8") > MAX_MAIA_API_KEY_BYTES) {
19
+ throw new TypeError("The API key is empty or exceeds its bound.");
20
+ }
21
+ return trimmed;
22
+ };
23
+ /** A token that may be empty: OpenRouter's subscription stores no refresh token. */
24
+ const isOptionalToken = (value) => typeof value === "string" &&
25
+ Buffer.byteLength(value, "utf8") <= MAX_MAIA_OAUTH_TOKEN_BYTES;
26
+ const parseOAuthCredential = (value) => {
27
+ if (value.type !== "oauth" ||
28
+ !isBoundedString(value.access, MAX_MAIA_OAUTH_TOKEN_BYTES) ||
29
+ !isOptionalToken(value.refresh) ||
30
+ typeof value.expires !== "number" ||
31
+ !Number.isSafeInteger(value.expires) ||
32
+ value.expires < 0 ||
33
+ (value.accountId !== undefined && !isBoundedString(value.accountId, 512))) {
34
+ throw new TypeError("Maia auth.json contains an invalid OAuth credential.");
35
+ }
36
+ return {
37
+ access: value.access,
38
+ ...(value.accountId === undefined ? {} : { accountId: value.accountId }),
39
+ expires: value.expires,
40
+ refresh: value.refresh,
41
+ type: "oauth",
42
+ };
43
+ };
44
+ const providerSetting = ([name, setting]) => environmentNamePattern.test(name) &&
45
+ isBoundedString(setting, MAX_MAIA_API_KEY_BYTES)
46
+ ? [[name, setting]]
47
+ : [];
48
+ const parseProviderEnvironment = (value) => {
49
+ const entries = isRecord(value) ? Object.entries(value) : [];
50
+ const settings = entries.flatMap(providerSetting);
51
+ if (!isRecord(value) ||
52
+ entries.length > MAX_MAIA_PROVIDER_ENV_ENTRIES ||
53
+ settings.length !== entries.length) {
54
+ throw new TypeError("Maia auth.json contains invalid provider settings.");
55
+ }
56
+ return Object.fromEntries(settings);
57
+ };
58
+ const parseApiKeyCredential = (value) => {
59
+ if (value.type !== "api_key" ||
60
+ (value.key !== undefined && typeof value.key !== "string")) {
61
+ throw new TypeError("Maia auth.json contains an invalid API key credential.");
62
+ }
63
+ return {
64
+ ...(value.env === undefined
65
+ ? {}
66
+ : { env: parseProviderEnvironment(value.env) }),
67
+ ...(typeof value.key === "string"
68
+ ? { key: assertMaiaApiKey(value.key) }
69
+ : {}),
70
+ type: "api_key",
71
+ };
72
+ };
73
+ export const parseMaiaAuthFile = (text) => {
74
+ const parsed = JSON.parse(text);
75
+ if (!isRecord(parsed)) {
76
+ throw new TypeError("Maia auth.json must contain an object.");
77
+ }
78
+ const providerIds = Object.keys(parsed);
79
+ if (providerIds.length > MAX_MAIA_AUTH_PROVIDERS) {
80
+ throw new TypeError("Maia auth.json exceeds the provider bound.");
81
+ }
82
+ return providerIds.reduce((auth, providerId) => {
83
+ const credential = parsed[providerId];
84
+ if (!isIdentifier(providerId) || !isRecord(credential)) {
85
+ throw new TypeError("Maia auth.json contains an invalid provider.");
86
+ }
87
+ if (credential.type === "oauth") {
88
+ return { ...auth, [providerId]: parseOAuthCredential(credential) };
89
+ }
90
+ if (credential.type === "api_key") {
91
+ return { ...auth, [providerId]: parseApiKeyCredential(credential) };
92
+ }
93
+ throw new TypeError("Maia auth.json contains an unknown credential type.");
94
+ }, {});
95
+ };
96
+ export const isMaiaOAuthCredential = (value) => value.type === "oauth";
97
+ //# sourceMappingURL=maia-auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"maia-auth.js","sourceRoot":"","sources":["../../src/auth/maia-auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { Credential, CredentialStore } from "@earendil-works/pi-ai";
2
+ export type MaiaAgentProviderCredential = {
3
+ readonly auth: Extract<Credential, {
4
+ readonly type: "oauth";
5
+ }>;
6
+ readonly providerId: string;
7
+ };
8
+ export declare const createMemoryCredentials: (credential?: MaiaAgentProviderCredential) => CredentialStore;
9
+ //# sourceMappingURL=memory-credentials.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-credentials.d.ts","sourceRoot":"","sources":["../../src/auth/memory-credentials.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAEzE,MAAM,MAAM,2BAA2B,GAAG;IACxC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,UAAU,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IAC/D,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B,CAAC;AAEF,eAAO,MAAM,uBAAuB,gBACrB,2BAA2B,KACvC,eA2BF,CAAC"}
@@ -0,0 +1,23 @@
1
+ export const createMemoryCredentials = (credential) => {
2
+ const data = new Map(credential === undefined ? [] : [[credential.providerId, credential.auth]]);
3
+ return {
4
+ delete: (providerId) => {
5
+ data.delete(providerId);
6
+ return Promise.resolve();
7
+ },
8
+ list: () => Promise.resolve([...data.entries()].map(([providerId, value]) => ({
9
+ providerId,
10
+ type: value.type,
11
+ }))),
12
+ modify: (providerId, fn) => fn(data.get(providerId)).then((next) => {
13
+ if (next === undefined) {
14
+ data.delete(providerId);
15
+ return next;
16
+ }
17
+ data.set(providerId, next);
18
+ return next;
19
+ }),
20
+ read: (providerId) => Promise.resolve(data.get(providerId)),
21
+ };
22
+ };
23
+ //# sourceMappingURL=memory-credentials.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-credentials.js","sourceRoot":"","sources":["../../src/auth/memory-credentials.ts"],"names":[],"mappings":"AAOA,MAAM,CAAC,MAAM,uBAAuB,GAAG,CACrC,UAAwC,EACvB,EAAE;IACnB,MAAM,IAAI,GAAG,IAAI,GAAG,CAClB,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,UAAU,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC,CAC3E,CAAC;IACF,OAAO;QACL,MAAM,EAAE,CAAC,UAAU,EAAE,EAAE;YACrB,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YACxB,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;QAC3B,CAAC;QACD,IAAI,EAAE,GAAG,EAAE,CACT,OAAO,CAAC,OAAO,CACb,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;YAChD,UAAU;YACV,IAAI,EAAE,KAAK,CAAC,IAAI;SACjB,CAAC,CAAC,CACJ;QACH,MAAM,EAAE,CAAC,UAAU,EAAE,EAAE,EAAE,EAAE,CACzB,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;YACrC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;gBACvB,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;gBACxB,OAAO,IAAI,CAAC;YACd,CAAC;YACD,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;YAC3B,OAAO,IAAI,CAAC;QACd,CAAC,CAAC;QACJ,IAAI,EAAE,CAAC,UAAU,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;KAC5D,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,28 @@
1
+ /** A `/goal` request: a read or a mutation the goal tool also accepts. */
2
+ export type GoalCommand = {
3
+ readonly action: "abandon" | "done" | "pause" | "resume";
4
+ } | {
5
+ readonly action: "rewrite";
6
+ readonly objective: string;
7
+ } | {
8
+ readonly action: "show" | "status";
9
+ };
10
+ /** A rejected `/goal` line and the reason shown to the user. */
11
+ export type GoalCommandRejection = {
12
+ readonly rejected: string;
13
+ };
14
+ /**
15
+ * Parses `/goal` arguments. Nothing means `status`; text that starts with no
16
+ * known verb becomes the new goal.
17
+ */
18
+ export declare const parseGoalCommand: (argumentsText: string) => GoalCommand | GoalCommandRejection;
19
+ /** Verb completions for `/goal`. */
20
+ export declare const goalCompletions: (prefix: string) => {
21
+ label: "abandon" | "done" | "pause" | "resume" | "rewrite" | "show" | "status";
22
+ value: "abandon" | "done" | "pause" | "resume" | "rewrite" | "show" | "status";
23
+ }[];
24
+ /** The one-line summary for `/goal status` and every change. */
25
+ export declare const formatGoalStatus: (value: unknown) => string;
26
+ /** Every goal field, for `/goal show`. */
27
+ export declare const formatGoalDetails: (value: unknown) => string;
28
+ //# sourceMappingURL=command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../../src/extensions/goal/command.ts"],"names":[],"mappings":"AAuBA,0EAA0E;AAC1E,MAAM,MAAM,WAAW,GACnB;IAAE,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAA;CAAE,GAC5D;IAAE,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAC1D;IAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,CAAA;CAAE,CAAC;AAE3C,gEAAgE;AAChE,MAAM,MAAM,oBAAoB,GAAG;IAAE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC;AAoCjE;;;GAGG;AACH,eAAO,MAAM,gBAAgB,kBACZ,MAAM,KACpB,WAAW,GAAG,oBAUhB,CAAC;AAEF,oCAAoC;AACpC,eAAO,MAAM,eAAe,WAAY,MAAM;;;GAK7C,CAAC;AAOF,gEAAgE;AAChE,eAAO,MAAM,gBAAgB,UAAW,OAAO,KAAG,MAOjD,CAAC;AAKF,0CAA0C;AAC1C,eAAO,MAAM,iBAAiB,UAAW,OAAO,KAAG,MASlD,CAAC"}
@@ -0,0 +1,80 @@
1
+ const MAXIMUM_OBJECTIVE_LENGTH = 2048;
2
+ const ACTIONS = [
3
+ "abandon",
4
+ "done",
5
+ "pause",
6
+ "resume",
7
+ "rewrite",
8
+ "show",
9
+ "status",
10
+ ];
11
+ const VERB = /^(abandon|clear|done|pause|raw|resume|rewrite|show|status)(?:\s+([\s\S]+))?$/iu;
12
+ const rewrite = (prose) => prose.length > MAXIMUM_OBJECTIVE_LENGTH
13
+ ? {
14
+ rejected: `The goal objective is limited to ${String(MAXIMUM_OBJECTIVE_LENGTH)} characters.`,
15
+ }
16
+ : { action: "rewrite", objective: prose };
17
+ const TRANSITIONS = ["abandon", "done", "pause", "resume"];
18
+ const TRANSITION_NAMES = new Set(TRANSITIONS);
19
+ const isTransition = (action) => TRANSITION_NAMES.has(action);
20
+ const verb = (action, rest) => {
21
+ if (action === "rewrite") {
22
+ return rest === undefined
23
+ ? { rejected: "Usage: /goal rewrite <objective>" }
24
+ : rewrite(rest);
25
+ }
26
+ if (action === "show" || action === "status" || isTransition(action)) {
27
+ return rest === undefined
28
+ ? { action }
29
+ : { rejected: `/goal ${action} takes no arguments.` };
30
+ }
31
+ return {
32
+ rejected: `/goal ${action} is not supported: use /goal rewrite <objective>, /goal done or /goal abandon.`,
33
+ };
34
+ };
35
+ /**
36
+ * Parses `/goal` arguments. Nothing means `status`; text that starts with no
37
+ * known verb becomes the new goal.
38
+ */
39
+ export const parseGoalCommand = (argumentsText) => {
40
+ const trimmed = argumentsText.trim();
41
+ if (trimmed.length === 0)
42
+ return { action: "status" };
43
+ const match = VERB.exec(trimmed);
44
+ if (match === null)
45
+ return rewrite(trimmed);
46
+ const rest = match[2]?.trim();
47
+ return verb((match[1] ?? "").toLowerCase(), rest === undefined || rest.length === 0 ? undefined : rest);
48
+ };
49
+ /** Verb completions for `/goal`. */
50
+ export const goalCompletions = (prefix) => {
51
+ const normalized = prefix.trim().toLowerCase();
52
+ return ACTIONS.filter((action) => action.startsWith(normalized)).map((value) => ({ label: value, value }));
53
+ };
54
+ const isGoal = (value) => typeof value === "object" &&
55
+ value !== null &&
56
+ typeof Reflect.get(value, "objective") === "string";
57
+ /** The one-line summary for `/goal status` and every change. */
58
+ export const formatGoalStatus = (value) => {
59
+ if (!isGoal(value))
60
+ return "No session goal. Set one with /goal <objective>.";
61
+ return [
62
+ `Goal [${value.status}] revision ${String(value.revision)}: ${value.objective}`,
63
+ `Next: ${value.next}`,
64
+ `Verification: ${value.verification}`,
65
+ ].join("\n");
66
+ };
67
+ const bulletList = (items) => items.length === 0 ? [" (none)"] : items.map((item) => ` - ${item}`);
68
+ /** Every goal field, for `/goal show`. */
69
+ export const formatGoalDetails = (value) => {
70
+ if (!isGoal(value))
71
+ return formatGoalStatus(value);
72
+ return [
73
+ formatGoalStatus(value),
74
+ "Success:",
75
+ ...bulletList(value.success),
76
+ "Constraints:",
77
+ ...bulletList(value.constraints),
78
+ ].join("\n");
79
+ };
80
+ //# sourceMappingURL=command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command.js","sourceRoot":"","sources":["../../../src/extensions/goal/command.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
2
+ import { Effect } from "effect";
3
+ import { type GoalCommand } from "./command.js";
4
+ import { type GoalSnapshot } from "./section.js";
5
+ declare const GoalStoreError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
6
+ readonly _tag: "GoalStoreError";
7
+ } & Readonly<A>;
8
+ /** A goal state that is missing, unreadable, unsafe or refuses the change. */
9
+ export declare class GoalStoreError extends GoalStoreError_base<{
10
+ readonly message: string;
11
+ }> {
12
+ }
13
+ /** The goal ledger of one Session, as the goal tool reads and changes it. */
14
+ export type GoalStore = {
15
+ readonly read: (sessionId: string) => Effect.Effect<GoalSnapshot | undefined, GoalStoreError>;
16
+ readonly run: (sessionId: string, command: GoalCommand) => Effect.Effect<unknown, GoalStoreError>;
17
+ };
18
+ /**
19
+ * Registers the `/goal` command for people, never the model, and the bounded active-goal
20
+ * section added to the system prompt before each run.
21
+ */
22
+ export declare const registerGoalContext: (pi: ExtensionAPI, store: GoalStore) => void;
23
+ export {};
24
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/extensions/goal/context.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAEV,YAAY,EAGb,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAQ,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEtC,OAAO,EAGL,KAAK,WAAW,EAGjB,MAAM,cAAc,CAAC;AACtB,OAAO,EAGL,KAAK,YAAY,EAClB,MAAM,cAAc,CAAC;;;;AAEtB,8EAA8E;AAC9E,qBAAa,cAAe,SAAQ,oBAAmC;IACrE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B,CAAC;CAAG;AAEL,6EAA6E;AAC7E,MAAM,MAAM,SAAS,GAAG;IACtB,QAAQ,CAAC,IAAI,EAAE,CACb,SAAS,EAAE,MAAM,KACd,MAAM,CAAC,MAAM,CAAC,YAAY,GAAG,SAAS,EAAE,cAAc,CAAC,CAAC;IAC7D,QAAQ,CAAC,GAAG,EAAE,CACZ,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,WAAW,KACjB,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;CAC7C,CAAC;AAuCF;;;GAGG;AACH,eAAO,MAAM,mBAAmB,OAAQ,YAAY,SAAS,SAAS,SAWrE,CAAC"}
@@ -0,0 +1,35 @@
1
+ import { Data, Effect } from "effect";
2
+ import { formatGoalDetails, formatGoalStatus, goalCompletions, parseGoalCommand, } from "./command.js";
3
+ import { buildGoalSection, GOAL_SECTION, } from "./section.js";
4
+ /** A goal state that is missing, unreadable, unsafe or refuses the change. */
5
+ export class GoalStoreError extends Data.TaggedError("GoalStoreError") {
6
+ }
7
+ const notify = (context, text, level) => Effect.sync(() => {
8
+ context.ui.notify(text, level);
9
+ });
10
+ const runCommand = (store, argumentsText, context) => {
11
+ const parsed = parseGoalCommand(argumentsText);
12
+ if ("rejected" in parsed)
13
+ return notify(context, parsed.rejected, "warning");
14
+ const format = parsed.action === "show" ? formatGoalDetails : formatGoalStatus;
15
+ return store.run(context.sessionManager.getSessionId(), parsed).pipe(Effect.flatMap((goal) => notify(context, format(goal), "info")), Effect.catchTag("GoalStoreError", (error) => notify(context, error.message, "error")));
16
+ };
17
+ const projectGoal = (store, event, context) => store.read(context.sessionManager.getSessionId()).pipe(Effect.map((goal) => {
18
+ const section = buildGoalSection(goal);
19
+ if (section === undefined)
20
+ return;
21
+ event.systemPromptOptions.sections[GOAL_SECTION] = section.text;
22
+ }));
23
+ /**
24
+ * Registers the `/goal` command for people, never the model, and the bounded active-goal
25
+ * section added to the system prompt before each run.
26
+ */
27
+ export const registerGoalContext = (pi, store) => {
28
+ pi.registerCommand("goal", {
29
+ description: "Show, rewrite, pause, resume or close this session's goal (/goal <objective> rewrites it)",
30
+ getArgumentCompletions: goalCompletions,
31
+ handler: (argumentsText, context) => Effect.runPromise(runCommand(store, argumentsText, context)),
32
+ });
33
+ pi.on("before_agent_start", (event, context) => Effect.runPromise(projectGoal(store, event, context)));
34
+ };
35
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../../src/extensions/goal/context.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEtC,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAEhB,eAAe,EACf,gBAAgB,GACjB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,gBAAgB,EAChB,YAAY,GAEb,MAAM,cAAc,CAAC;AAEtB,8EAA8E;AAC9E,MAAM,OAAO,cAAe,SAAQ,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAEnE;CAAG;AAeL,MAAM,MAAM,GAAG,CAAC,OAAgC,EAAE,IAAY,EAAE,KAAY,EAAE,EAAE,CAC9E,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;IACf,OAAO,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AACjC,CAAC,CAAC,CAAC;AAEL,MAAM,UAAU,GAAG,CACjB,KAAgB,EAChB,aAAqB,EACrB,OAAgC,EACX,EAAE;IACvB,MAAM,MAAM,GAAG,gBAAgB,CAAC,aAAa,CAAC,CAAC;IAC/C,IAAI,UAAU,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IAC7E,MAAM,MAAM,GACV,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,gBAAgB,CAAC;IAClE,OAAO,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,cAAc,CAAC,YAAY,EAAE,EAAE,MAAM,CAAC,CAAC,IAAI,CAClE,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC,EAC/D,MAAM,CAAC,QAAQ,CAAC,gBAAgB,EAAE,CAAC,KAAK,EAAE,EAAE,CAC1C,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CACxC,CACF,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,WAAW,GAAG,CAClB,KAAgB,EAChB,KAA4B,EAC5B,OAAyB,EACY,EAAE,CACvC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,YAAY,EAAE,CAAC,CAAC,IAAI,CACpD,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;IAClB,MAAM,OAAO,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACvC,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO;IAClC,KAAK,CAAC,mBAAmB,CAAC,QAAQ,CAAC,YAAY,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;AAClE,CAAC,CAAC,CACH,CAAC;AAEJ;;;GAGG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,EAAgB,EAAE,KAAgB,EAAE,EAAE;IACxE,EAAE,CAAC,eAAe,CAAC,MAAM,EAAE;QACzB,WAAW,EACT,2FAA2F;QAC7F,sBAAsB,EAAE,eAAe;QACvC,OAAO,EAAE,CAAC,aAAa,EAAE,OAAO,EAAE,EAAE,CAClC,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,KAAK,EAAE,aAAa,EAAE,OAAO,CAAC,CAAC;KAC/D,CAAC,CAAC;IACH,EAAE,CAAC,EAAE,CAAC,oBAAoB,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,CAC7C,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CACtD,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
2
+ /** `standalone` adds the human `/goal` command and the goal prompt section. */
3
+ export type GoalExtensionOptions = {
4
+ readonly standalone?: boolean;
5
+ };
6
+ export declare const makeGoalExtension: (stateRoot: string, durableSessionId?: string, options?: GoalExtensionOptions) => (pi: ExtensionAPI) => void;
7
+ //# sourceMappingURL=extension.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extension.d.ts","sourceRoot":"","sources":["../../../src/extensions/goal/extension.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,YAAY,EAEb,MAAM,iCAAiC,CAAC;AA6OzC,+EAA+E;AAC/E,MAAM,MAAM,oBAAoB,GAAG;IAAE,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAErE,eAAO,MAAM,iBAAiB,cAEf,MAAM,qBACE,MAAM,YACf,oBAAoB,UAE3B,YAAY,KAAG,IAkBnB,CAAC"}