@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
@@ -0,0 +1,92 @@
1
+ import { homedir } from "node:os";
2
+ import { inspectDestructiveCommand, } from "./destructive-guard.js";
3
+ const BLOCK_EVENT = "maia-safety:blocked";
4
+ const blockReason = (code) => code === "PARSER_DEPTH_EXCEEDED"
5
+ ? "Maia blocked a destructive command beyond its safe parser limit."
6
+ : "Maia blocked recursive deletion of a protected system or home root.";
7
+ const recordValue = (input, key) => typeof input === "object" && input !== null
8
+ ? Reflect.get(input, key)
9
+ : undefined;
10
+ const commandCandidate = (event, sessionCwd) => {
11
+ const toolName = event.toolName;
12
+ if (toolName !== "bash" && toolName !== "shell" && toolName !== "process") {
13
+ return undefined;
14
+ }
15
+ if (toolName === "process" &&
16
+ recordValue(event.input, "action") !== "start") {
17
+ return undefined;
18
+ }
19
+ const command = recordValue(event.input, "command");
20
+ if (typeof command !== "string")
21
+ return undefined;
22
+ const requestedCwd = recordValue(event.input, "cwd");
23
+ return {
24
+ command,
25
+ cwd: typeof requestedCwd === "string" ? requestedCwd : sessionCwd,
26
+ toolName,
27
+ };
28
+ };
29
+ const emitBlocked = (pi, input) => {
30
+ const payload = { ...input, protocolVersion: 1 };
31
+ try {
32
+ pi.appendEntry(BLOCK_EVENT, payload);
33
+ }
34
+ catch {
35
+ // Session persistence is best effort; blocking remains fail closed.
36
+ }
37
+ try {
38
+ pi.events.emit(BLOCK_EVENT, payload);
39
+ }
40
+ catch {
41
+ // Observability is best effort; blocking remains fail closed.
42
+ }
43
+ };
44
+ const inspectCandidate = (pi, candidate) => {
45
+ const decision = inspectDestructiveCommand({
46
+ command: candidate.command,
47
+ cwd: candidate.cwd,
48
+ homeDir: homedir(),
49
+ uid: process.getuid?.(),
50
+ });
51
+ if (decision.decision === "allow")
52
+ return;
53
+ emitBlocked(pi, {
54
+ operation: decision.operation,
55
+ reasonCode: decision.reasonCode,
56
+ toolName: candidate.toolName,
57
+ });
58
+ return blockReason(decision.reasonCode);
59
+ };
60
+ const registerToolGuard = (pi) => {
61
+ pi.on("tool_call", (event, context) => {
62
+ const candidate = commandCandidate(event, context.cwd);
63
+ if (candidate === undefined)
64
+ return undefined;
65
+ const reason = inspectCandidate(pi, candidate);
66
+ return reason === undefined ? undefined : { block: true, reason };
67
+ });
68
+ };
69
+ const registerUserBashGuard = (pi) => {
70
+ pi.on("user_bash", (event) => {
71
+ const reason = inspectCandidate(pi, {
72
+ command: event.command,
73
+ cwd: event.cwd,
74
+ toolName: "bash",
75
+ });
76
+ return reason === undefined
77
+ ? undefined
78
+ : {
79
+ result: {
80
+ cancelled: false,
81
+ exitCode: 126,
82
+ output: `${reason}\n`,
83
+ truncated: false,
84
+ },
85
+ };
86
+ });
87
+ };
88
+ export const registerSafetyGuard = (pi) => {
89
+ registerToolGuard(pi);
90
+ registerUserBashGuard(pi);
91
+ };
92
+ //# sourceMappingURL=lifecycle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../../src/extensions/safety/lifecycle.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /** The code points of a string, without splitting surrogate pairs. */
2
+ export declare const codePoints: (text: string) => readonly string[];
3
+ /**
4
+ * Splits a shell command into straight-line segments at `;`, `|`, `&`,
5
+ * parentheses and newlines, honoring quotes and backslash escapes. Quoting
6
+ * keeps `$` and `~` literal where the shell would not expand them.
7
+ */
8
+ export declare const tokenizeSegments: (command: string) => readonly (readonly string[])[];
9
+ /** Restores the literal `$` and `~` of a token that a nested shell re-parses. */
10
+ export declare const restoreLiterals: (token: string) => string;
11
+ /** Expands `$HOME`, `${HOME}`, `~`, `~root` and `~<user>` the way a shell would. */
12
+ export declare const expandHome: (target: string, homeDirectory: string) => string;
13
+ //# sourceMappingURL=shell-tokens.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shell-tokens.d.ts","sourceRoot":"","sources":["../../../src/extensions/safety/shell-tokens.ts"],"names":[],"mappings":"AAeA,sEAAsE;AACtE,eAAO,MAAM,UAAU,SAAU,MAAM,KAAG,SAAS,MAAM,EAC3B,CAAC;AA8E/B;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,YAClB,MAAM,KACd,SAAS,CAAC,SAAS,MAAM,EAAE,CAAC,EAU9B,CAAC;AAEF,iFAAiF;AACjF,eAAO,MAAM,eAAe,UAAW,MAAM,KAAG,MACsB,CAAC;AAevE,oFAAoF;AACpF,eAAO,MAAM,UAAU,WAAY,MAAM,iBAAiB,MAAM,KAAG,MAMhE,CAAC"}
@@ -0,0 +1,115 @@
1
+ // Provenance: a reviewed port of vllnt/pi-config
2
+ // extensions/pi-safety/destructive-guard.ts (tokenizer and home expansion) at
3
+ // commit b90808fbd2e51301ab8351367c69c5166c44ead7, rewritten without loops for
4
+ // the Maia lint rules (D-069).
5
+ import { basename } from "node:path";
6
+ const LITERAL_DOLLAR = "\u{E000}";
7
+ const LITERAL_TILDE = "\u{E001}";
8
+ const EXPANDED_HOME = "\u{E002}";
9
+ const HOME_VARIABLE = /\$(?:HOME|\{HOME\})/gu;
10
+ const SEPARATORS = new Set(["\n", "\r", "&", "(", ")", ";", "|"]);
11
+ const WHITESPACE = /\s/u;
12
+ /** The code points of a string, without splitting surrogate pairs. */
13
+ export const codePoints = (text) => text.match(/[\s\S]/gu) ?? [];
14
+ const finishToken = (state) => {
15
+ if (state.token.length === 0)
16
+ return;
17
+ state.segment.push(state.token.replaceAll(HOME_VARIABLE, EXPANDED_HOME));
18
+ state.token = "";
19
+ };
20
+ const finishSegment = (state) => {
21
+ finishToken(state);
22
+ if (state.segment.length === 0)
23
+ return;
24
+ state.segments.push(state.segment);
25
+ state.segment = [];
26
+ };
27
+ const escapedCharacter = (character) => {
28
+ if (character === "$")
29
+ return LITERAL_DOLLAR;
30
+ return character === "~" ? LITERAL_TILDE : character;
31
+ };
32
+ const quotedCharacter = (quote, character) => {
33
+ if (character === "$" && quote === "single")
34
+ return LITERAL_DOLLAR;
35
+ if (character === "~" && quote !== undefined)
36
+ return LITERAL_TILDE;
37
+ return character;
38
+ };
39
+ const toggledQuote = (quote, character) => {
40
+ if (character === "'" && quote !== "double") {
41
+ return quote === "single" ? {} : { quote: "single" };
42
+ }
43
+ if (character === '"' && quote !== "single") {
44
+ return quote === "double" ? {} : { quote: "double" };
45
+ }
46
+ return undefined;
47
+ };
48
+ const splitCharacter = (state, character) => {
49
+ if (state.quote !== undefined)
50
+ return false;
51
+ if (SEPARATORS.has(character)) {
52
+ finishSegment(state);
53
+ return true;
54
+ }
55
+ if (!WHITESPACE.test(character))
56
+ return false;
57
+ finishToken(state);
58
+ return true;
59
+ };
60
+ const step = (state, character) => {
61
+ if (state.escaped) {
62
+ state.token += escapedCharacter(character);
63
+ state.escaped = false;
64
+ return state;
65
+ }
66
+ if (character === "\\" && state.quote !== "single") {
67
+ state.escaped = true;
68
+ return state;
69
+ }
70
+ const toggled = toggledQuote(state.quote, character);
71
+ if (toggled !== undefined) {
72
+ state.quote = toggled.quote;
73
+ return state;
74
+ }
75
+ if (splitCharacter(state, character))
76
+ return state;
77
+ state.token += quotedCharacter(state.quote, character);
78
+ return state;
79
+ };
80
+ /**
81
+ * Splits a shell command into straight-line segments at `;`, `|`, `&`,
82
+ * parentheses and newlines, honoring quotes and backslash escapes. Quoting
83
+ * keeps `$` and `~` literal where the shell would not expand them.
84
+ */
85
+ export const tokenizeSegments = (command) => {
86
+ const state = codePoints(command).reduce(step, {
87
+ escaped: false,
88
+ segment: [],
89
+ segments: [],
90
+ token: "",
91
+ });
92
+ if (state.escaped)
93
+ state.token += "\\";
94
+ finishSegment(state);
95
+ return state.segments;
96
+ };
97
+ /** Restores the literal `$` and `~` of a token that a nested shell re-parses. */
98
+ export const restoreLiterals = (token) => token.replaceAll(LITERAL_DOLLAR, "$").replaceAll(LITERAL_TILDE, "~");
99
+ const expandTilde = (target, homeDirectory) => {
100
+ if (target === "~" || target.startsWith("~/")) {
101
+ return `${homeDirectory}${target.slice(1)}`;
102
+ }
103
+ if (target === "~root" || target.startsWith("~root/")) {
104
+ return `/root${target.slice(5)}`;
105
+ }
106
+ const homeName = basename(homeDirectory);
107
+ return target === `~${homeName}` || target.startsWith(`~${homeName}/`)
108
+ ? `${homeDirectory}${target.slice(homeName.length + 1)}`
109
+ : target;
110
+ };
111
+ /** Expands `$HOME`, `${HOME}`, `~`, `~root` and `~<user>` the way a shell would. */
112
+ export const expandHome = (target, homeDirectory) => expandTilde(target
113
+ .replaceAll(EXPANDED_HOME, homeDirectory)
114
+ .replaceAll(HOME_VARIABLE, homeDirectory), homeDirectory);
115
+ //# sourceMappingURL=shell-tokens.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shell-tokens.js","sourceRoot":"","sources":["../../../src/extensions/safety/shell-tokens.ts"],"names":[],"mappings":"AAAA,iDAAiD;AACjD,8EAA8E;AAC9E,+EAA+E;AAC/E,+BAA+B;AAC/B,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAErC,MAAM,cAAc,GAAG,UAAU,CAAC;AAClC,MAAM,aAAa,GAAG,UAAU,CAAC;AACjC,MAAM,aAAa,GAAG,UAAU,CAAC;AACjC,MAAM,aAAa,GAAG,uBAAuB,CAAC;AAC9C,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;AAClE,MAAM,UAAU,GAAG,KAAK,CAAC;AAIzB,sEAAsE;AACtE,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,IAAY,EAAqB,EAAE,CAC5D,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;AAU/B,MAAM,WAAW,GAAG,CAAC,KAAqB,EAAQ,EAAE;IAClD,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IACrC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC,CAAC;IACzE,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC;AACnB,CAAC,CAAC;AAEF,MAAM,aAAa,GAAG,CAAC,KAAqB,EAAQ,EAAE;IACpD,WAAW,CAAC,KAAK,CAAC,CAAC;IACnB,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IACvC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACnC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC;AACrB,CAAC,CAAC;AAEF,MAAM,gBAAgB,GAAG,CAAC,SAAiB,EAAU,EAAE;IACrD,IAAI,SAAS,KAAK,GAAG;QAAE,OAAO,cAAc,CAAC;IAC7C,OAAO,SAAS,KAAK,GAAG,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC;AACvD,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG,CAAC,KAAwB,EAAE,SAAiB,EAAE,EAAE;IACtE,IAAI,SAAS,KAAK,GAAG,IAAI,KAAK,KAAK,QAAQ;QAAE,OAAO,cAAc,CAAC;IACnE,IAAI,SAAS,KAAK,GAAG,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,aAAa,CAAC;IACnE,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC;AAEF,MAAM,YAAY,GAAG,CACnB,KAAwB,EACxB,SAAiB,EACuB,EAAE;IAC1C,IAAI,SAAS,KAAK,GAAG,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC5C,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;IACvD,CAAC;IACD,IAAI,SAAS,KAAK,GAAG,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC5C,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;IACvD,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC;AAEF,MAAM,cAAc,GAAG,CAAC,KAAqB,EAAE,SAAiB,EAAW,EAAE;IAC3E,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IAC5C,IAAI,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9B,aAAa,CAAC,KAAK,CAAC,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC;QAAE,OAAO,KAAK,CAAC;IAC9C,WAAW,CAAC,KAAK,CAAC,CAAC;IACnB,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF,MAAM,IAAI,GAAG,CAAC,KAAqB,EAAE,SAAiB,EAAkB,EAAE;IACxE,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QAClB,KAAK,CAAC,KAAK,IAAI,gBAAgB,CAAC,SAAS,CAAC,CAAC;QAC3C,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC;QACtB,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,SAAS,KAAK,IAAI,IAAI,KAAK,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;QACnD,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC;QACrB,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;IACrD,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,KAAK,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;QAC5B,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,cAAc,CAAC,KAAK,EAAE,SAAS,CAAC;QAAE,OAAO,KAAK,CAAC;IACnD,KAAK,CAAC,KAAK,IAAI,eAAe,CAAC,KAAK,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;IACvD,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAC9B,OAAe,EACiB,EAAE;IAClC,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE;QAC7C,OAAO,EAAE,KAAK;QACd,OAAO,EAAE,EAAE;QACX,QAAQ,EAAE,EAAE;QACZ,KAAK,EAAE,EAAE;KACV,CAAC,CAAC;IACH,IAAI,KAAK,CAAC,OAAO;QAAE,KAAK,CAAC,KAAK,IAAI,IAAI,CAAC;IACvC,aAAa,CAAC,KAAK,CAAC,CAAC;IACrB,OAAO,KAAK,CAAC,QAAQ,CAAC;AACxB,CAAC,CAAC;AAEF,iFAAiF;AACjF,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,KAAa,EAAU,EAAE,CACvD,KAAK,CAAC,UAAU,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC,UAAU,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;AAEvE,MAAM,WAAW,GAAG,CAAC,MAAc,EAAE,aAAqB,EAAU,EAAE;IACpE,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9C,OAAO,GAAG,aAAa,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9C,CAAC;IACD,IAAI,MAAM,KAAK,OAAO,IAAI,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACtD,OAAO,QAAQ,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;IACnC,CAAC;IACD,MAAM,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAC;IACzC,OAAO,MAAM,KAAK,IAAI,QAAQ,EAAE,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,QAAQ,GAAG,CAAC;QACpE,CAAC,CAAC,GAAG,aAAa,GAAG,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE;QACxD,CAAC,CAAC,MAAM,CAAC;AACb,CAAC,CAAC;AAEF,oFAAoF;AACpF,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,MAAc,EAAE,aAAqB,EAAU,EAAE,CAC1E,WAAW,CACT,MAAM;KACH,UAAU,CAAC,aAAa,EAAE,aAAa,CAAC;KACxC,UAAU,CAAC,aAAa,EAAE,aAAa,CAAC,EAC3C,aAAa,CACd,CAAC"}
@@ -0,0 +1,22 @@
1
+ /** The hit limit when a call names none. */
2
+ export declare const DEFAULT_SEARCH_LIMIT = 80;
3
+ /** The highest hit limit one call may request. */
4
+ export declare const MAXIMUM_SEARCH_LIMIT = 200;
5
+ export type SearchLimitInput = {
6
+ readonly glob?: string;
7
+ readonly limit?: number;
8
+ readonly path?: string;
9
+ };
10
+ export type SearchLimit = {
11
+ readonly error: string;
12
+ readonly ok: false;
13
+ } | {
14
+ readonly limit: number;
15
+ readonly ok: true;
16
+ };
17
+ /**
18
+ * Applies the default hit limit and rejects a raise above 200, or above
19
+ * 80 without a `path` or `glob` that narrows the search.
20
+ */
21
+ export declare const resolveSearchLimit: (input: SearchLimitInput) => SearchLimit;
22
+ //# sourceMappingURL=bounds.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bounds.d.ts","sourceRoot":"","sources":["../../../src/extensions/search/bounds.ts"],"names":[],"mappings":"AAGA,4CAA4C;AAC5C,eAAO,MAAM,oBAAoB,KAAK,CAAC;AACvC,kDAAkD;AAClD,eAAO,MAAM,oBAAoB,MAAM,CAAC;AAExC,MAAM,MAAM,gBAAgB,GAAG;IAC7B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,WAAW,GACnB;IAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAA;CAAE,GAC9C;IAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAA;CAAE,CAAC;AAMlD;;;GAGG;AACH,eAAO,MAAM,kBAAkB,UAAW,gBAAgB,KAAG,WAqB5D,CAAC"}
@@ -0,0 +1,35 @@
1
+ // Provenance: a reviewed port of vllnt/pi-config extensions/pi-search/bounds.ts
2
+ // at commit b90808fbd2e51301ab8351367c69c5166c44ead7 (D-069).
3
+ /** The hit limit when a call names none. */
4
+ export const DEFAULT_SEARCH_LIMIT = 80;
5
+ /** The highest hit limit one call may request. */
6
+ export const MAXIMUM_SEARCH_LIMIT = 200;
7
+ const scoped = (input) => (input.path?.trim() ?? "").length > 0 ||
8
+ (input.glob?.trim() ?? "").length > 0;
9
+ /**
10
+ * Applies the default hit limit and rejects a raise above 200, or above
11
+ * 80 without a `path` or `glob` that narrows the search.
12
+ */
13
+ export const resolveSearchLimit = (input) => {
14
+ if (input.limit === undefined) {
15
+ return { limit: DEFAULT_SEARCH_LIMIT, ok: true };
16
+ }
17
+ if (!Number.isFinite(input.limit) || input.limit < 1) {
18
+ return { error: "The search limit must be a positive number.", ok: false };
19
+ }
20
+ const limit = Math.floor(input.limit);
21
+ if (limit > MAXIMUM_SEARCH_LIMIT) {
22
+ return {
23
+ error: `The search limit is at most ${String(MAXIMUM_SEARCH_LIMIT)}; narrow the path or glob instead.`,
24
+ ok: false,
25
+ };
26
+ }
27
+ if (limit > DEFAULT_SEARCH_LIMIT && !scoped(input)) {
28
+ return {
29
+ error: `A search limit above ${String(DEFAULT_SEARCH_LIMIT)} needs a path or glob.`,
30
+ ok: false,
31
+ };
32
+ }
33
+ return { limit, ok: true };
34
+ };
35
+ //# sourceMappingURL=bounds.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bounds.js","sourceRoot":"","sources":["../../../src/extensions/search/bounds.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,8DAA8D;AAE9D,4CAA4C;AAC5C,MAAM,CAAC,MAAM,oBAAoB,GAAG,EAAE,CAAC;AACvC,kDAAkD;AAClD,MAAM,CAAC,MAAM,oBAAoB,GAAG,GAAG,CAAC;AAYxC,MAAM,MAAM,GAAG,CAAC,KAAuB,EAAW,EAAE,CAClD,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC;IACrC,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;AAExC;;;GAGG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,KAAuB,EAAe,EAAE;IACzE,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAC9B,OAAO,EAAE,KAAK,EAAE,oBAAoB,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;IACnD,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC;QACrD,OAAO,EAAE,KAAK,EAAE,6CAA6C,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;IAC7E,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACtC,IAAI,KAAK,GAAG,oBAAoB,EAAE,CAAC;QACjC,OAAO;YACL,KAAK,EAAE,+BAA+B,MAAM,CAAC,oBAAoB,CAAC,oCAAoC;YACtG,EAAE,EAAE,KAAK;SACV,CAAC;IACJ,CAAC;IACD,IAAI,KAAK,GAAG,oBAAoB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QACnD,OAAO;YACL,KAAK,EAAE,wBAAwB,MAAM,CAAC,oBAAoB,CAAC,wBAAwB;YACnF,EAAE,EAAE,KAAK;SACV,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;AAC7B,CAAC,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
2
+ /**
3
+ * Caps Pi's `find` and `grep` at 80 hits by default and 200 at most, and
4
+ * rejects a raise above 80 that names no path or glob.
5
+ */
6
+ export declare const searchBoundsExtension: (pi: ExtensionAPI) => void;
7
+ //# sourceMappingURL=extension.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extension.d.ts","sourceRoot":"","sources":["../../../src/extensions/search/extension.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,YAAY,EAGb,MAAM,iCAAiC,CAAC;AAYzC;;;GAGG;AACH,eAAO,MAAM,qBAAqB,OAAQ,YAAY,KAAG,IAExD,CAAC"}
@@ -0,0 +1,18 @@
1
+ import { resolveSearchLimit } from "./bounds.js";
2
+ const boundSearch = (event) => {
3
+ if (event.toolName !== "find" && event.toolName !== "grep")
4
+ return undefined;
5
+ const bound = resolveSearchLimit(event.input);
6
+ if (!bound.ok)
7
+ return { block: true, reason: bound.error };
8
+ event.input.limit = bound.limit;
9
+ return undefined;
10
+ };
11
+ /**
12
+ * Caps Pi's `find` and `grep` at 80 hits by default and 200 at most, and
13
+ * rejects a raise above 80 that names no path or glob.
14
+ */
15
+ export const searchBoundsExtension = (pi) => {
16
+ pi.on("tool_call", boundSearch);
17
+ };
18
+ //# sourceMappingURL=extension.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extension.js","sourceRoot":"","sources":["../../../src/extensions/search/extension.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEjD,MAAM,WAAW,GAAG,CAAC,KAAoB,EAAmC,EAAE;IAC5E,IAAI,KAAK,CAAC,QAAQ,KAAK,MAAM,IAAI,KAAK,CAAC,QAAQ,KAAK,MAAM;QAAE,OAAO,SAAS,CAAC;IAC7E,MAAM,KAAK,GAAG,kBAAkB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC9C,IAAI,CAAC,KAAK,CAAC,EAAE;QAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC;IAC3D,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;IAChC,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,EAAgB,EAAQ,EAAE;IAC9D,EAAE,CAAC,EAAE,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;AAClC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { searchBoundsExtension } from "./extension.js";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/extensions/search/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { searchBoundsExtension } from "./extension.js";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/extensions/search/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,20 @@
1
+ import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
2
+ import { Effect } from "effect";
3
+ import { type TaskRow } from "./summary.js";
4
+ declare const TaskLedgerError_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 & {
5
+ readonly _tag: "TaskLedgerError";
6
+ } & Readonly<A>;
7
+ /** A task ledger that is unreadable, unsafe or incompatible. */
8
+ export declare class TaskLedgerError extends TaskLedgerError_base<{
9
+ readonly message: string;
10
+ }> {
11
+ }
12
+ /** Reads one Session's task ledger, as the task tool does. */
13
+ export type TaskLedgerReader = (sessionId: string) => Effect.Effect<readonly TaskRow[], TaskLedgerError>;
14
+ /**
15
+ * Registers the `/tasks` view, which people use and which changes nothing, and the bounded open-task
16
+ * section added to the system prompt before each run.
17
+ */
18
+ export declare const registerTasksContext: (pi: ExtensionAPI, read: TaskLedgerReader) => void;
19
+ export {};
20
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/extensions/tasks/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,OAAO,EAEb,MAAM,cAAc,CAAC;;;;AAEtB,gEAAgE;AAChE,qBAAa,eAAgB,SAAQ,qBAAoC;IACvE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B,CAAC;CAAG;AAEL,8DAA8D;AAC9D,MAAM,MAAM,gBAAgB,GAAG,CAC7B,SAAS,EAAE,MAAM,KACd,MAAM,CAAC,MAAM,CAAC,SAAS,OAAO,EAAE,EAAE,eAAe,CAAC,CAAC;AAyCxD;;;GAGG;AACH,eAAO,MAAM,oBAAoB,OAC3B,YAAY,QACV,gBAAgB,SAevB,CAAC"}
@@ -0,0 +1,36 @@
1
+ import { Data, Effect } from "effect";
2
+ import { buildTasksSection, formatTasks, TASKS_SECTION, } from "./summary.js";
3
+ /** A task ledger that is unreadable, unsafe or incompatible. */
4
+ export class TaskLedgerError extends Data.TaggedError("TaskLedgerError") {
5
+ }
6
+ const VIEWS = ["all", "open"];
7
+ const showTasks = (read, argumentsText, context) => {
8
+ const view = argumentsText.trim().toLowerCase();
9
+ if (view !== "" && view !== "all" && view !== "open") {
10
+ return Effect.sync(() => {
11
+ context.ui.notify("Usage: /tasks [open|all]", "warning");
12
+ });
13
+ }
14
+ return read(context.sessionManager.getSessionId()).pipe(Effect.map((tasks) => formatTasks(tasks, view === "all")), Effect.catchTag("TaskLedgerError", (error) => Effect.succeed(error.message)), Effect.flatMap((text) => Effect.sync(() => {
15
+ context.ui.notify(text, "info");
16
+ })));
17
+ };
18
+ const projectTasks = (read, event, context) => read(context.sessionManager.getSessionId()).pipe(Effect.map((tasks) => {
19
+ const section = buildTasksSection(tasks);
20
+ if (section === undefined)
21
+ return;
22
+ event.systemPromptOptions.sections[TASKS_SECTION] = section.text;
23
+ }));
24
+ /**
25
+ * Registers the `/tasks` view, which people use and which changes nothing, and the bounded open-task
26
+ * section added to the system prompt before each run.
27
+ */
28
+ export const registerTasksContext = (pi, read) => {
29
+ pi.registerCommand("tasks", {
30
+ description: "List this session's open tasks, or every task with /tasks all",
31
+ getArgumentCompletions: (prefix) => VIEWS.filter((view) => view.startsWith(prefix.trim().toLowerCase())).map((value) => ({ label: value, value })),
32
+ handler: (argumentsText, context) => Effect.runPromise(showTasks(read, argumentsText, context)),
33
+ });
34
+ pi.on("before_agent_start", (event, context) => Effect.runPromise(projectTasks(read, event, context)));
35
+ };
36
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../../src/extensions/tasks/context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
2
+ /** `standalone` adds the human `/tasks` view and the task prompt section. */
3
+ export type TasksExtensionOptions = {
4
+ readonly standalone?: boolean;
5
+ };
6
+ export declare const makeTasksExtension: (stateRoot: string, durableSessionId?: string, options?: TasksExtensionOptions) => (pi: ExtensionAPI) => void;
7
+ //# sourceMappingURL=extension.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extension.d.ts","sourceRoot":"","sources":["../../../src/extensions/tasks/extension.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,YAAY,EAEb,MAAM,iCAAiC,CAAC;AAkOzC,6EAA6E;AAC7E,MAAM,MAAM,qBAAqB,GAAG;IAAE,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAEtE,eAAO,MAAM,kBAAkB,cAEhB,MAAM,qBACE,MAAM,YACf,qBAAqB,UAE5B,YAAY,KAAG,IAkBnB,CAAC"}
@@ -0,0 +1,178 @@
1
+ import { lstat, mkdir, readFile, rename, writeFile } from "node:fs/promises";
2
+ import { dirname, join } from "node:path";
3
+ import { Type } from "@earendil-works/pi-ai";
4
+ import { Effect } from "effect";
5
+ import { registerTasksContext, TaskLedgerError, } from "./context.js";
6
+ const MAX_LEDGER_BYTES = 1024 * 1024;
7
+ const taskStatus = Type.Union([
8
+ Type.Literal("pending"),
9
+ Type.Literal("in_progress"),
10
+ Type.Literal("completed"),
11
+ ]);
12
+ const parameters = Type.Object({
13
+ action: Type.Union([
14
+ Type.Literal("create"),
15
+ Type.Literal("get"),
16
+ Type.Literal("list"),
17
+ Type.Literal("update"),
18
+ ]),
19
+ activeForm: Type.Optional(Type.String({ maxLength: 160 })),
20
+ description: Type.Optional(Type.String({ maxLength: 4096 })),
21
+ status: Type.Optional(taskStatus),
22
+ subject: Type.Optional(Type.String({ maxLength: 240 })),
23
+ taskId: Type.Optional(Type.String({ maxLength: 32 })),
24
+ });
25
+ const emptyLedger = () => ({
26
+ nextId: 1,
27
+ protocolVersion: 2,
28
+ revision: 0,
29
+ tasks: [],
30
+ });
31
+ const textResult = (value) => ({
32
+ content: [{ text: JSON.stringify(value), type: "text" }],
33
+ details: value,
34
+ });
35
+ const ledgerPath = (stateRoot, sessionId) => join(stateRoot, "sessions", sessionId, "tasks.json");
36
+ const parseLedger = (text) => {
37
+ const value = JSON.parse(text);
38
+ if (typeof value !== "object" ||
39
+ value === null ||
40
+ Reflect.get(value, "protocolVersion") !== 2 ||
41
+ !Array.isArray(Reflect.get(value, "tasks")) ||
42
+ typeof Reflect.get(value, "nextId") !== "number" ||
43
+ typeof Reflect.get(value, "revision") !== "number") {
44
+ throw new Error("The session task ledger is incompatible.");
45
+ }
46
+ return value;
47
+ };
48
+ const readLedger = async (path) => {
49
+ try {
50
+ const stats = await lstat(path);
51
+ if (!stats.isFile() ||
52
+ stats.isSymbolicLink() ||
53
+ stats.size > MAX_LEDGER_BYTES) {
54
+ throw new Error("The session task ledger is unsafe or too large.");
55
+ }
56
+ return parseLedger(await readFile(path, "utf8"));
57
+ }
58
+ catch (error) {
59
+ if (error.code === "ENOENT")
60
+ return emptyLedger();
61
+ throw error;
62
+ }
63
+ };
64
+ const writeLedger = async (path, ledger) => {
65
+ const directory = dirname(path);
66
+ await mkdir(directory, { mode: 0o700, recursive: true });
67
+ const temporary = `${path}.${String(process.pid)}.${String(ledger.revision)}.tmp`;
68
+ const text = `${JSON.stringify(ledger, undefined, 2)}\n`;
69
+ if (Buffer.byteLength(text, "utf8") > MAX_LEDGER_BYTES) {
70
+ throw new Error("The session task ledger exceeds its byte limit.");
71
+ }
72
+ await writeFile(temporary, text, { flag: "wx", mode: 0o600 });
73
+ await rename(temporary, path);
74
+ };
75
+ const requireTask = (ledger, taskId) => {
76
+ const task = ledger.tasks.find(({ id }) => id === taskId);
77
+ if (task === undefined)
78
+ throw new Error("The task does not exist.");
79
+ return task;
80
+ };
81
+ const buildTask = (ledger, input) => {
82
+ if (input.subject === undefined || input.subject.trim().length === 0) {
83
+ throw new Error("Task create requires a subject.");
84
+ }
85
+ const now = Date.now();
86
+ return {
87
+ ...(input.activeForm === undefined ? {} : { activeForm: input.activeForm }),
88
+ blockedBy: [],
89
+ blocks: [],
90
+ createdAt: now,
91
+ ...(input.description === undefined
92
+ ? {}
93
+ : { description: input.description }),
94
+ id: String(ledger.nextId),
95
+ kind: "work",
96
+ revision: 1,
97
+ status: "pending",
98
+ subject: input.subject.trim(),
99
+ updatedAt: now,
100
+ };
101
+ };
102
+ const createTask = (ledger, input) => {
103
+ const task = buildTask(ledger, input);
104
+ return {
105
+ ledger: {
106
+ ...ledger,
107
+ nextId: ledger.nextId + 1,
108
+ revision: ledger.revision + 1,
109
+ tasks: [...ledger.tasks, task],
110
+ },
111
+ task,
112
+ };
113
+ };
114
+ const patchTask = (current, input) => ({
115
+ ...current,
116
+ ...(input.activeForm === undefined ? {} : { activeForm: input.activeForm }),
117
+ ...(input.description === undefined
118
+ ? {}
119
+ : { description: input.description }),
120
+ revision: current.revision + 1,
121
+ ...(input.status === undefined ? {} : { status: input.status }),
122
+ ...(input.subject === undefined ? {} : { subject: input.subject }),
123
+ updatedAt: Date.now(),
124
+ });
125
+ const updateTask = (ledger, input) => {
126
+ const task = patchTask(requireTask(ledger, input.taskId), input);
127
+ return {
128
+ ledger: {
129
+ ...ledger,
130
+ revision: ledger.revision + 1,
131
+ tasks: ledger.tasks.map((candidate) => candidate.id === task.id ? task : candidate),
132
+ },
133
+ task,
134
+ };
135
+ };
136
+ const createExecuteTask = (stateRoot, durableSessionId) => async (...arguments_) => {
137
+ const input = arguments_[1];
138
+ const context = arguments_[4];
139
+ const path = ledgerPath(stateRoot, durableSessionId ?? context.sessionManager.getSessionId());
140
+ const ledger = await readLedger(path);
141
+ if (input.action === "list")
142
+ return textResult(ledger);
143
+ if (input.action === "get") {
144
+ return textResult(requireTask(ledger, input.taskId));
145
+ }
146
+ const mutation = input.action === "create"
147
+ ? createTask(ledger, input)
148
+ : updateTask(ledger, input);
149
+ await writeLedger(path, mutation.ledger);
150
+ return textResult(mutation.task);
151
+ };
152
+ // The task ledger lifted into Effect for the standalone /tasks view and the
153
+ // task prompt section.
154
+ const ledgerReader = (stateRoot, durableSessionId) => (sessionId) => Effect.tryPromise({
155
+ catch: (cause) => new TaskLedgerError({
156
+ message: cause instanceof Error ? cause.message : String(cause),
157
+ }),
158
+ try: () => readLedger(ledgerPath(stateRoot, durableSessionId ?? sessionId)),
159
+ }).pipe(Effect.map((ledger) => ledger.tasks));
160
+ export const makeTasksExtension = (stateRoot, durableSessionId, options) => (pi) => {
161
+ if (options?.standalone === true) {
162
+ registerTasksContext(pi, ledgerReader(stateRoot, durableSessionId));
163
+ }
164
+ pi.registerTool({
165
+ description: "Create, inspect, list, or update work on this agent session's durable task ledger.",
166
+ execute: createExecuteTask(stateRoot, durableSessionId),
167
+ executionMode: "sequential",
168
+ label: "Task",
169
+ name: "task",
170
+ parameters,
171
+ promptGuidelines: [
172
+ "Use task for multi-turn work and keep progress in the session ledger.",
173
+ "Task rows do not authorize Factory or swarm orchestration.",
174
+ ],
175
+ promptSnippet: "Track durable work for this agent session",
176
+ });
177
+ };
178
+ //# sourceMappingURL=extension.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extension.js","sourceRoot":"","sources":["../../../src/extensions/tasks/extension.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export { makeTasksExtension } from "./extension.js";
2
+ //# sourceMappingURL=index.d.ts.map