@astralyn/pi 0.82.1 → 0.82.3

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 (91) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/LICENSE +21 -0
  3. package/README.md +71 -624
  4. package/dist/core/agent-session.d.ts +4 -0
  5. package/dist/core/agent-session.d.ts.map +1 -1
  6. package/dist/core/agent-session.js +193 -43
  7. package/dist/core/agent-session.js.map +1 -1
  8. package/dist/core/extensions/loader.d.ts.map +1 -1
  9. package/dist/core/extensions/loader.js +6 -13
  10. package/dist/core/extensions/loader.js.map +1 -1
  11. package/dist/core/extensions/types.d.ts +2 -0
  12. package/dist/core/extensions/types.d.ts.map +1 -1
  13. package/dist/core/extensions/types.js.map +1 -1
  14. package/dist/core/model-resolver.d.ts +1 -0
  15. package/dist/core/model-resolver.d.ts.map +1 -1
  16. package/dist/core/model-resolver.js +13 -3
  17. package/dist/core/model-resolver.js.map +1 -1
  18. package/dist/core/remote-catalog-provider.d.ts.map +1 -1
  19. package/dist/core/remote-catalog-provider.js +19 -1
  20. package/dist/core/remote-catalog-provider.js.map +1 -1
  21. package/dist/core/resource-loader.d.ts.map +1 -1
  22. package/dist/core/resource-loader.js +3 -0
  23. package/dist/core/resource-loader.js.map +1 -1
  24. package/dist/core/tools/tool-definition-wrapper.d.ts +7 -2
  25. package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -1
  26. package/dist/core/tools/tool-definition-wrapper.js.map +1 -1
  27. package/dist/extensions/llama/provider.d.ts.map +1 -1
  28. package/dist/extensions/llama/provider.js +6 -0
  29. package/dist/extensions/llama/provider.js.map +1 -1
  30. package/dist/modes/interactive/components/custom-message.d.ts +3 -1
  31. package/dist/modes/interactive/components/custom-message.d.ts.map +1 -1
  32. package/dist/modes/interactive/components/custom-message.js +10 -2
  33. package/dist/modes/interactive/components/custom-message.js.map +1 -1
  34. package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
  35. package/dist/modes/interactive/components/scoped-models-selector.js +22 -13
  36. package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
  37. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  38. package/dist/modes/interactive/interactive-mode.js +53 -28
  39. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  40. package/docs/bundled/README.md +38 -0
  41. package/docs/bundled/extensions/README.md +18 -0
  42. package/docs/bundled/extensions/deepwiki.md +62 -0
  43. package/docs/bundled/extensions/question.md +48 -0
  44. package/docs/bundled/extensions/rewind.md +75 -0
  45. package/docs/bundled/extensions/router.md +126 -0
  46. package/docs/bundled/extensions/statusline.md +109 -0
  47. package/docs/bundled/extensions/subagent.md +95 -0
  48. package/docs/bundled/extensions/todo.md +28 -0
  49. package/docs/bundled/themes.md +51 -0
  50. package/docs/bundled/tool-presentation.md +85 -0
  51. package/docs/compaction.md +20 -14
  52. package/docs/containerization.md +1 -1
  53. package/docs/custom-provider.md +8 -8
  54. package/docs/docs.json +57 -9
  55. package/docs/extensions.md +14 -13
  56. package/docs/index.md +12 -7
  57. package/docs/json.md +4 -4
  58. package/docs/providers.md +1 -1
  59. package/docs/rpc.md +3 -9
  60. package/docs/session-format.md +5 -5
  61. package/docs/skills.md +1 -1
  62. package/docs/themes.md +4 -8
  63. package/docs/tui.md +1 -1
  64. package/examples/extensions/README.md +0 -1
  65. package/examples/extensions/custom-provider-anthropic/index.ts +4 -4
  66. package/examples/extensions/custom-provider-anthropic/package-lock.json +3 -3
  67. package/examples/extensions/custom-provider-gitlab-duo/index.ts +2 -2
  68. package/examples/extensions/custom-provider-gitlab-duo/test.ts +1 -1
  69. package/examples/extensions/doom-overlay/doom/build/doom.wasm +0 -0
  70. package/examples/extensions/doom-overlay/doom/build.sh +0 -0
  71. package/examples/extensions/dynamic-resources/dynamic.json +1 -1
  72. package/examples/extensions/gondolin/index.ts +4 -6
  73. package/examples/extensions/message-renderer.ts +2 -2
  74. package/examples/extensions/overlay-qa-tests.ts +2 -2
  75. package/examples/extensions/project-trust.ts +2 -2
  76. package/examples/extensions/sandbox/package-lock.json +1 -1
  77. package/examples/extensions/with-deps/package-lock.json +2 -2
  78. package/examples/sdk/README.md +38 -44
  79. package/npm-shrinkwrap.json +3465 -624
  80. package/package.json +34 -18
  81. package/docs/development.md +0 -71
  82. package/examples/extensions/subagent/README.md +0 -175
  83. package/examples/extensions/subagent/agents/planner.md +0 -37
  84. package/examples/extensions/subagent/agents/reviewer.md +0 -35
  85. package/examples/extensions/subagent/agents/scout.md +0 -50
  86. package/examples/extensions/subagent/agents/worker.md +0 -24
  87. package/examples/extensions/subagent/agents.ts +0 -126
  88. package/examples/extensions/subagent/index.ts +0 -1009
  89. package/examples/extensions/subagent/prompts/implement-and-review.md +0 -10
  90. package/examples/extensions/subagent/prompts/implement.md +0 -10
  91. package/examples/extensions/subagent/prompts/scout-and-plan.md +0 -9
