@selesai/code 0.9.10 → 0.9.11
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 +260 -255
- package/dist/cli/args.js +13 -2
- package/dist/cli/args.test.js +8 -0
- package/dist/cli/credential-print.js +4 -4
- package/dist/cli.js +0 -0
- package/dist/core/agent-session-auto-handoff.test.js +24 -1
- package/dist/core/agent-session.d.ts +11 -4
- package/dist/core/agent-session.js +96 -35
- package/dist/core/compaction/branch-summarization.js +30 -30
- package/dist/core/compaction/compaction.js +81 -81
- package/dist/core/compaction/utils.js +2 -2
- package/dist/core/defaults.d.ts +1 -0
- package/dist/core/defaults.js +9 -0
- package/dist/core/export-html/template.css +1066 -1066
- package/dist/core/export-html/template.html +55 -55
- package/dist/core/export-html/template.js +1864 -1864
- package/dist/core/export-html/vendor/highlight.min.js +1212 -1212
- package/dist/core/export-html/vendor/marked.min.js +78 -78
- package/dist/core/extensions/loader.js +108 -35
- package/dist/core/extensions/loader.test.d.ts +1 -0
- package/dist/core/extensions/loader.test.js +21 -0
- package/dist/core/extensions/types.d.ts +12 -2
- package/dist/core/keybindings.d.ts +2 -2
- package/dist/core/messages.js +7 -7
- package/dist/core/model-resolver.d.ts +1 -0
- package/dist/core/model-resolver.js +10 -4
- package/dist/core/package-manager.js +4 -4
- package/dist/core/sdk.d.ts +5 -5
- package/dist/core/sdk.js +16 -4
- package/dist/core/settings-manager.d.ts +6 -0
- package/dist/core/settings-manager.js +22 -0
- package/dist/core/tools/bash.d.ts +18 -1
- package/dist/core/tools/bash.js +41 -23
- package/dist/core/tools/index.d.ts +4 -1
- package/dist/core/tools/index.js +9 -1
- package/dist/core/tools/powershell.d.ts +15 -0
- package/dist/core/tools/powershell.js +38 -0
- package/dist/core/tools/powershell.test.d.ts +1 -0
- package/dist/core/tools/powershell.test.js +20 -0
- package/dist/extensions/context-compaction-reminder.test.ts +82 -82
- package/dist/extensions/context-compaction-reminder.ts +28 -28
- package/dist/extensions/pi-intercom/LICENSE +21 -21
- package/dist/extensions/pi-intercom/broker/client.test.ts +83 -83
- package/dist/extensions/pi-intercom/broker/extension.test.ts +387 -387
- package/dist/extensions/pi-intercom/broker/framing.test.ts +114 -114
- package/dist/extensions/pi-intercom/broker/paths.test.ts +153 -153
- package/dist/extensions/pi-intercom/broker/paths.ts +134 -134
- package/dist/extensions/pi-intercom/broker/runtime-claim.test.ts +34 -34
- package/dist/extensions/pi-intercom/broker/runtime-claim.ts +21 -21
- package/dist/extensions/pi-intercom/cwd.test.ts +40 -40
- package/dist/extensions/pi-intercom/cwd.ts +31 -31
- package/dist/extensions/pi-intercom/extension-api.ts +44 -44
- package/dist/extensions/pi-intercom/format-context.test.ts +31 -31
- package/dist/extensions/pi-intercom/format-context.ts +32 -32
- package/dist/extensions/pi-intercom/test/overlay-width.test.ts +66 -66
- package/dist/extensions/pi-intercom/ui/compose.ts +143 -143
- package/dist/extensions/pi-intercom/ui/session-list.ts +166 -166
- package/dist/extensions/pi-powerline-footer/bash-mode/shell-session.ts +286 -286
- package/dist/extensions/pi-powerline-footer/bash-mode/transcript.ts +108 -108
- package/dist/extensions/pi-powerline-footer/separators.ts +57 -57
- package/dist/extensions/pi-powerline-footer/tests/session-usage.test.ts +47 -47
- package/dist/extensions/pi-powerline-footer/tests/tps.test.ts +39 -39
- package/dist/extensions/pi-powerline-footer/theme.example.json +24 -24
- package/dist/extensions/pi-powerline-footer/theme.json +12 -12
- package/dist/extensions/pi-powerline-footer/tps.ts +345 -345
- package/dist/extensions/pi-rewind-hook/README.md +245 -245
- package/dist/extensions/pi-rewind-hook/index.ts +1445 -1445
- package/dist/extensions/pi-rewind-hook/package.json +29 -29
- package/dist/extensions/pi-subagents/install.mjs +0 -0
- package/dist/extensions/pi-web-agent/package.json +31 -31
- package/dist/extensions/pi-web-agent/src/backends/config.ts +205 -205
- package/dist/extensions/pi-web-agent/src/backends/doctor.ts +136 -136
- package/dist/extensions/pi-web-agent/src/backends/factory.ts +152 -152
- package/dist/extensions/pi-web-agent/src/backends/settings-reader.ts +25 -25
- package/dist/extensions/pi-web-agent/src/cache/ttl-cache.ts +28 -28
- package/dist/extensions/pi-web-agent/src/changelog-notice.ts +136 -136
- package/dist/extensions/pi-web-agent/src/commands/web-agent-config.ts +946 -946
- package/dist/extensions/pi-web-agent/src/extension.ts +126 -126
- package/dist/extensions/pi-web-agent/src/extract/readability.ts +118 -118
- package/dist/extensions/pi-web-agent/src/fetch/browser-resolution.ts +199 -199
- package/dist/extensions/pi-web-agent/src/fetch/firecrawl-fetch.ts +100 -100
- package/dist/extensions/pi-web-agent/src/fetch/headless-fetch.ts +117 -117
- package/dist/extensions/pi-web-agent/src/fetch/http-fetch.ts +67 -67
- package/dist/extensions/pi-web-agent/src/orchestration/answer-synthesizer.ts +60 -60
- package/dist/extensions/pi-web-agent/src/orchestration/candidate-selector.ts +50 -50
- package/dist/extensions/pi-web-agent/src/orchestration/direct-url.ts +52 -52
- package/dist/extensions/pi-web-agent/src/orchestration/evidence-quality.ts +105 -105
- package/dist/extensions/pi-web-agent/src/orchestration/evidence-ranker.ts +45 -45
- package/dist/extensions/pi-web-agent/src/orchestration/index.ts +28 -28
- package/dist/extensions/pi-web-agent/src/orchestration/query-planner.ts +47 -47
- package/dist/extensions/pi-web-agent/src/orchestration/research-orchestrator.ts +376 -376
- package/dist/extensions/pi-web-agent/src/orchestration/research-types.ts +64 -64
- package/dist/extensions/pi-web-agent/src/orchestration/research-worker.ts +181 -181
- package/dist/extensions/pi-web-agent/src/orchestration/source-profile.ts +101 -101
- package/dist/extensions/pi-web-agent/src/orchestration/stop-decider.ts +81 -81
- package/dist/extensions/pi-web-agent/src/presentation/config-store.ts +210 -210
- package/dist/extensions/pi-web-agent/src/presentation/config.ts +75 -75
- package/dist/extensions/pi-web-agent/src/presentation/explore-presentation.ts +61 -61
- package/dist/extensions/pi-web-agent/src/presentation/fetch-presentation.ts +54 -54
- package/dist/extensions/pi-web-agent/src/presentation/search-presentation.ts +41 -41
- package/dist/extensions/pi-web-agent/src/presentation/select-view.ts +20 -20
- package/dist/extensions/pi-web-agent/src/presentation/types.ts +63 -63
- package/dist/extensions/pi-web-agent/src/search/brave.ts +114 -114
- package/dist/extensions/pi-web-agent/src/search/duckduckgo.ts +72 -72
- package/dist/extensions/pi-web-agent/src/search/searxng.ts +96 -96
- package/dist/extensions/pi-web-agent/src/tools/web-explore.ts +71 -71
- package/dist/extensions/pi-web-agent/src/tools/web-fetch-headless.ts +31 -31
- package/dist/extensions/pi-web-agent/src/tools/web-fetch.ts +31 -31
- package/dist/extensions/pi-web-agent/src/tools/web-search.ts +157 -157
- package/dist/extensions/pi-web-agent/src/types.ts +88 -88
- package/dist/extensions/ponytail/package.json +8 -8
- package/dist/extensions/question/batch.ts +103 -103
- package/dist/extensions/question/constants.ts +30 -30
- package/dist/extensions/question/helpers.ts +58 -58
- package/dist/extensions/question/navigation.ts +14 -14
- package/dist/extensions/question/package.json +19 -19
- package/dist/extensions/question/schemas.ts +43 -43
- package/dist/extensions/question/selection-mode.ts +46 -46
- package/dist/extensions/question/shortcuts.ts +44 -44
- package/dist/extensions/question/types.ts +132 -132
- package/dist/extensions/test-resolve-hook-impl.mjs +6 -6
- package/dist/extensions/test-resolve-hook.mjs +6 -6
- package/dist/extensions/web-agent-onboarding.ts +222 -222
- package/dist/extensions/workflow/package.json +17 -17
- package/dist/package-manager-cli.js +71 -71
- package/dist/rpc-entry.js +0 -0
- package/dist/skills/agent-browser/SKILL.md +52 -52
- package/dist/skills/batch-grill-me/SKILL.md +19 -19
- package/dist/skills/grill-me/SKILL.md +10 -10
- package/dist/skills/handoff/SKILL.md +16 -16
- package/dist/skills/handoff-text/SKILL.md +14 -14
- package/dist/skills/implanger/SKILL.md +69 -69
- package/dist/skills/improve-codebase/REFERENCE.md +78 -78
- package/dist/skills/improve-codebase/SKILL.md +178 -178
- package/dist/skills/planger/SKILL.md +166 -166
- package/dist/skills/ponytail/SKILL.md +116 -116
- package/dist/skills/ponytail-audit/SKILL.md +42 -42
- package/dist/skills/ponytail-debt/SKILL.md +45 -45
- package/dist/skills/ponytail-gain/SKILL.md +51 -51
- package/dist/skills/ponytail-help/SKILL.md +70 -70
- package/dist/skills/ponytail-review/SKILL.md +58 -58
- package/dist/skills/selesai-handoff/SKILL.md +20 -20
- package/dist/skills/workflow-creation/SKILL.md +73 -73
- package/dist/themes/powerline-footer/theme.json +33 -33
- package/dist/utils/shell.d.ts +3 -0
- package/dist/utils/shell.js +17 -5
- package/docs/compaction.md +396 -396
- package/docs/containerization.md +111 -111
- package/docs/development.md +71 -71
- package/docs/docs.json +164 -164
- package/docs/environment-variables.md +86 -86
- package/docs/index.md +83 -83
- package/docs/json.md +82 -82
- package/docs/models.md +502 -502
- package/docs/packages.md +227 -227
- package/docs/plans/subagent-delegation/phase-0-correctness.md +264 -264
- package/docs/plans/subagent-delegation/phase-1-behavioral-contract.md +485 -485
- package/docs/plans/subagent-delegation/phase-2-context-controls.md +281 -281
- package/docs/plans/subagent-delegation/phase-3-advisory-routing.md +361 -361
- package/docs/plans/subagent-delegation/phase-4-optional-enforcement.md +380 -380
- package/docs/prompt-templates.md +95 -95
- package/docs/providers.md +293 -293
- package/docs/sdk.md +1144 -1143
- package/docs/security.md +59 -59
- package/docs/session-format.md +414 -414
- package/docs/sessions.md +145 -145
- package/docs/shared-host-extensions.md +109 -109
- package/docs/shell-aliases.md +13 -13
- package/docs/skills.md +231 -231
- package/docs/terminal-setup.md +142 -142
- package/docs/termux.md +127 -127
- package/docs/themes.md +295 -295
- package/docs/tmux.md +63 -63
- package/docs/tui.md +927 -927
- package/docs/windows.md +17 -17
- package/examples/README.md +25 -25
- package/examples/extensions/README.md +211 -211
- package/examples/extensions/auto-commit-on-exit.ts +49 -49
- package/examples/extensions/bash-spawn-hook.ts +30 -30
- package/examples/extensions/bookmark.ts +50 -50
- package/examples/extensions/border-status-editor.ts +150 -150
- package/examples/extensions/built-in-tool-renderer.ts +249 -249
- package/examples/extensions/claude-rules.ts +86 -86
- package/examples/extensions/commands.ts +72 -72
- package/examples/extensions/confirm-destructive.ts +59 -59
- package/examples/extensions/custom-compaction.ts +130 -130
- package/examples/extensions/custom-footer.ts +64 -64
- package/examples/extensions/custom-header.ts +73 -73
- package/examples/extensions/custom-provider-anthropic/index.ts +610 -610
- package/examples/extensions/custom-provider-anthropic/package-lock.json +24 -24
- package/examples/extensions/custom-provider-anthropic/package.json +19 -19
- package/examples/extensions/custom-provider-gitlab-duo/index.ts +404 -404
- package/examples/extensions/custom-provider-gitlab-duo/package.json +16 -16
- package/examples/extensions/custom-provider-gitlab-duo/test.ts +82 -82
- package/examples/extensions/dirty-repo-guard.ts +56 -56
- package/examples/extensions/doom-overlay/README.md +46 -46
- package/examples/extensions/doom-overlay/doom/build/doom.js +21 -21
- package/examples/extensions/doom-overlay/doom/build/doom.wasm +0 -0
- package/examples/extensions/doom-overlay/doom/build.sh +152 -152
- package/examples/extensions/doom-overlay/doom/doomgeneric_pi.c +72 -72
- package/examples/extensions/doom-overlay/doom-component.ts +132 -132
- package/examples/extensions/doom-overlay/doom-engine.ts +173 -173
- package/examples/extensions/doom-overlay/doom-keys.ts +104 -104
- package/examples/extensions/doom-overlay/index.ts +74 -74
- package/examples/extensions/doom-overlay/wad-finder.ts +51 -51
- package/examples/extensions/dynamic-resources/SKILL.md +8 -8
- package/examples/extensions/dynamic-resources/dynamic.json +79 -79
- package/examples/extensions/dynamic-resources/dynamic.md +5 -5
- package/examples/extensions/dynamic-resources/index.ts +15 -15
- package/examples/extensions/dynamic-tools.ts +74 -74
- package/examples/extensions/event-bus.ts +43 -43
- package/examples/extensions/file-trigger.ts +41 -41
- package/examples/extensions/git-checkpoint.ts +53 -53
- package/examples/extensions/git-merge-and-resolve.ts +115 -115
- package/examples/extensions/github-issue-autocomplete.ts +185 -185
- package/examples/extensions/gondolin/index.ts +531 -531
- package/examples/extensions/gondolin/package-lock.json +185 -185
- package/examples/extensions/gondolin/package.json +19 -19
- package/examples/extensions/handoff.ts +199 -199
- package/examples/extensions/hello.ts +26 -26
- package/examples/extensions/hidden-thinking-label.ts +53 -53
- package/examples/extensions/inline-bash.ts +94 -94
- package/examples/extensions/input-transform-streaming.ts +39 -39
- package/examples/extensions/input-transform.ts +43 -43
- package/examples/extensions/interactive-shell.ts +196 -196
- package/examples/extensions/mac-system-theme.ts +47 -47
- package/examples/extensions/message-renderer.ts +59 -59
- package/examples/extensions/minimal-mode.ts +426 -426
- package/examples/extensions/modal-editor.ts +85 -85
- package/examples/extensions/model-status.ts +31 -31
- package/examples/extensions/notify.ts +55 -55
- package/examples/extensions/overlay-qa-tests.ts +1450 -1450
- package/examples/extensions/overlay-test.ts +153 -153
- package/examples/extensions/permission-gate.ts +34 -34
- package/examples/extensions/pirate.ts +47 -47
- package/examples/extensions/plan-mode/README.md +66 -66
- package/examples/extensions/plan-mode/index.ts +390 -390
- package/examples/extensions/plan-mode/utils.ts +168 -168
- package/examples/extensions/preset.ts +436 -436
- package/examples/extensions/project-trust.ts +64 -64
- package/examples/extensions/prompt-customizer.ts +97 -97
- package/examples/extensions/protected-paths.ts +30 -30
- package/examples/extensions/provider-payload.ts +18 -18
- package/examples/extensions/qna.ts +122 -122
- package/examples/extensions/question.ts +285 -285
- package/examples/extensions/questionnaire.ts +448 -448
- package/examples/extensions/rainbow-editor.ts +88 -88
- package/examples/extensions/reload-runtime.ts +37 -37
- package/examples/extensions/rpc-demo.ts +118 -118
- package/examples/extensions/sandbox/index.ts +321 -321
- package/examples/extensions/sandbox/package-lock.json +92 -92
- package/examples/extensions/sandbox/package.json +19 -19
- package/examples/extensions/send-user-message.ts +97 -97
- package/examples/extensions/session-name.ts +27 -27
- package/examples/extensions/shutdown-command.ts +63 -63
- package/examples/extensions/snake.ts +343 -343
- package/examples/extensions/space-invaders.ts +560 -560
- package/examples/extensions/ssh.ts +220 -220
- package/examples/extensions/status-line.ts +32 -32
- package/examples/extensions/structured-output.ts +65 -65
- package/examples/extensions/subagent/README.md +175 -175
- package/examples/extensions/subagent/agents/planner.md +37 -37
- package/examples/extensions/subagent/agents/reviewer.md +35 -35
- package/examples/extensions/subagent/agents/scout.md +50 -50
- package/examples/extensions/subagent/agents/worker.md +24 -24
- package/examples/extensions/subagent/agents.ts +126 -126
- package/examples/extensions/subagent/index.ts +1015 -1015
- package/examples/extensions/subagent/prompts/implement-and-review.md +10 -10
- package/examples/extensions/subagent/prompts/implement.md +10 -10
- package/examples/extensions/subagent/prompts/scout-and-plan.md +9 -9
- package/examples/extensions/summarize.ts +209 -209
- package/examples/extensions/system-prompt-header.ts +17 -17
- package/examples/extensions/tic-tac-toe.ts +1008 -1008
- package/examples/extensions/timed-confirm.ts +70 -70
- package/examples/extensions/titlebar-spinner.ts +58 -58
- package/examples/extensions/todo.ts +297 -297
- package/examples/extensions/tool-override.ts +144 -144
- package/examples/extensions/tools.ts +146 -146
- package/examples/extensions/trigger-compact.ts +50 -50
- package/examples/extensions/truncated-tool.ts +195 -195
- package/examples/extensions/widget-placement.ts +9 -9
- package/examples/extensions/with-deps/index.ts +32 -32
- package/examples/extensions/with-deps/package-lock.json +31 -31
- package/examples/extensions/with-deps/package.json +22 -22
- package/examples/extensions/working-indicator.ts +123 -123
- package/examples/extensions/working-message-test.ts +25 -25
- package/examples/rpc-extension-ui.ts +632 -632
- package/examples/sdk/01-minimal.ts +26 -26
- package/examples/sdk/02-custom-model.ts +53 -53
- package/examples/sdk/03-custom-prompt.ts +75 -75
- package/examples/sdk/04-skills.ts +55 -55
- package/examples/sdk/05-tools.ts +48 -48
- package/examples/sdk/06-extensions.ts +99 -99
- package/examples/sdk/07-context-files.ts +47 -47
- package/examples/sdk/08-prompt-templates.ts +51 -51
- package/examples/sdk/09-api-keys-and-oauth.ts +52 -52
- package/examples/sdk/10-settings.ts +53 -53
- package/examples/sdk/11-sessions.ts +52 -52
- package/examples/sdk/12-full-control.ts +79 -79
- package/examples/sdk/13-session-runtime.ts +67 -67
- package/examples/sdk/README.md +144 -144
- package/package.json +4 -4
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "pi-extension-custom-provider-gitlab-duo",
|
|
3
|
-
"private": true,
|
|
4
|
-
"version": "0.83.0",
|
|
5
|
-
"type": "module",
|
|
6
|
-
"scripts": {
|
|
7
|
-
"clean": "echo 'nothing to clean'",
|
|
8
|
-
"build": "echo 'nothing to build'",
|
|
9
|
-
"check": "echo 'nothing to check'"
|
|
10
|
-
},
|
|
11
|
-
"pi": {
|
|
12
|
-
"extensions": [
|
|
13
|
-
"./index.ts"
|
|
14
|
-
]
|
|
15
|
-
}
|
|
16
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "pi-extension-custom-provider-gitlab-duo",
|
|
3
|
+
"private": true,
|
|
4
|
+
"version": "0.83.0",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"scripts": {
|
|
7
|
+
"clean": "echo 'nothing to clean'",
|
|
8
|
+
"build": "echo 'nothing to build'",
|
|
9
|
+
"check": "echo 'nothing to check'"
|
|
10
|
+
},
|
|
11
|
+
"pi": {
|
|
12
|
+
"extensions": [
|
|
13
|
+
"./index.ts"
|
|
14
|
+
]
|
|
15
|
+
}
|
|
16
|
+
}
|
|
@@ -1,82 +1,82 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Test script for GitLab Duo extension
|
|
3
|
-
* Run: npx tsx test.ts [model-id] [--thinking]
|
|
4
|
-
*
|
|
5
|
-
* Examples:
|
|
6
|
-
* npx tsx test.ts # Test default (claude-sonnet-4-5-20250929)
|
|
7
|
-
* npx tsx test.ts gpt-5-codex # Test GPT-5 Codex
|
|
8
|
-
* npx tsx test.ts claude-sonnet-4-5-20250929 --thinking
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
import { type Api, type Context, type Model, registerApiProvider, streamSimple } from "@earendil-works/pi-ai/compat";
|
|
12
|
-
import { readFileSync } from "fs";
|
|
13
|
-
import { getAgentDir } from "packages/coding-agent/src/config.js";
|
|
14
|
-
import { join } from "path";
|
|
15
|
-
import { MODELS, streamGitLabDuo } from "./index.ts";
|
|
16
|
-
|
|
17
|
-
const MODEL_MAP = new Map(MODELS.map((m) => [m.id, m]));
|
|
18
|
-
|
|
19
|
-
async function main() {
|
|
20
|
-
const modelId = process.argv[2] || "claude-sonnet-4-5-20250929";
|
|
21
|
-
const useThinking = process.argv.includes("--thinking");
|
|
22
|
-
|
|
23
|
-
const cfg = MODEL_MAP.get(modelId);
|
|
24
|
-
if (!cfg) {
|
|
25
|
-
console.error(`Unknown model: ${modelId}`);
|
|
26
|
-
console.error("Available:", MODELS.map((m) => m.id).join(", "));
|
|
27
|
-
process.exit(1);
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
// Read auth
|
|
31
|
-
const authPath = join(getAgentDir(), "extensions", "auth.json");
|
|
32
|
-
const authData = JSON.parse(readFileSync(authPath, "utf-8"));
|
|
33
|
-
const gitlabCred = authData["gitlab-duo"];
|
|
34
|
-
if (!gitlabCred?.access) {
|
|
35
|
-
console.error("No gitlab-duo credentials. Run /login gitlab-duo first.");
|
|
36
|
-
process.exit(1);
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
// Register provider
|
|
40
|
-
registerApiProvider({
|
|
41
|
-
api: "gitlab-duo-api" as Api,
|
|
42
|
-
stream: streamGitLabDuo,
|
|
43
|
-
streamSimple: streamGitLabDuo,
|
|
44
|
-
});
|
|
45
|
-
|
|
46
|
-
// Create model
|
|
47
|
-
const model: Model<Api> = {
|
|
48
|
-
id: cfg.id,
|
|
49
|
-
name: cfg.name,
|
|
50
|
-
api: "gitlab-duo-api" as Api,
|
|
51
|
-
provider: "gitlab-duo",
|
|
52
|
-
baseUrl: cfg.baseUrl,
|
|
53
|
-
reasoning: cfg.reasoning,
|
|
54
|
-
input: cfg.input,
|
|
55
|
-
cost: cfg.cost,
|
|
56
|
-
contextWindow: cfg.contextWindow,
|
|
57
|
-
maxTokens: cfg.maxTokens,
|
|
58
|
-
};
|
|
59
|
-
|
|
60
|
-
const context: Context = {
|
|
61
|
-
messages: [{ role: "user", content: "Say hello in exactly 3 words.", timestamp: Date.now() }],
|
|
62
|
-
};
|
|
63
|
-
|
|
64
|
-
console.log(`Model: ${model.id}, Backend: ${cfg.backend}, Thinking: ${useThinking}`);
|
|
65
|
-
|
|
66
|
-
const stream = streamSimple(model, context, {
|
|
67
|
-
apiKey: gitlabCred.access,
|
|
68
|
-
maxTokens: 100,
|
|
69
|
-
reasoning: useThinking ? "low" : undefined,
|
|
70
|
-
});
|
|
71
|
-
|
|
72
|
-
for await (const event of stream) {
|
|
73
|
-
if (event.type === "thinking_start") console.log("[Thinking]");
|
|
74
|
-
else if (event.type === "thinking_delta") process.stdout.write(event.delta);
|
|
75
|
-
else if (event.type === "thinking_end") console.log("\n[/Thinking]\n");
|
|
76
|
-
else if (event.type === "text_delta") process.stdout.write(event.delta);
|
|
77
|
-
else if (event.type === "error") console.error("\nError:", event.error.errorMessage);
|
|
78
|
-
else if (event.type === "done") console.log("\n\nDone!", event.reason, event.message.usage);
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
main().catch(console.error);
|
|
1
|
+
/**
|
|
2
|
+
* Test script for GitLab Duo extension
|
|
3
|
+
* Run: npx tsx test.ts [model-id] [--thinking]
|
|
4
|
+
*
|
|
5
|
+
* Examples:
|
|
6
|
+
* npx tsx test.ts # Test default (claude-sonnet-4-5-20250929)
|
|
7
|
+
* npx tsx test.ts gpt-5-codex # Test GPT-5 Codex
|
|
8
|
+
* npx tsx test.ts claude-sonnet-4-5-20250929 --thinking
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import { type Api, type Context, type Model, registerApiProvider, streamSimple } from "@earendil-works/pi-ai/compat";
|
|
12
|
+
import { readFileSync } from "fs";
|
|
13
|
+
import { getAgentDir } from "packages/coding-agent/src/config.js";
|
|
14
|
+
import { join } from "path";
|
|
15
|
+
import { MODELS, streamGitLabDuo } from "./index.ts";
|
|
16
|
+
|
|
17
|
+
const MODEL_MAP = new Map(MODELS.map((m) => [m.id, m]));
|
|
18
|
+
|
|
19
|
+
async function main() {
|
|
20
|
+
const modelId = process.argv[2] || "claude-sonnet-4-5-20250929";
|
|
21
|
+
const useThinking = process.argv.includes("--thinking");
|
|
22
|
+
|
|
23
|
+
const cfg = MODEL_MAP.get(modelId);
|
|
24
|
+
if (!cfg) {
|
|
25
|
+
console.error(`Unknown model: ${modelId}`);
|
|
26
|
+
console.error("Available:", MODELS.map((m) => m.id).join(", "));
|
|
27
|
+
process.exit(1);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// Read auth
|
|
31
|
+
const authPath = join(getAgentDir(), "extensions", "auth.json");
|
|
32
|
+
const authData = JSON.parse(readFileSync(authPath, "utf-8"));
|
|
33
|
+
const gitlabCred = authData["gitlab-duo"];
|
|
34
|
+
if (!gitlabCred?.access) {
|
|
35
|
+
console.error("No gitlab-duo credentials. Run /login gitlab-duo first.");
|
|
36
|
+
process.exit(1);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// Register provider
|
|
40
|
+
registerApiProvider({
|
|
41
|
+
api: "gitlab-duo-api" as Api,
|
|
42
|
+
stream: streamGitLabDuo,
|
|
43
|
+
streamSimple: streamGitLabDuo,
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
// Create model
|
|
47
|
+
const model: Model<Api> = {
|
|
48
|
+
id: cfg.id,
|
|
49
|
+
name: cfg.name,
|
|
50
|
+
api: "gitlab-duo-api" as Api,
|
|
51
|
+
provider: "gitlab-duo",
|
|
52
|
+
baseUrl: cfg.baseUrl,
|
|
53
|
+
reasoning: cfg.reasoning,
|
|
54
|
+
input: cfg.input,
|
|
55
|
+
cost: cfg.cost,
|
|
56
|
+
contextWindow: cfg.contextWindow,
|
|
57
|
+
maxTokens: cfg.maxTokens,
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
const context: Context = {
|
|
61
|
+
messages: [{ role: "user", content: "Say hello in exactly 3 words.", timestamp: Date.now() }],
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
console.log(`Model: ${model.id}, Backend: ${cfg.backend}, Thinking: ${useThinking}`);
|
|
65
|
+
|
|
66
|
+
const stream = streamSimple(model, context, {
|
|
67
|
+
apiKey: gitlabCred.access,
|
|
68
|
+
maxTokens: 100,
|
|
69
|
+
reasoning: useThinking ? "low" : undefined,
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
for await (const event of stream) {
|
|
73
|
+
if (event.type === "thinking_start") console.log("[Thinking]");
|
|
74
|
+
else if (event.type === "thinking_delta") process.stdout.write(event.delta);
|
|
75
|
+
else if (event.type === "thinking_end") console.log("\n[/Thinking]\n");
|
|
76
|
+
else if (event.type === "text_delta") process.stdout.write(event.delta);
|
|
77
|
+
else if (event.type === "error") console.error("\nError:", event.error.errorMessage);
|
|
78
|
+
else if (event.type === "done") console.log("\n\nDone!", event.reason, event.message.usage);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
main().catch(console.error);
|
|
@@ -1,56 +1,56 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Dirty Repo Guard Extension
|
|
3
|
-
*
|
|
4
|
-
* Prevents session changes when there are uncommitted git changes.
|
|
5
|
-
* Useful to ensure work is committed before switching context.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import type { ExtensionAPI, ExtensionContext } from "@earendil-works/pi-coding-agent";
|
|
9
|
-
|
|
10
|
-
async function checkDirtyRepo(
|
|
11
|
-
pi: ExtensionAPI,
|
|
12
|
-
ctx: ExtensionContext,
|
|
13
|
-
action: string,
|
|
14
|
-
): Promise<{ cancel: boolean } | undefined> {
|
|
15
|
-
// Check for uncommitted changes
|
|
16
|
-
const { stdout, code } = await pi.exec("git", ["status", "--porcelain"]);
|
|
17
|
-
|
|
18
|
-
if (code !== 0) {
|
|
19
|
-
// Not a git repo, allow the action
|
|
20
|
-
return;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
const hasChanges = stdout.trim().length > 0;
|
|
24
|
-
if (!hasChanges) {
|
|
25
|
-
return;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
if (!ctx.hasUI) {
|
|
29
|
-
// In non-interactive mode, block by default
|
|
30
|
-
return { cancel: true };
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
// Count changed files
|
|
34
|
-
const changedFiles = stdout.trim().split("\n").filter(Boolean).length;
|
|
35
|
-
|
|
36
|
-
const choice = await ctx.ui.select(`You have ${changedFiles} uncommitted file(s). ${action} anyway?`, [
|
|
37
|
-
"Yes, proceed anyway",
|
|
38
|
-
"No, let me commit first",
|
|
39
|
-
]);
|
|
40
|
-
|
|
41
|
-
if (choice !== "Yes, proceed anyway") {
|
|
42
|
-
ctx.ui.notify("Commit your changes first", "warning");
|
|
43
|
-
return { cancel: true };
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
export default function (pi: ExtensionAPI) {
|
|
48
|
-
pi.on("session_before_switch", async (event, ctx) => {
|
|
49
|
-
const action = event.reason === "new" ? "new session" : "switch session";
|
|
50
|
-
return checkDirtyRepo(pi, ctx, action);
|
|
51
|
-
});
|
|
52
|
-
|
|
53
|
-
pi.on("session_before_fork", async (_event, ctx) => {
|
|
54
|
-
return checkDirtyRepo(pi, ctx, "fork");
|
|
55
|
-
});
|
|
56
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* Dirty Repo Guard Extension
|
|
3
|
+
*
|
|
4
|
+
* Prevents session changes when there are uncommitted git changes.
|
|
5
|
+
* Useful to ensure work is committed before switching context.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import type { ExtensionAPI, ExtensionContext } from "@earendil-works/pi-coding-agent";
|
|
9
|
+
|
|
10
|
+
async function checkDirtyRepo(
|
|
11
|
+
pi: ExtensionAPI,
|
|
12
|
+
ctx: ExtensionContext,
|
|
13
|
+
action: string,
|
|
14
|
+
): Promise<{ cancel: boolean } | undefined> {
|
|
15
|
+
// Check for uncommitted changes
|
|
16
|
+
const { stdout, code } = await pi.exec("git", ["status", "--porcelain"]);
|
|
17
|
+
|
|
18
|
+
if (code !== 0) {
|
|
19
|
+
// Not a git repo, allow the action
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
const hasChanges = stdout.trim().length > 0;
|
|
24
|
+
if (!hasChanges) {
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
if (!ctx.hasUI) {
|
|
29
|
+
// In non-interactive mode, block by default
|
|
30
|
+
return { cancel: true };
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// Count changed files
|
|
34
|
+
const changedFiles = stdout.trim().split("\n").filter(Boolean).length;
|
|
35
|
+
|
|
36
|
+
const choice = await ctx.ui.select(`You have ${changedFiles} uncommitted file(s). ${action} anyway?`, [
|
|
37
|
+
"Yes, proceed anyway",
|
|
38
|
+
"No, let me commit first",
|
|
39
|
+
]);
|
|
40
|
+
|
|
41
|
+
if (choice !== "Yes, proceed anyway") {
|
|
42
|
+
ctx.ui.notify("Commit your changes first", "warning");
|
|
43
|
+
return { cancel: true };
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export default function (pi: ExtensionAPI) {
|
|
48
|
+
pi.on("session_before_switch", async (event, ctx) => {
|
|
49
|
+
const action = event.reason === "new" ? "new session" : "switch session";
|
|
50
|
+
return checkDirtyRepo(pi, ctx, action);
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
pi.on("session_before_fork", async (_event, ctx) => {
|
|
54
|
+
return checkDirtyRepo(pi, ctx, "fork");
|
|
55
|
+
});
|
|
56
|
+
}
|
|
@@ -1,46 +1,46 @@
|
|
|
1
|
-
# DOOM Overlay Demo
|
|
2
|
-
|
|
3
|
-
Play DOOM as an overlay in pi. Demonstrates that the overlay system can handle real-time game rendering at 35 FPS.
|
|
4
|
-
|
|
5
|
-
## Usage
|
|
6
|
-
|
|
7
|
-
```bash
|
|
8
|
-
pi --extension ./examples/extensions/doom-overlay
|
|
9
|
-
```
|
|
10
|
-
|
|
11
|
-
Then run:
|
|
12
|
-
```
|
|
13
|
-
/doom-overlay
|
|
14
|
-
```
|
|
15
|
-
|
|
16
|
-
The shareware WAD file (~4MB) is auto-downloaded on first run.
|
|
17
|
-
|
|
18
|
-
## Controls
|
|
19
|
-
|
|
20
|
-
| Action | Keys |
|
|
21
|
-
|--------|------|
|
|
22
|
-
| Move | WASD or Arrow Keys |
|
|
23
|
-
| Run | Shift + WASD |
|
|
24
|
-
| Fire | F or Ctrl |
|
|
25
|
-
| Use/Open | Space |
|
|
26
|
-
| Weapons | 1-7 |
|
|
27
|
-
| Map | Tab |
|
|
28
|
-
| Menu | Escape |
|
|
29
|
-
| Pause/Quit | Q |
|
|
30
|
-
|
|
31
|
-
## How It Works
|
|
32
|
-
|
|
33
|
-
DOOM runs as WebAssembly compiled from [doomgeneric](https://github.com/ozkl/doomgeneric). Each frame is rendered using half-block characters (▀) with 24-bit color, where the top pixel is the foreground color and the bottom pixel is the background color.
|
|
34
|
-
|
|
35
|
-
The overlay uses:
|
|
36
|
-
- `width: "90%"` - 90% of terminal width
|
|
37
|
-
- `maxHeight: "80%"` - Maximum 80% of terminal height
|
|
38
|
-
- `anchor: "center"` - Centered in terminal
|
|
39
|
-
|
|
40
|
-
Height is calculated from width to maintain DOOM's 3.2:1 aspect ratio (accounting for half-block rendering).
|
|
41
|
-
|
|
42
|
-
## Credits
|
|
43
|
-
|
|
44
|
-
- [id Software](https://github.com/id-Software/DOOM) for the original DOOM
|
|
45
|
-
- [doomgeneric](https://github.com/ozkl/doomgeneric) for the portable DOOM implementation
|
|
46
|
-
- [pi-doom](https://github.com/badlogic/pi-doom) for the original pi integration
|
|
1
|
+
# DOOM Overlay Demo
|
|
2
|
+
|
|
3
|
+
Play DOOM as an overlay in pi. Demonstrates that the overlay system can handle real-time game rendering at 35 FPS.
|
|
4
|
+
|
|
5
|
+
## Usage
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
pi --extension ./examples/extensions/doom-overlay
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
Then run:
|
|
12
|
+
```
|
|
13
|
+
/doom-overlay
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
The shareware WAD file (~4MB) is auto-downloaded on first run.
|
|
17
|
+
|
|
18
|
+
## Controls
|
|
19
|
+
|
|
20
|
+
| Action | Keys |
|
|
21
|
+
|--------|------|
|
|
22
|
+
| Move | WASD or Arrow Keys |
|
|
23
|
+
| Run | Shift + WASD |
|
|
24
|
+
| Fire | F or Ctrl |
|
|
25
|
+
| Use/Open | Space |
|
|
26
|
+
| Weapons | 1-7 |
|
|
27
|
+
| Map | Tab |
|
|
28
|
+
| Menu | Escape |
|
|
29
|
+
| Pause/Quit | Q |
|
|
30
|
+
|
|
31
|
+
## How It Works
|
|
32
|
+
|
|
33
|
+
DOOM runs as WebAssembly compiled from [doomgeneric](https://github.com/ozkl/doomgeneric). Each frame is rendered using half-block characters (▀) with 24-bit color, where the top pixel is the foreground color and the bottom pixel is the background color.
|
|
34
|
+
|
|
35
|
+
The overlay uses:
|
|
36
|
+
- `width: "90%"` - 90% of terminal width
|
|
37
|
+
- `maxHeight: "80%"` - Maximum 80% of terminal height
|
|
38
|
+
- `anchor: "center"` - Centered in terminal
|
|
39
|
+
|
|
40
|
+
Height is calculated from width to maintain DOOM's 3.2:1 aspect ratio (accounting for half-block rendering).
|
|
41
|
+
|
|
42
|
+
## Credits
|
|
43
|
+
|
|
44
|
+
- [id Software](https://github.com/id-Software/DOOM) for the original DOOM
|
|
45
|
+
- [doomgeneric](https://github.com/ozkl/doomgeneric) for the portable DOOM implementation
|
|
46
|
+
- [pi-doom](https://github.com/badlogic/pi-doom) for the original pi integration
|