@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,26 @@
1
+ /** One bounded, untrusted runtime projection for a Pi system prompt section. */
2
+ export type PromptSection = {
3
+ readonly bytes: number;
4
+ readonly digest: string;
5
+ readonly text: string;
6
+ };
7
+ /** A source-owned label and guidance line around untrusted data. */
8
+ export type PromptSectionInput = {
9
+ readonly guidance: string;
10
+ readonly label: string;
11
+ readonly maximumBytes: number;
12
+ readonly payload: unknown;
13
+ };
14
+ /**
15
+ * JSON with `&`, `<`, `>` and the line and paragraph separators written as
16
+ * Unicode escapes, so data can never close the section's XML tag or open
17
+ * another one.
18
+ */
19
+ export declare const safeJson: (value: unknown) => string;
20
+ /**
21
+ * Renders `[LABEL] v1 sha256:<digest>`, the guidance line and the escaped
22
+ * payload. The digest covers the guidance and the payload. Returns nothing
23
+ * when the result exceeds `maximumBytes`.
24
+ */
25
+ export declare const renderPromptSection: (input: PromptSectionInput) => PromptSection | undefined;
26
+ //# sourceMappingURL=prompt-section.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-section.d.ts","sourceRoot":"","sources":["../../../src/extensions/prompt-section/prompt-section.ts"],"names":[],"mappings":"AAUA,gFAAgF;AAChF,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,oEAAoE;AACpE,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B,CAAC;AAKF;;;;GAIG;AACH,eAAO,MAAM,QAAQ,UAAW,OAAO,KAAG,MAC0B,CAAC;AAErE;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,UACvB,kBAAkB,KACxB,aAAa,GAAG,SAMlB,CAAC"}
@@ -0,0 +1,28 @@
1
+ // Provenance: framing reviewed from vllnt/pi-config
2
+ // extensions/pi-tasks/task-text.ts (safeJsonLine, framePromptContribution) and
3
+ // extensions/pi-goal/prompt-frame.ts at commit
4
+ // b90808fbd2e51301ab8351367c69c5166c44ead7, rebuilt on Pi 1.0 system prompt
5
+ // sections (D-069).
6
+ import { Buffer } from "node:buffer";
7
+ import { createHash } from "node:crypto";
8
+ const UNSAFE_CHARACTERS = /[&<>\u{2028}\u{2029}]/gu;
9
+ const unicodeEscape = (character) => `\\u${(character.codePointAt(0) ?? 0).toString(16).padStart(4, "0")}`;
10
+ /**
11
+ * JSON with `&`, `<`, `>` and the line and paragraph separators written as
12
+ * Unicode escapes, so data can never close the section's XML tag or open
13
+ * another one.
14
+ */
15
+ export const safeJson = (value) => JSON.stringify(value).replaceAll(UNSAFE_CHARACTERS, unicodeEscape);
16
+ /**
17
+ * Renders `[LABEL] v1 sha256:<digest>`, the guidance line and the escaped
18
+ * payload. The digest covers the guidance and the payload. Returns nothing
19
+ * when the result exceeds `maximumBytes`.
20
+ */
21
+ export const renderPromptSection = (input) => {
22
+ const body = `${input.guidance}\n${safeJson(input.payload)}`;
23
+ const digest = `sha256:${createHash("sha256").update(body).digest("hex")}`;
24
+ const text = `[${input.label}] v1 ${digest}\n${body}`;
25
+ const bytes = Buffer.byteLength(text, "utf8");
26
+ return bytes > input.maximumBytes ? undefined : { bytes, digest, text };
27
+ };
28
+ //# sourceMappingURL=prompt-section.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-section.js","sourceRoot":"","sources":["../../../src/extensions/prompt-section/prompt-section.ts"],"names":[],"mappings":"AAAA,oDAAoD;AACpD,+EAA+E;AAC/E,+CAA+C;AAC/C,4EAA4E;AAC5E,oBAAoB;AACpB,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,iBAAiB,GAAG,yBAAyB,CAAC;AAiBpD,MAAM,aAAa,GAAG,CAAC,SAAiB,EAAU,EAAE,CAClD,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;AAExE;;;;GAIG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,KAAc,EAAU,EAAE,CACjD,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,iBAAiB,EAAE,aAAa,CAAC,CAAC;AAErE;;;;GAIG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CACjC,KAAyB,EACE,EAAE;IAC7B,MAAM,IAAI,GAAG,GAAG,KAAK,CAAC,QAAQ,KAAK,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;IAC7D,MAAM,MAAM,GAAG,UAAU,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;IAC3E,MAAM,IAAI,GAAG,IAAI,KAAK,CAAC,KAAK,QAAQ,MAAM,KAAK,IAAI,EAAE,CAAC;IACtD,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC9C,OAAO,KAAK,GAAG,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;AAC1E,CAAC,CAAC"}
@@ -0,0 +1,31 @@
1
+ /** The home directory and user the inspected command runs as. */
2
+ export type CommandUser = {
3
+ readonly homeDirectory: string;
4
+ readonly uid?: number;
5
+ };
6
+ /** A position in a segment and the working directory in effect there. */
7
+ type Cursor = {
8
+ readonly cwd: string;
9
+ readonly index: number;
10
+ };
11
+ /** The executable a segment runs, after its wrappers. */
12
+ export type LocatedCommand = Cursor & {
13
+ readonly kind: "command";
14
+ readonly name: string;
15
+ };
16
+ /** A command string that `env -S` hands to a new parse. */
17
+ export type SplitCommand = {
18
+ readonly command: string;
19
+ readonly cwd: string;
20
+ readonly kind: "split";
21
+ };
22
+ /** Resolves a `cd`, `-C` or `-D` target against the current directory. */
23
+ export declare const changedDirectory: (cwd: string, target: string, homeDirectory: string) => string;
24
+ /**
25
+ * Finds the executable one segment runs after leading assignments and the
26
+ * `sudo`, `env`, `command` and `exec` wrappers, with the working directory
27
+ * their `--chdir` and login options select.
28
+ */
29
+ export declare const locateCommand: (tokens: readonly string[], cwd: string, user: CommandUser) => LocatedCommand | SplitCommand | undefined;
30
+ export {};
31
+ //# sourceMappingURL=command-wrappers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-wrappers.d.ts","sourceRoot":"","sources":["../../../src/extensions/safety/command-wrappers.ts"],"names":[],"mappings":"AA+CA,iEAAiE;AACjE,MAAM,MAAM,WAAW,GAAG;IACxB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,yEAAyE;AACzE,KAAK,MAAM,GAAG;IAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAE/D,yDAAyD;AACzD,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG;IACpC,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,2DAA2D;AAC3D,MAAM,MAAM,YAAY,GAAG;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;CACxB,CAAC;AAaF,0EAA0E;AAC1E,eAAO,MAAM,gBAAgB,QACtB,MAAM,UACH,MAAM,iBACC,MAAM,KACpB,MAAyD,CAAC;AAoP7D;;;;GAIG;AACH,eAAO,MAAM,aAAa,WAChB,SAAS,MAAM,EAAE,OACpB,MAAM,QACL,WAAW,KAChB,cAAc,GAAG,YAAY,GAAG,SACc,CAAC"}
@@ -0,0 +1,247 @@
1
+ // Provenance: a reviewed port of vllnt/pi-config
2
+ // extensions/pi-safety/destructive-guard.ts (sudo, env, command and exec
3
+ // unwrapping) at commit b90808fbd2e51301ab8351367c69c5166c44ead7, rewritten
4
+ // without loops for the Maia lint rules (D-069).
5
+ import { basename, resolve } from "node:path";
6
+ import { codePoints, expandHome } from "./shell-tokens.js";
7
+ const ASSIGNMENT = /^[A-Za-z_]\w*=/u;
8
+ const SUDO_VALUE_OPTIONS = new Set([
9
+ "--chdir",
10
+ "--chroot",
11
+ "--close-from",
12
+ "--command-timeout",
13
+ "--group",
14
+ "--host",
15
+ "--prompt",
16
+ "--role",
17
+ "--type",
18
+ "--user",
19
+ "-C",
20
+ "-D",
21
+ "-R",
22
+ "-T",
23
+ "-g",
24
+ "-h",
25
+ "-p",
26
+ "-r",
27
+ "-t",
28
+ "-u",
29
+ ]);
30
+ const SUDO_SHORT_VALUE_OPTIONS = new Set("CDRTghprtu");
31
+ const ENV_VALUE_OPTIONS = new Set([
32
+ "--argv0",
33
+ "--chdir",
34
+ "--file",
35
+ "--ignore-signal",
36
+ "--split-string",
37
+ "--unset",
38
+ "-C",
39
+ "-S",
40
+ "-a",
41
+ "-f",
42
+ "-u",
43
+ ]);
44
+ const ENV_SHORT_VALUE_OPTIONS = new Set("CSafu");
45
+ /** Resolves a `cd`, `-C` or `-D` target against the current directory. */
46
+ export const changedDirectory = (cwd, target, homeDirectory) => resolve(cwd, expandHome(target, homeDirectory));
47
+ const shortCluster = (token, valueOptions) => {
48
+ const characters = codePoints(token);
49
+ const valueAt = characters.findIndex((character, index) => index > 0 && valueOptions.has(character));
50
+ const end = valueAt < 0 ? characters.length : valueAt;
51
+ return {
52
+ attached: characters
53
+ .slice(end + 1)
54
+ .join("")
55
+ .replace(/^=/u, ""),
56
+ flags: characters.slice(1, end).join(""),
57
+ option: valueAt < 0 ? undefined : characters[valueAt],
58
+ };
59
+ };
60
+ const sudoChdir = (state, target, segment) => ({
61
+ ...state,
62
+ cwd: changedDirectory(state.cwd, target, segment.user.homeDirectory),
63
+ explicitChdir: true,
64
+ });
65
+ const sudoCluster = (state, token, segment) => {
66
+ const cluster = shortCluster(token, SUDO_SHORT_VALUE_OPTIONS);
67
+ const login = state.login || cluster.flags.includes("i");
68
+ if (cluster.option === undefined) {
69
+ return { ...state, index: state.index + 1, login };
70
+ }
71
+ const value = cluster.attached || segment.tokens[state.index + 1];
72
+ const index = state.index + (cluster.attached.length > 0 ? 1 : 2);
73
+ const next = { ...state, index, login };
74
+ if (cluster.option === "D" && value !== undefined) {
75
+ return sudoChdir(next, value, segment);
76
+ }
77
+ return cluster.option === "u" ? { ...next, user: value } : next;
78
+ };
79
+ const sudoValue = (state, token, segment) => {
80
+ const target = segment.tokens[state.index + 1];
81
+ if (token === "-D" || token === "--chdir") {
82
+ const next = { ...state, index: state.index + 2 };
83
+ return target === undefined ? next : sudoChdir(next, target, segment);
84
+ }
85
+ if (token.startsWith("--chdir=")) {
86
+ const next = { ...state, index: state.index + 1 };
87
+ return sudoChdir(next, token.slice("--chdir=".length), segment);
88
+ }
89
+ if (token.startsWith("-D") && token.length > 2) {
90
+ const next = { ...state, index: state.index + 1 };
91
+ return sudoChdir(next, token.slice(2).replace(/^=/u, ""), segment);
92
+ }
93
+ if (token === "-u" || token === "--user") {
94
+ return { ...state, index: state.index + 2, user: target };
95
+ }
96
+ return token.startsWith("--user=")
97
+ ? { ...state, index: state.index + 1, user: token.slice(7) }
98
+ : undefined;
99
+ };
100
+ const sudoOption = (state, token, segment) => {
101
+ if (token === "-i" || token === "--login") {
102
+ return { ...state, index: state.index + 1, login: true };
103
+ }
104
+ const valued = sudoValue(state, token, segment);
105
+ if (valued !== undefined)
106
+ return valued;
107
+ if (token.startsWith("-") && !token.startsWith("--")) {
108
+ return sudoCluster(state, token, segment);
109
+ }
110
+ const skip = SUDO_VALUE_OPTIONS.has(token) ? 2 : 1;
111
+ return { ...state, index: state.index + skip };
112
+ };
113
+ const sudoOptions = (state, segment) => {
114
+ const token = segment.tokens[state.index];
115
+ if (token === "--")
116
+ return { ...state, index: state.index + 1 };
117
+ if (token?.startsWith("-") !== true || token === "-")
118
+ return state;
119
+ return sudoOptions(sudoOption(state, token, segment), segment);
120
+ };
121
+ const loginDirectory = (state, user) => {
122
+ if (!state.login || state.explicitChdir)
123
+ return state.cwd;
124
+ if (state.user === undefined || state.user === "root" || state.user === "#0")
125
+ return "/root";
126
+ const ownName = state.user === basename(user.homeDirectory);
127
+ const ownUid = user.uid !== undefined && state.user === `#${String(user.uid)}`;
128
+ return ownName || ownUid ? user.homeDirectory : state.cwd;
129
+ };
130
+ const unwrapSudo = (cursor, segment) => {
131
+ const state = sudoOptions({ ...cursor, explicitChdir: false, login: false }, segment);
132
+ return { cwd: loginDirectory(state, segment.user), index: state.index };
133
+ };
134
+ const environmentSplit = (cwd, command) => ({
135
+ command,
136
+ cwd,
137
+ kind: "split",
138
+ });
139
+ const environmentCluster = (cursor, token, segment) => {
140
+ const cluster = shortCluster(token, ENV_SHORT_VALUE_OPTIONS);
141
+ if (cluster.option === undefined)
142
+ return { ...cursor, index: cursor.index + 1 };
143
+ const value = cluster.attached || segment.tokens[cursor.index + 1];
144
+ const index = cursor.index + (cluster.attached.length > 0 ? 1 : 2);
145
+ if (cluster.option === "S" && value !== undefined) {
146
+ return environmentSplit(cursor.cwd, value);
147
+ }
148
+ if (cluster.option !== "C" || value === undefined)
149
+ return { ...cursor, index };
150
+ const home = segment.user.homeDirectory;
151
+ return { cwd: changedDirectory(cursor.cwd, value, home), index };
152
+ };
153
+ const environmentLongOption = (cursor, token, segment) => {
154
+ const home = segment.user.homeDirectory;
155
+ if (token === "--chdir") {
156
+ const target = segment.tokens[cursor.index + 1];
157
+ const cwd = target === undefined
158
+ ? cursor.cwd
159
+ : changedDirectory(cursor.cwd, target, home);
160
+ return { cwd, index: cursor.index + 2 };
161
+ }
162
+ if (token.startsWith("--chdir=")) {
163
+ const cwd = changedDirectory(cursor.cwd, token.slice(8), home);
164
+ return { cwd, index: cursor.index + 1 };
165
+ }
166
+ if (token === "--split-string") {
167
+ const command = segment.tokens[cursor.index + 1];
168
+ if (command === undefined)
169
+ return { ...cursor, index: segment.tokens.length };
170
+ return environmentSplit(cursor.cwd, command);
171
+ }
172
+ return token.startsWith("--split-string=")
173
+ ? environmentSplit(cursor.cwd, token.slice("--split-string=".length))
174
+ : undefined;
175
+ };
176
+ const environmentOption = (cursor, token, segment) => {
177
+ if (ASSIGNMENT.test(token))
178
+ return { ...cursor, index: cursor.index + 1 };
179
+ const long = environmentLongOption(cursor, token, segment);
180
+ if (long !== undefined)
181
+ return long;
182
+ if (token === "-S" && segment.tokens[cursor.index + 1] === undefined) {
183
+ return { ...cursor, index: segment.tokens.length };
184
+ }
185
+ if (!token.startsWith("--"))
186
+ return environmentCluster(cursor, token, segment);
187
+ const skip = ENV_VALUE_OPTIONS.has(token) ? 2 : 1;
188
+ return { ...cursor, index: cursor.index + skip };
189
+ };
190
+ const unwrapEnvironment = (cursor, segment) => {
191
+ const token = segment.tokens[cursor.index];
192
+ if (token === undefined)
193
+ return cursor;
194
+ if (token === "--")
195
+ return { ...cursor, index: cursor.index + 1 };
196
+ // A lone `-` means `-i` to env; skip it like any other option.
197
+ if (!token.startsWith("-") && !ASSIGNMENT.test(token))
198
+ return cursor;
199
+ const next = environmentOption(cursor, token, segment);
200
+ return "kind" in next ? next : unwrapEnvironment(next, segment);
201
+ };
202
+ const skipOptions = (tokens, index, valueOptions) => {
203
+ const token = tokens[index];
204
+ if (token === "--")
205
+ return index + 1;
206
+ if (token?.startsWith("-") !== true || token === "-")
207
+ return index;
208
+ const skip = valueOptions.has(token) ? 2 : 1;
209
+ return skipOptions(tokens, index + skip, valueOptions);
210
+ };
211
+ const skipAssignments = (tokens, index) => ASSIGNMENT.test(tokens[index] ?? "")
212
+ ? skipAssignments(tokens, index + 1)
213
+ : index;
214
+ const unwrap = (name, cursor, segment) => {
215
+ if (name === "sudo")
216
+ return unwrapSudo(cursor, segment);
217
+ if (name === "env")
218
+ return unwrapEnvironment(cursor, segment);
219
+ if (name === "command") {
220
+ return {
221
+ ...cursor,
222
+ index: skipOptions(segment.tokens, cursor.index, new Set()),
223
+ };
224
+ }
225
+ if (name !== "exec")
226
+ return undefined;
227
+ const index = skipOptions(segment.tokens, cursor.index, new Set(["-a"]));
228
+ return { ...cursor, index };
229
+ };
230
+ const locateFrom = (cursor, segment) => {
231
+ const index = skipAssignments(segment.tokens, cursor.index);
232
+ const token = segment.tokens[index];
233
+ if (token === undefined)
234
+ return undefined;
235
+ const name = basename(token);
236
+ const next = unwrap(name, { cwd: cursor.cwd, index: index + 1 }, segment);
237
+ if (next === undefined)
238
+ return { cwd: cursor.cwd, index, kind: "command", name };
239
+ return "kind" in next ? next : locateFrom(next, segment);
240
+ };
241
+ /**
242
+ * Finds the executable one segment runs after leading assignments and the
243
+ * `sudo`, `env`, `command` and `exec` wrappers, with the working directory
244
+ * their `--chdir` and login options select.
245
+ */
246
+ export const locateCommand = (tokens, cwd, user) => locateFrom({ cwd, index: 0 }, { tokens, user });
247
+ //# sourceMappingURL=command-wrappers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-wrappers.js","sourceRoot":"","sources":["../../../src/extensions/safety/command-wrappers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ export type DestructiveCommandInput = {
2
+ readonly command: string;
3
+ readonly cwd: string;
4
+ readonly homeDir: string;
5
+ readonly uid?: number;
6
+ };
7
+ export type DestructiveOperation = "find" | "rm";
8
+ export type GuardReasonCode = "PARSER_DEPTH_EXCEEDED" | "PROTECTED_ROOT_ERASURE";
9
+ export type GuardDecision = {
10
+ readonly decision: "allow";
11
+ } | {
12
+ readonly decision: "block";
13
+ readonly operation: DestructiveOperation;
14
+ readonly reasonCode: GuardReasonCode;
15
+ };
16
+ /**
17
+ * Blocks recursive `rm` and `find -delete` against `/`, `/root`, the home
18
+ * directory or one of its ancestors. It follows straight-line `cd`, the
19
+ * `sudo`, `env`, `command` and `exec` wrappers and nested `sh -c` or
20
+ * `bash -c` commands up to four levels, and blocks deeper nesting. This
21
+ * tripwire guards against accidental loss; it gives no sandbox.
22
+ */
23
+ export declare const inspectDestructiveCommand: (input: DestructiveCommandInput) => GuardDecision;
24
+ //# sourceMappingURL=destructive-guard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"destructive-guard.d.ts","sourceRoot":"","sources":["../../../src/extensions/safety/destructive-guard.ts"],"names":[],"mappings":"AAuBA,MAAM,MAAM,uBAAuB,GAAG;IACpC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG,MAAM,GAAG,IAAI,CAAC;AACjD,MAAM,MAAM,eAAe,GACzB,uBAAuB,GAAG,wBAAwB,CAAC;AAErD,MAAM,MAAM,aAAa,GACrB;IAAE,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,GAC9B;IACE,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,oBAAoB,CAAC;IACzC,QAAQ,CAAC,UAAU,EAAE,eAAe,CAAC;CACtC,CAAC;AAkNN;;;;;;GAMG;AACH,eAAO,MAAM,yBAAyB,UAC7B,uBAAuB,KAC7B,aAIU,CAAC"}
@@ -0,0 +1,178 @@
1
+ // Provenance: a reviewed port of vllnt/pi-config
2
+ // extensions/pi-safety/destructive-guard.ts at commit
3
+ // b90808fbd2e51301ab8351367c69c5166c44ead7, rewritten without loops for the
4
+ // Maia lint rules (D-069).
5
+ import { dirname, resolve } from "node:path";
6
+ import { changedDirectory, locateCommand, } from "./command-wrappers.js";
7
+ import { expandHome, restoreLiterals, tokenizeSegments, } from "./shell-tokens.js";
8
+ const COMMAND_CANDIDATE = /\b(?:bash|find|rm|sh)\b/u;
9
+ const DELETION_CANDIDATE = /(?:--r\S*|-\S*[rR]\S*|-delete)\b/u;
10
+ const WHOLE_CONTENT_SUFFIX = /\/(?:\*|\.\*|\{\*,\.\*\})\/?$/u;
11
+ const SHELLS = new Set(["bash", "sh"]);
12
+ const MAXIMUM_SHELL_DEPTH = 4;
13
+ const allow = () => ({ decision: "allow" });
14
+ const block = (operation) => ({
15
+ decision: "block",
16
+ operation,
17
+ reasonCode: "PROTECTED_ROOT_ERASURE",
18
+ });
19
+ const blockAtParserLimit = (command) => ({
20
+ decision: "block",
21
+ operation: /\bfind\b/u.test(command) ? "find" : "rm",
22
+ reasonCode: "PARSER_DEPTH_EXCEEDED",
23
+ });
24
+ const protectedAncestors = (roots, current) => {
25
+ const next = new Set([...roots, current]);
26
+ return current === "/" ? next : protectedAncestors(next, dirname(current));
27
+ };
28
+ const targetsProtectedRoot = (target, invocation) => {
29
+ const expanded = expandHome(target, invocation.homeDirectory).replace(WHOLE_CONTENT_SUFFIX, "");
30
+ if (/[*?[]/u.test(expanded))
31
+ return false;
32
+ const roots = protectedAncestors(new Set(["/", "/root"]), resolve(invocation.homeDirectory));
33
+ return roots.has(resolve(invocation.cwd, expanded || "/"));
34
+ };
35
+ const readRmArgument = (state, token) => {
36
+ if (state.optionsEnded || token === "-") {
37
+ state.targets.push(token);
38
+ }
39
+ else if (token === "--") {
40
+ state.optionsEnded = true;
41
+ }
42
+ else if (token.startsWith("--")) {
43
+ state.recursive ||= token.length >= 3 && "--recursive".startsWith(token);
44
+ }
45
+ else if (token.startsWith("-")) {
46
+ state.recursive ||= /^-[^-]*[rR]/u.test(token);
47
+ }
48
+ else {
49
+ state.targets.push(token);
50
+ }
51
+ return state;
52
+ };
53
+ const inspectRm = (invocation) => {
54
+ const parsed = invocation.tokens
55
+ .slice(invocation.index + 1)
56
+ .reduce(readRmArgument, {
57
+ optionsEnded: false,
58
+ recursive: false,
59
+ targets: [],
60
+ });
61
+ if (!parsed.recursive)
62
+ return allow();
63
+ return parsed.targets.some((target) => targetsProtectedRoot(target, invocation))
64
+ ? block("rm")
65
+ : allow();
66
+ };
67
+ const findStartPoints = (tokens, index, points) => {
68
+ const token = tokens[index];
69
+ if (token === undefined)
70
+ return points;
71
+ if (token === "--")
72
+ return findStartPoints(tokens, index + 1, points);
73
+ if (token === "-D")
74
+ return findStartPoints(tokens, index + 2, points);
75
+ if (/^-(?:[HLP]|O\d*)$/u.test(token)) {
76
+ return findStartPoints(tokens, index + 1, points);
77
+ }
78
+ if (token.startsWith("-") || token === "!" || token === "(")
79
+ return points;
80
+ return findStartPoints(tokens, index + 1, [...points, token]);
81
+ };
82
+ const inspectFind = (invocation) => {
83
+ const arguments_ = invocation.tokens.slice(invocation.index + 1);
84
+ if (!arguments_.includes("-delete"))
85
+ return allow();
86
+ const points = findStartPoints(invocation.tokens, invocation.index + 1, []);
87
+ const targets = points.length === 0 ? ["."] : points;
88
+ return targets.some((target) => targetsProtectedRoot(target, invocation))
89
+ ? block("find")
90
+ : allow();
91
+ };
92
+ const isCommandStringOption = (option) => option.startsWith("-") &&
93
+ !option.startsWith("--") &&
94
+ option.slice(1).includes("c");
95
+ const nestedShellCommand = (invocation) => {
96
+ const { index, tokens } = invocation;
97
+ const at = tokens.findIndex((option, position) => position > index &&
98
+ position < tokens.length - 1 &&
99
+ isCommandStringOption(option));
100
+ const command = at < 0 ? undefined : tokens[at + 1];
101
+ return command === undefined ? undefined : restoreLiterals(command);
102
+ };
103
+ // The target of `cd`, the home directory without one, or undefined for an
104
+ // unknown option, which leaves the directory unchanged.
105
+ const cdTarget = (tokens, index, home) => {
106
+ const token = tokens[index];
107
+ if (token === "--")
108
+ return tokens[index + 1] ?? home;
109
+ if (token === undefined)
110
+ return home;
111
+ if (/^-[LPe@]+$/u.test(token))
112
+ return cdTarget(tokens, index + 1, home);
113
+ return token.startsWith("-") && token !== "-" ? undefined : token;
114
+ };
115
+ const cdDirectory = (invocation) => {
116
+ const home = invocation.homeDirectory;
117
+ const target = cdTarget(invocation.tokens, invocation.index + 1, home);
118
+ return target === undefined
119
+ ? invocation.cwd
120
+ : changedDirectory(invocation.cwd, target, home);
121
+ };
122
+ const inspectCommand = (invocation, name, context) => {
123
+ if (name === "rm")
124
+ return inspectRm(invocation);
125
+ if (name === "find")
126
+ return inspectFind(invocation);
127
+ if (!SHELLS.has(name))
128
+ return allow();
129
+ const nested = nestedShellCommand(invocation);
130
+ if (nested === undefined)
131
+ return allow();
132
+ const input = { ...context.input, command: nested, cwd: invocation.cwd };
133
+ return inspectSegments(input, context.depth + 1);
134
+ };
135
+ const scanSegment = (scan, tokens, context) => {
136
+ if (scan.decision.decision === "block")
137
+ return scan;
138
+ const user = {
139
+ homeDirectory: context.input.homeDir,
140
+ ...(context.input.uid === undefined ? {} : { uid: context.input.uid }),
141
+ };
142
+ const located = locateCommand(tokens, scan.cwd, user);
143
+ if (located === undefined)
144
+ return scan;
145
+ if (located.kind === "split") {
146
+ const input = {
147
+ ...context.input,
148
+ command: located.command,
149
+ cwd: located.cwd,
150
+ };
151
+ return { ...scan, decision: inspectSegments(input, context.depth + 1) };
152
+ }
153
+ const invocation = { ...located, homeDirectory: user.homeDirectory, tokens };
154
+ if (located.name === "cd")
155
+ return { ...scan, cwd: cdDirectory(invocation) };
156
+ return {
157
+ ...scan,
158
+ decision: inspectCommand(invocation, located.name, context),
159
+ };
160
+ };
161
+ const inspectSegments = (input, depth) => {
162
+ if (depth > MAXIMUM_SHELL_DEPTH)
163
+ return blockAtParserLimit(input.command);
164
+ const context = { depth, input };
165
+ return tokenizeSegments(input.command).reduce((scan, tokens) => scanSegment(scan, tokens, context), { cwd: input.cwd, decision: allow() }).decision;
166
+ };
167
+ /**
168
+ * Blocks recursive `rm` and `find -delete` against `/`, `/root`, the home
169
+ * directory or one of its ancestors. It follows straight-line `cd`, the
170
+ * `sudo`, `env`, `command` and `exec` wrappers and nested `sh -c` or
171
+ * `bash -c` commands up to four levels, and blocks deeper nesting. This
172
+ * tripwire guards against accidental loss; it gives no sandbox.
173
+ */
174
+ export const inspectDestructiveCommand = (input) => COMMAND_CANDIDATE.test(input.command) &&
175
+ DELETION_CANDIDATE.test(input.command)
176
+ ? inspectSegments(input, 0)
177
+ : allow();
178
+ //# sourceMappingURL=destructive-guard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"destructive-guard.js","sourceRoot":"","sources":["../../../src/extensions/safety/destructive-guard.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { type DestructiveCommandInput, type DestructiveOperation, type GuardDecision, inspectDestructiveCommand, } from "./destructive-guard.js";
2
+ export { registerSafetyGuard as safetyExtension } from "./lifecycle.js";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/extensions/safety/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,uBAAuB,EAC5B,KAAK,oBAAoB,EACzB,KAAK,aAAa,EAClB,yBAAyB,GAC1B,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,mBAAmB,IAAI,eAAe,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { inspectDestructiveCommand, } from "./destructive-guard.js";
2
+ export { registerSafetyGuard as safetyExtension } from "./lifecycle.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/extensions/safety/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,yBAAyB,GAC1B,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,mBAAmB,IAAI,eAAe,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
2
+ export declare const registerSafetyGuard: (pi: ExtensionAPI) => void;
3
+ //# sourceMappingURL=lifecycle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../../../src/extensions/safety/lifecycle.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,YAAY,EAIb,MAAM,iCAAiC,CAAC;AAsHzC,eAAO,MAAM,mBAAmB,OAAQ,YAAY,KAAG,IAGtD,CAAC"}