@@ -8,15 +8,15 @@
8
8
  * - API key support via environment variable
9
9
  * - Two model definitions
10
10
  *
11
- * Usage:
11
+ * Usage (from the repository or package root):
12
12
  * # First install dependencies
13
- * cd packages/coding-agent/examples/extensions/custom-provider && npm install
13
+ * npm install --prefix examples/extensions/custom-provider-anthropic
14
14
  *
15
15
  * # With OAuth (run /login custom-anthropic first)
16
- * pi -e ./packages/coding-agent/examples/extensions/custom-provider
16
+ * pi -e examples/extensions/custom-provider-anthropic
17
17
  *
18
18
  * # With API key
19
- * CUSTOM_ANTHROPIC_API_KEY=sk-ant-... pi -e ./packages/coding-agent/examples/extensions/custom-provider
19
+ * CUSTOM_ANTHROPIC_API_KEY=sk-ant-... pi -e examples/extensions/custom-provider-anthropic
20
20
  *
21
21
  * Then use /model to select custom-anthropic/claude-sonnet-4-5
22
22
  */
@@ -1,14 +1,14 @@
1
1
  {
2
- "name": "pi-extension-custom-provider",
2
+ "name": "pi-extension-custom-provider-anthropic",
3
3
  "version": "0.82.0",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
- "name": "pi-extension-custom-provider",
8
+ "name": "pi-extension-custom-provider-anthropic",
9
9
  "version": "0.82.0",
10
10
  "dependencies": {
11
- "@anthropic-ai/sdk": "^0.52.0"
11
+ "@anthropic-ai/sdk": "0.52.0"
12
12
  }
13
13
  },
