@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.
- package/CHANGELOG.md +27 -0
- package/LICENSE +21 -0
- package/README.md +71 -624
- package/dist/core/agent-session.d.ts +4 -0
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +193 -43
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/extensions/loader.d.ts.map +1 -1
- package/dist/core/extensions/loader.js +6 -13
- package/dist/core/extensions/loader.js.map +1 -1
- package/dist/core/extensions/types.d.ts +2 -0
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/model-resolver.d.ts +1 -0
- package/dist/core/model-resolver.d.ts.map +1 -1
- package/dist/core/model-resolver.js +13 -3
- package/dist/core/model-resolver.js.map +1 -1
- package/dist/core/remote-catalog-provider.d.ts.map +1 -1
- package/dist/core/remote-catalog-provider.js +19 -1
- package/dist/core/remote-catalog-provider.js.map +1 -1
- package/dist/core/resource-loader.d.ts.map +1 -1
- package/dist/core/resource-loader.js +3 -0
- package/dist/core/resource-loader.js.map +1 -1
- package/dist/core/tools/tool-definition-wrapper.d.ts +7 -2
- package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -1
- package/dist/core/tools/tool-definition-wrapper.js.map +1 -1
- package/dist/extensions/llama/provider.d.ts.map +1 -1
- package/dist/extensions/llama/provider.js +6 -0
- package/dist/extensions/llama/provider.js.map +1 -1
- package/dist/modes/interactive/components/custom-message.d.ts +3 -1
- package/dist/modes/interactive/components/custom-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/custom-message.js +10 -2
- package/dist/modes/interactive/components/custom-message.js.map +1 -1
- package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/scoped-models-selector.js +22 -13
- package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +53 -28
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/docs/bundled/README.md +38 -0
- package/docs/bundled/extensions/README.md +18 -0
- package/docs/bundled/extensions/deepwiki.md +62 -0
- package/docs/bundled/extensions/question.md +48 -0
- package/docs/bundled/extensions/rewind.md +75 -0
- package/docs/bundled/extensions/router.md +126 -0
- package/docs/bundled/extensions/statusline.md +109 -0
- package/docs/bundled/extensions/subagent.md +95 -0
- package/docs/bundled/extensions/todo.md +28 -0
- package/docs/bundled/themes.md +51 -0
- package/docs/bundled/tool-presentation.md +85 -0
- package/docs/compaction.md +20 -14
- package/docs/containerization.md +1 -1
- package/docs/custom-provider.md +8 -8
- package/docs/docs.json +57 -9
- package/docs/extensions.md +14 -13
- package/docs/index.md +12 -7
- package/docs/json.md +4 -4
- package/docs/providers.md +1 -1
- package/docs/rpc.md +3 -9
- package/docs/session-format.md +5 -5
- package/docs/skills.md +1 -1
- package/docs/themes.md +4 -8
- package/docs/tui.md +1 -1
- package/examples/extensions/README.md +0 -1
- package/examples/extensions/custom-provider-anthropic/index.ts +4 -4
- package/examples/extensions/custom-provider-anthropic/package-lock.json +3 -3
- package/examples/extensions/custom-provider-gitlab-duo/index.ts +2 -2
- package/examples/extensions/custom-provider-gitlab-duo/test.ts +1 -1
- package/examples/extensions/doom-overlay/doom/build/doom.wasm +0 -0
- package/examples/extensions/doom-overlay/doom/build.sh +0 -0
- package/examples/extensions/dynamic-resources/dynamic.json +1 -1
- package/examples/extensions/gondolin/index.ts +4 -6
- package/examples/extensions/message-renderer.ts +2 -2
- package/examples/extensions/overlay-qa-tests.ts +2 -2
- package/examples/extensions/project-trust.ts +2 -2
- package/examples/extensions/sandbox/package-lock.json +1 -1
- package/examples/extensions/with-deps/package-lock.json +2 -2
- package/examples/sdk/README.md +38 -44
- package/npm-shrinkwrap.json +3465 -624
- package/package.json +34 -18
- package/docs/development.md +0 -71
- package/examples/extensions/subagent/README.md +0 -175
- package/examples/extensions/subagent/agents/planner.md +0 -37
- package/examples/extensions/subagent/agents/reviewer.md +0 -35
- package/examples/extensions/subagent/agents/scout.md +0 -50
- package/examples/extensions/subagent/agents/worker.md +0 -24
- package/examples/extensions/subagent/agents.ts +0 -126
- package/examples/extensions/subagent/index.ts +0 -1009
- package/examples/extensions/subagent/prompts/implement-and-review.md +0 -10
- package/examples/extensions/subagent/prompts/implement.md +0 -10
- 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
|
-
*
|
|
13
|
+
* npm install --prefix examples/extensions/custom-provider-anthropic
|
|
14
14
|
*
|
|
15
15
|
* # With OAuth (run /login custom-anthropic first)
|
|
16
|
-
* pi -e
|
|
16
|
+
* pi -e examples/extensions/custom-provider-anthropic
|
|
17
17
|
*
|
|
18
18
|
* # With API key
|
|
19
|
-
* CUSTOM_ANTHROPIC_API_KEY=sk-ant-... pi -e
|
|
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": "
|
|
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
|
|
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
|
|
File without changes
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"$schema": "https://raw.githubusercontent.com/
|
|
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
|
-
*
|
|
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
|
-
*
|
|
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(
|
|
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="/
|
|
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
|
|
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
|
|
7
|
+
* cp examples/extensions/project-trust.ts ~/.pi/agent/extensions/
|
|
8
8
|
*
|
|
9
9
|
* Or:
|
|
10
10
|
*
|
|
11
|
-
* pi -e
|
|
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
|
*/
|
package/examples/sdk/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# SDK Examples
|
|
2
2
|
|
|
3
|
-
Programmatic usage of pi
|
|
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-
|
|
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
|
-
|
|
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
|
-
//
|
|
49
|
+
// Select a built-in model.
|
|
50
|
+
const modelRuntime = await ModelRuntime.create();
|
|
50
51
|
const model = getModel("anthropic", "claude-opus-4-5");
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
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
|
|
58
|
-
const { session } = await createAgentSession({
|
|
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
|
-
//
|
|
70
|
-
const
|
|
71
|
-
|
|
72
|
-
|
|
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
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
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
|
|
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
|
-
//
|
|
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);
|