14
14
  "node_modules/@anthropic-ai/sdk": {
@@ -4,8 +4,8 @@
4
4
  * Provides access to GitLab Duo AI models (Claude and GPT) through GitLab's AI Gateway.
5
5
  * Delegates to pi-ai's built-in Anthropic and OpenAI streaming implementations.
6
6
  *
7
- * Usage:
8
- * pi -e ./packages/coding-agent/examples/extensions/custom-provider-gitlab-duo
7
+ * Usage (from the repository or package root):
8
+ * pi -e examples/extensions/custom-provider-gitlab-duo
9
9
  * # Then /login gitlab-duo, or set GITLAB_TOKEN=glpat-...
10
10
  */
11
11
 
@@ -8,9 +8,9 @@
8
8
  * npx tsx test.ts claude-sonnet-4-5-20250929 --thinking
9
9
  */
10
10
 
11
+ import { getAgentDir } from "@astralyn/pi";
11
12
  import { type Api, type Context, type Model, registerApiProvider, streamSimple } from "@earendil-works/pi-ai/compat";
12
13
  import { readFileSync } from "fs";
13
- import { getAgentDir } from "packages/coding-agent/src/config.js";
14
14
  import { join } from "path";
15
15
  import { MODELS, streamGitLabDuo } from "./index.ts";
16
16
 
File without changes
@@ -1,5 +1,5 @@
1
1
  {
2
- "$schema": "https://raw.githubusercontent.com/earendil-works/pi/main/packages/coding-agent/src/modes/interactive/theme/theme-schema.json",
2
+ "$schema": "https://raw.githubusercontent.com/ming-kang/pi/main/src/modes/interactive/theme/theme-schema.json",
3
3
  "name": "dynamic-resources",
4
4
  "vars": {
5
5
  "cyan": "#00d7ff",
@@ -6,13 +6,11 @@
6
6
  * /workspace write through to the host; other guest filesystem changes are
7
7
  * isolated to the VM.
8
8
  *
9
- * Setup:
10
- * cd packages/coding-agent/examples/extensions/gondolin
11
- * npm install --ignore-scripts
9
+ * Setup (from the repository or package root):
10
+ * npm install --ignore-scripts --prefix examples/extensions/gondolin
12
11
  *
13
- * Usage:
14
- * cd /path/to/project
15
- * pi -e /path/to/pi/packages/coding-agent/examples/extensions/gondolin
12
+ * Usage (from the project that should be mounted at /workspace):
13
+ * pi -e /absolute/path/to/pi/examples/extensions/gondolin
16
14
  *
17
15
  * Requirements:
18
16
  * - Node.js >= 23.6.0 for @earendil-works/gondolin
@@ -12,7 +12,7 @@ import { Box, Text } from "@earendil-works/pi-tui";
12
12
 
13
13
  export default function (pi: ExtensionAPI) {
14
14
  // Register custom renderer for "status-update" messages
15
- pi.registerMessageRenderer("status-update", (message, { expanded }, theme) => {
15
+ pi.registerMessageRenderer("status-update", (message, { expanded, outputPad }, theme) => {
16
16
  const details = message.details as { level: string; timestamp: number } | undefined;
17
17
  const level = details?.level ?? "info";
18
18
 
@@ -29,7 +29,7 @@ export default function (pi: ExtensionAPI) {
29
29
  }
30
30
 
31
31
  // Use Box with customMessageBg for consistent styling
32
- const box = new Box(1, 1, (t) => theme.bg("customMessageBg", t));
32
+ const box = new Box(outputPad, 1, (t) => theme.bg("customMessageBg", t));
33
33
  box.addChild(new Text(text, 0, 0));
34
34
  return box;
35
35
  });
@@ -485,13 +485,13 @@ class StreamingOverflowComponent extends BaseOverlay {
485
485
  echo ""
486
486
  for i in $(seq 1 100); do
487
487
  # Simulate long file paths with OSC 8 hyperlinks (clickable) - tests width overflow
488
- DIR="/Users/nicobailon/Documents/development/pi-mono/packages/coding-agent/src/modes/interactive"
488
+ DIR="/opt/overlay-qa-fixtures/a-deliberately-long-project-directory/src/modes/interactive"
489
489
  FILE="\${DIR}/components/very-long-component-name-that-exceeds-width-\${i}.ts"
490
490
  echo -e "\\033]8;;file://\${FILE}\\007▶ read: \${FILE}\\033]8;;\\007"
491
491
 
492
492
  # Add some colored status messages with long text
493
493
  if [ $((i % 5)) -eq 0 ]; then
494
- echo -e " \\033[32m✓ Successfully processed \${i} files in /Users/nicobailon/Documents/development/pi-mono\\033[0m"
494
+ echo -e " \\033[32m✓ Successfully processed \${i} files in \${DIR}\\033[0m"
495
495
  fi
496
496
  if [ $((i % 7)) -eq 0 ]; then
497
497
  echo -e " \\033[33m⚠ Warning: potential issue detected at line \${i} in very-long-component-name-that-exceeds-width.ts\\033[0m"
@@ -4,11 +4,11 @@
4
4
  * Demonstrates the project_trust event. Install globally or pass via -e:
5
5
  *
6
6
  * mkdir -p ~/.pi/agent/extensions
7
- * cp packages/coding-agent/examples/extensions/project-trust.ts ~/.pi/agent/extensions/
7
+ * cp examples/extensions/project-trust.ts ~/.pi/agent/extensions/
8
8
  *
9
9
  * Or:
10
10
  *
11
- * pi -e packages/coding-agent/examples/extensions/project-trust.ts
11
+ * pi -e examples/extensions/project-trust.ts
12
12
  *
13
13
  * Try it in a project containing .pi, AGENTS.md/CLAUDE.md, or .agents/skills.
14
14
  */
@@ -8,7 +8,7 @@
8
8
  "name": "pi-extension-sandbox",
9
9
  "version": "1.12.0",
10
10
  "dependencies": {
11
- "@anthropic-ai/sandbox-runtime": "^0.0.26"
11
+ "@anthropic-ai/sandbox-runtime": "0.0.26"
12
12
  }
13
13
  },
14
14
  "node_modules/@anthropic-ai/sandbox-runtime": {
@@ -8,10 +8,10 @@
8
8
  "name": "pi-extension-with-deps",
9
9
  "version": "0.82.0",
10
10
  "dependencies": {
11
- "ms": "^2.1.3"
11
+ "ms": "2.1.3"
12
12
  },
13
13
  "devDependencies": {
14
- "@types/ms": "^2.1.0"
14
+ "@types/ms": "2.1.0"
15
15
  }
16
16
  },
17
17
  "node_modules/@types/ms": {
@@ -1,6 +1,6 @@
1
1
  # SDK Examples
2
2
 
3
- Programmatic usage of pi-coding-agent via `createAgentSession()` and `createAgentSessionRuntime()`.
3
+ Programmatic usage of `@astralyn/pi` via `createAgentSession()` and `createAgentSessionRuntime()`.
4
4
 
5
5
  The runtime example shows how to build a recreate function that closes over process-global fixed inputs and recreates cwd-bound services and sessions as the active session cwd changes.
6
6
 
@@ -15,7 +15,7 @@ The runtime example shows how to build a recreate function that closes over proc
15
15
  | `05-tools.ts` | Built-in tool allowlists |
16
16
  | `06-extensions.ts` | Logging, blocking, result modification |
17
17
  | `07-context-files.ts` | AGENTS.md context files |
18
- | `08-slash-commands.ts` | File-based slash commands |
18
+ | `08-prompt-templates.ts` | File-based prompt templates |
19
19
  | `09-api-keys-and-oauth.ts` | API key resolution, OAuth config |
20
20
  | `10-settings.ts` | Override compaction, retry, terminal settings |
21
21
  | `11-sessions.ts` | In-memory, persistent, continue, list sessions |
@@ -24,75 +24,69 @@ The runtime example shows how to build a recreate function that closes over proc
24
24
 
25
25
  ## Running
26
26
 
27
+ From the repository root, or from the root of an unpacked npm package:
28
+
27
29
  ```bash
28
- cd packages/coding-agent
29
30
  npx tsx examples/sdk/01-minimal.ts
30
31
  ```
31
32
 
32
33
  ## Quick Reference
33
34
 
34
35
  ```typescript
35
- import { getModel } from "@earendil-works/pi-ai";
36
36
  import {
37
37
  createAgentSession,
38
38
  DefaultResourceLoader,
39
+ getAgentDir,
39
40
  ModelRuntime,
40
41
  SessionManager,
41
42
  SettingsManager,
42
43
  } from "@astralyn/pi";
44
+ import { getModel } from "@earendil-works/pi-ai/compat";
43
45
 
44
- const modelRuntime = await ModelRuntime.create();
45
-
46
- // Minimal
47
- const { session } = await createAgentSession({ modelRuntime });
46
+ // Minimal: uses the default model, resources, tools, settings, and session storage.
47
+ const { session } = await createAgentSession();
48
48
 
49
- // Custom model
49
+ // Select a built-in model.
50
+ const modelRuntime = await ModelRuntime.create();
50
51
  const model = getModel("anthropic", "claude-opus-4-5");
51
- const { session } = await createAgentSession({ model, thinkingLevel: "high", modelRuntime });
52
-
53
- // Modify prompt
54
- const loader = new DefaultResourceLoader({
55
- systemPromptOverride: (base) => `${base}\n\nBe concise.`,
52
+ if (model) {
53
+ const { session: modelSession } = await createAgentSession({
54
+ model,
55
+ thinkingLevel: "high",
56
+ modelRuntime,
57
+ });
58
+ }
59
+
60
+ // Replace the system prompt.
61
+ const resourceLoader = new DefaultResourceLoader({
62
+ cwd: process.cwd(),
63
+ agentDir: getAgentDir(),
64
+ systemPromptOverride: () => "You are helpful and concise.",
65
+ appendSystemPromptOverride: () => [],
56
66
  });
57
- await loader.reload();
58
- const { session } = await createAgentSession({ resourceLoader: loader, modelRuntime });
59
-
60
- // Read-only
61
- const { session } = await createAgentSession({ tools: ["read", "grep", "find", "ls"], modelRuntime });
62
-
63
- // In-memory
64
- const { session } = await createAgentSession({
67
+ await resourceLoader.reload();
68
+ const { session: promptSession } = await createAgentSession({
69
+ resourceLoader,
65
70
  sessionManager: SessionManager.inMemory(),
66
- modelRuntime,
67
71
  });
68
72
 
69
- // Full control
70
- const customRuntime = await ModelRuntime.create({
71
- authPath: "/my/app/auth.json",
72
- modelsPath: "/my/app/models.json",
73
+ // Enable only read-only built-in tools and keep the session in memory.
74
+ const { session: readOnlySession } = await createAgentSession({
75
+ tools: ["read", "grep", "find", "ls"],
76
+ sessionManager: SessionManager.inMemory(),
73
77
  });
74
- customRuntime.setRuntimeApiKey("anthropic", process.env.MY_KEY!);
75
78
 
76
- const resourceLoader = new DefaultResourceLoader({
77
- systemPromptOverride: () => "You are helpful.",
78
- extensionFactories: [myExtension],
79
- skillsOverride: () => ({ skills: [], diagnostics: [] }),
80
- agentsFilesOverride: () => ({ agentsFiles: [] }),
81
- promptsOverride: () => ({ prompts: [], diagnostics: [] }),
79
+ // Override settings without file I/O.
80
+ const settingsManager = SettingsManager.inMemory({
81
+ compaction: { enabled: false },
82
+ retry: { enabled: true, maxRetries: 2 },
82
83
  });
83
- await resourceLoader.reload();
84
-
85
- const { session } = await createAgentSession({
86
- model,
87
- modelRuntime: customRuntime,
88
- resourceLoader,
89
- tools: ["read", "bash", "my_tool"],
90
- customTools: [myTool],
84
+ const { session: configuredSession } = await createAgentSession({
85
+ settingsManager,
91
86
  sessionManager: SessionManager.inMemory(),
92
- settingsManager: SettingsManager.inMemory(),
93
87
  });
94
88
 
95
- // Run prompts
89
+ // Stream a response.
96
90
  session.subscribe((event) => {
97
91
  if (event.type === "message_update" && event.assistantMessageEvent.type === "text_delta") {
98
92
  process.stdout.write(event.assistantMessageEvent.delta);