@selesai/code 0.2.1 → 0.3.1
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/dist/config.d.ts +4 -15
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +5 -45
- package/dist/config.js.map +1 -1
- package/dist/core/agent-session.d.ts +1 -0
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +8 -0
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/diagnostics.d.ts +1 -0
- package/dist/core/diagnostics.d.ts.map +1 -1
- package/dist/core/diagnostics.js.map +1 -1
- package/dist/core/model-registry.d.ts +4 -1
- package/dist/core/model-registry.d.ts.map +1 -1
- package/dist/core/model-registry.js +101 -51
- package/dist/core/model-registry.js.map +1 -1
- package/dist/core/package-manager.d.ts +10 -0
- package/dist/core/package-manager.d.ts.map +1 -1
- package/dist/core/package-manager.js +93 -8
- package/dist/core/package-manager.js.map +1 -1
- package/dist/core/package-manager.test.d.ts +2 -0
- package/dist/core/package-manager.test.d.ts.map +1 -0
- package/dist/core/package-manager.test.js +20 -0
- package/dist/core/package-manager.test.js.map +1 -0
- package/dist/core/resource-loader.d.ts +3 -0
- package/dist/core/resource-loader.d.ts.map +1 -1
- package/dist/core/resource-loader.js +10 -0
- package/dist/core/resource-loader.js.map +1 -1
- package/dist/core/settings-manager.d.ts +1 -0
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/defaults/models.json +64 -113
- package/dist/extensions/caveman/caveman-instructions.cjs +39 -0
- package/dist/extensions/caveman/index.js +116 -0
- package/dist/extensions/caveman/package.json +8 -0
- package/dist/extensions/caveman/test/extension.test.js +185 -0
- package/dist/extensions/caveman/test/helpers.test.js +67 -0
- package/dist/extensions/copy-turn.ts +2 -2
- package/dist/extensions/pi-intercom/broker/broker.ts +2 -3
- package/dist/extensions/pi-intercom/broker/paths.ts +10 -5
- package/dist/extensions/pi-intercom/broker/spawn.ts +2 -3
- package/dist/extensions/pi-intercom/config.ts +2 -2
- package/dist/extensions/pi-intercom/index.ts +2 -2
- package/dist/extensions/pi-intercom/package.json +2 -2
- package/dist/extensions/pi-intercom/ui/compose.ts +3 -3
- package/dist/extensions/pi-intercom/ui/inline-message.ts +3 -3
- package/dist/extensions/pi-intercom/ui/session-list.ts +3 -3
- package/dist/extensions/pi-powerline-footer/bash-mode/editor.ts +2 -2
- package/dist/extensions/pi-powerline-footer/bash-mode/history.ts +2 -1
- package/dist/extensions/pi-powerline-footer/index.ts +40 -47
- package/dist/extensions/pi-powerline-footer/package.json +2 -2
- package/dist/extensions/pi-powerline-footer/tests/bash-mode.test.ts +10 -10
- package/dist/extensions/pi-powerline-footer/tests/jump-shortcuts.test.ts +1 -1
- package/dist/extensions/pi-powerline-footer/tests/working-vibes.test.ts +2 -2
- package/dist/extensions/pi-powerline-footer/theme.ts +6 -6
- package/dist/extensions/pi-powerline-footer/tps.ts +1 -1
- package/dist/extensions/pi-powerline-footer/types.ts +7 -7
- package/dist/extensions/pi-powerline-footer/welcome.ts +23 -16
- package/dist/extensions/pi-powerline-footer/working-vibes.ts +52 -59
- package/dist/extensions/pi-rewind-hook/index.ts +1 -1
- package/dist/extensions/pi-rewind-hook/package.json +1 -1
- package/dist/extensions/pi-subagents/README.md +224 -52
- package/dist/extensions/pi-subagents/agents/architect.md +188 -0
- package/dist/extensions/pi-subagents/agents/builder.md +120 -0
- package/dist/extensions/pi-subagents/agents/commentator.md +131 -0
- package/dist/extensions/pi-subagents/agents/explorer.md +51 -0
- package/dist/extensions/pi-subagents/agents/recapper.md +21 -0
- package/dist/extensions/pi-subagents/install.mjs +93 -0
- package/dist/extensions/pi-subagents/package.json +4 -5
- package/dist/extensions/pi-subagents/prompts/parallel-context-build.md +1 -1
- package/dist/extensions/pi-subagents/prompts/parallel-handoff-plan.md +1 -1
- package/dist/extensions/pi-subagents/skills/pi-subagents/SKILL.md +76 -13
- package/dist/extensions/pi-subagents/src/agents/agent-management.ts +179 -2
- package/dist/extensions/pi-subagents/src/agents/agent-memory.ts +254 -0
- package/dist/extensions/pi-subagents/src/agents/agent-serializer.ts +11 -0
- package/dist/extensions/pi-subagents/src/agents/agents.ts +193 -19
- package/dist/extensions/pi-subagents/src/agents/chain-serializer.ts +27 -2
- package/dist/extensions/pi-subagents/src/extension/config.ts +27 -4
- package/dist/extensions/pi-subagents/src/extension/doctor.ts +1 -7
- package/dist/extensions/pi-subagents/src/extension/fanout-child.ts +3 -2
- package/dist/extensions/pi-subagents/src/extension/index.ts +73 -71
- package/dist/extensions/pi-subagents/src/extension/rpc.ts +369 -0
- package/dist/extensions/pi-subagents/src/extension/schemas.ts +54 -10
- package/dist/extensions/pi-subagents/src/extension/tool-description.ts +200 -0
- package/dist/extensions/pi-subagents/src/intercom/intercom-bridge.ts +21 -253
- package/dist/extensions/pi-subagents/src/intercom/native-supervisor-channel.ts +519 -0
- package/dist/extensions/pi-subagents/src/profiles/profiles.ts +1 -1
- package/dist/extensions/pi-subagents/src/runs/background/async-execution.ts +195 -105
- package/dist/extensions/pi-subagents/src/runs/background/async-job-tracker.ts +88 -2
- package/dist/extensions/pi-subagents/src/runs/background/async-status.ts +67 -10
- package/dist/extensions/pi-subagents/src/runs/background/chain-root-attachment.ts +34 -4
- package/dist/extensions/pi-subagents/src/runs/background/completion-batcher.ts +166 -0
- package/dist/extensions/pi-subagents/src/runs/background/control-channel.ts +156 -1
- package/dist/extensions/pi-subagents/src/runs/background/fleet-view.ts +515 -0
- package/dist/extensions/pi-subagents/src/runs/background/notify.ts +161 -44
- package/dist/extensions/pi-subagents/src/runs/background/result-watcher.ts +1 -2
- package/dist/extensions/pi-subagents/src/runs/background/run-id-resolver.ts +3 -2
- package/dist/extensions/pi-subagents/src/runs/background/run-status.ts +167 -6
- package/dist/extensions/pi-subagents/src/runs/background/scheduled-runs.ts +514 -0
- package/dist/extensions/pi-subagents/src/runs/background/stale-run-reconciler.ts +28 -1
- package/dist/extensions/pi-subagents/src/runs/background/subagent-runner.ts +873 -204
- package/dist/extensions/pi-subagents/src/runs/background/wait.ts +353 -0
- package/dist/extensions/pi-subagents/src/runs/foreground/chain-execution.ts +123 -27
- package/dist/extensions/pi-subagents/src/runs/foreground/execution.ts +174 -70
- package/dist/extensions/pi-subagents/src/runs/foreground/subagent-executor.ts +569 -81
- package/dist/extensions/pi-subagents/src/runs/shared/acceptance.ts +45 -22
- package/dist/extensions/pi-subagents/src/runs/shared/completion-guard.ts +3 -1
- package/dist/extensions/pi-subagents/src/runs/shared/dynamic-fanout.ts +2 -2
- package/dist/extensions/pi-subagents/src/runs/shared/model-fallback.ts +172 -21
- package/dist/extensions/pi-subagents/src/runs/shared/model-scope.ts +128 -0
- package/dist/extensions/pi-subagents/src/runs/shared/nested-events.ts +89 -0
- package/dist/extensions/pi-subagents/src/runs/shared/parallel-utils.ts +50 -1
- package/dist/extensions/pi-subagents/src/runs/shared/pi-args.ts +35 -4
- package/dist/extensions/pi-subagents/src/runs/shared/pi-spawn.ts +63 -45
- package/dist/extensions/pi-subagents/src/runs/shared/single-output.ts +2 -0
- package/dist/extensions/pi-subagents/src/runs/shared/subagent-prompt-runtime.ts +125 -5
- package/dist/extensions/pi-subagents/src/runs/shared/tool-budget.ts +74 -0
- package/dist/extensions/pi-subagents/src/runs/shared/turn-budget.ts +52 -0
- package/dist/extensions/pi-subagents/src/runs/shared/worktree.ts +28 -5
- package/dist/extensions/pi-subagents/src/shared/artifacts.ts +16 -1
- package/dist/extensions/pi-subagents/src/shared/atomic-json.ts +15 -2
- package/dist/extensions/pi-subagents/src/shared/child-transcript.ts +212 -0
- package/dist/extensions/pi-subagents/src/shared/fork-context.ts +133 -22
- package/dist/extensions/pi-subagents/src/shared/settings.ts +3 -1
- package/dist/extensions/pi-subagents/src/shared/types.ts +197 -4
- package/dist/extensions/pi-subagents/src/shared/utils.ts +108 -17
- package/dist/extensions/pi-subagents/src/slash/prompt-workflows.ts +330 -0
- package/dist/extensions/pi-subagents/src/slash/slash-commands.ts +135 -4
- package/dist/extensions/pi-subagents/src/tui/render.ts +32 -12
- package/dist/extensions/pi-subagents/test/e2e/real-session-subagent.test.ts +94 -0
- package/dist/extensions/pi-subagents/test/integration/async-execution.test.ts +2772 -0
- package/dist/extensions/pi-subagents/test/integration/async-job-tracker.test.ts +1107 -0
- package/dist/extensions/pi-subagents/test/integration/async-status.test.ts +463 -0
- package/dist/extensions/pi-subagents/test/integration/chain-clarify.test.ts +274 -0
- package/dist/extensions/pi-subagents/test/integration/chain-execution.test.ts +1535 -0
- package/dist/extensions/pi-subagents/test/integration/detect-error.test.ts +242 -0
- package/dist/extensions/pi-subagents/test/integration/doctor-executor.test.ts +128 -0
- package/dist/extensions/pi-subagents/test/integration/error-handling.test.ts +252 -0
- package/dist/extensions/pi-subagents/test/integration/foreground-result-size.test.ts +188 -0
- package/dist/extensions/pi-subagents/test/integration/fork-context-execution.test.ts +1306 -0
- package/dist/extensions/pi-subagents/test/integration/intercom-result-delivery.test.ts +1033 -0
- package/dist/extensions/pi-subagents/test/integration/parallel-execution.test.ts +397 -0
- package/dist/extensions/pi-subagents/test/integration/render-fork-badge.test.ts +583 -0
- package/dist/extensions/pi-subagents/test/integration/render-widget.test.ts +691 -0
- package/dist/extensions/pi-subagents/test/integration/result-watcher.test.ts +892 -0
- package/dist/extensions/pi-subagents/test/integration/session-tokens.test.ts +62 -0
- package/dist/extensions/pi-subagents/test/integration/single-execution.test.ts +1824 -0
- package/dist/extensions/pi-subagents/test/integration/slash-commands.test.ts +1284 -0
- package/dist/extensions/pi-subagents/test/integration/slash-live-state.test.ts +127 -0
- package/dist/extensions/pi-subagents/test/integration/template-resolution.test.ts +299 -0
- package/dist/extensions/pi-subagents/test/integration/top-level-async.test.ts +37 -0
- package/dist/extensions/pi-subagents/test/support/helpers.ts +189 -0
- package/dist/extensions/pi-subagents/test/support/mock-pi-script.mjs +335 -0
- package/dist/extensions/pi-subagents/test/support/mock-pi.ts +129 -0
- package/dist/extensions/pi-subagents/test/support/real-session-child-cli.mjs +184 -0
- package/dist/extensions/pi-subagents/test/support/real-session-runner.ts +285 -0
- package/dist/extensions/pi-subagents/test/support/register-loader.mjs +15 -0
- package/dist/extensions/pi-subagents/test/support/ts-loader.mjs +108 -0
- package/dist/extensions/pi-subagents/test/unit/acceptance.test.ts +421 -0
- package/dist/extensions/pi-subagents/test/unit/agent-disabled.test.ts +213 -0
- package/dist/extensions/pi-subagents/test/unit/agent-eject-disable.test.ts +343 -0
- package/dist/extensions/pi-subagents/test/unit/agent-frontmatter.test.ts +1199 -0
- package/dist/extensions/pi-subagents/test/unit/agent-management.test.ts +556 -0
- package/dist/extensions/pi-subagents/test/unit/agent-memory.test.ts +420 -0
- package/dist/extensions/pi-subagents/test/unit/agent-overrides.test.ts +579 -0
- package/dist/extensions/pi-subagents/test/unit/agent-scope.test.ts +20 -0
- package/dist/extensions/pi-subagents/test/unit/agent-selection.test.ts +88 -0
- package/dist/extensions/pi-subagents/test/unit/artifacts.test.ts +24 -0
- package/dist/extensions/pi-subagents/test/unit/async-execution.test.ts +86 -0
- package/dist/extensions/pi-subagents/test/unit/async-interrupt-action.test.ts +221 -0
- package/dist/extensions/pi-subagents/test/unit/async-permission-session.test.ts +98 -0
- package/dist/extensions/pi-subagents/test/unit/async-resume.test.ts +285 -0
- package/dist/extensions/pi-subagents/test/unit/atomic-json.test.ts +112 -0
- package/dist/extensions/pi-subagents/test/unit/chain-append.test.ts +206 -0
- package/dist/extensions/pi-subagents/test/unit/chain-root-attachment.test.ts +159 -0
- package/dist/extensions/pi-subagents/test/unit/chain-serializer.test.ts +229 -0
- package/dist/extensions/pi-subagents/test/unit/child-transcript.test.ts +225 -0
- package/dist/extensions/pi-subagents/test/unit/close-grace-timer.test.ts +101 -0
- package/dist/extensions/pi-subagents/test/unit/completion-batcher.test.ts +228 -0
- package/dist/extensions/pi-subagents/test/unit/completion-dedupe.test.ts +36 -0
- package/dist/extensions/pi-subagents/test/unit/completion-guard.test.ts +152 -0
- package/dist/extensions/pi-subagents/test/unit/config-dir-runtime.test.ts +72 -0
- package/dist/extensions/pi-subagents/test/unit/control-channel.test.ts +327 -0
- package/dist/extensions/pi-subagents/test/unit/control-notices.test.ts +161 -0
- package/dist/extensions/pi-subagents/test/unit/doctor.test.ts +159 -0
- package/dist/extensions/pi-subagents/test/unit/dynamic-fanout.test.ts +217 -0
- package/dist/extensions/pi-subagents/test/unit/extra-agent-dirs.test.ts +88 -0
- package/dist/extensions/pi-subagents/test/unit/file-coalescer.test.ts +68 -0
- package/dist/extensions/pi-subagents/test/unit/foreground-tool-call-compaction.test.ts +78 -0
- package/dist/extensions/pi-subagents/test/unit/fork-context.test.ts +415 -0
- package/dist/extensions/pi-subagents/test/unit/get-final-output.test.ts +126 -0
- package/dist/extensions/pi-subagents/test/unit/index-child-registration.test.ts +271 -0
- package/dist/extensions/pi-subagents/test/unit/intercom-bridge.test.ts +173 -0
- package/dist/extensions/pi-subagents/test/unit/jsonl-writer.test.ts +119 -0
- package/dist/extensions/pi-subagents/test/unit/live-async-resume.test.ts +170 -0
- package/dist/extensions/pi-subagents/test/unit/model-fallback.test.ts +346 -0
- package/dist/extensions/pi-subagents/test/unit/model-info.test.ts +62 -0
- package/dist/extensions/pi-subagents/test/unit/model-scope-settings.test.ts +87 -0
- package/dist/extensions/pi-subagents/test/unit/model-scope.test.ts +145 -0
- package/dist/extensions/pi-subagents/test/unit/native-supervisor-channel.test.ts +162 -0
- package/dist/extensions/pi-subagents/test/unit/nested-control.test.ts +470 -0
- package/dist/extensions/pi-subagents/test/unit/nested-events.test.ts +329 -0
- package/dist/extensions/pi-subagents/test/unit/notify.test.ts +319 -0
- package/dist/extensions/pi-subagents/test/unit/package-manifest.test.ts +70 -0
- package/dist/extensions/pi-subagents/test/unit/parallel-utils.test.ts +247 -0
- package/dist/extensions/pi-subagents/test/unit/path-handling.test.ts +113 -0
- package/dist/extensions/pi-subagents/test/unit/path-resolution.test.ts +94 -0
- package/dist/extensions/pi-subagents/test/unit/pi-args.test.ts +803 -0
- package/dist/extensions/pi-subagents/test/unit/pi-coding-agent-dir.test.ts +209 -0
- package/dist/extensions/pi-subagents/test/unit/pi-spawn.test.ts +238 -0
- package/dist/extensions/pi-subagents/test/unit/proactive-skills.test.ts +118 -0
- package/dist/extensions/pi-subagents/test/unit/profiles.test.ts +299 -0
- package/dist/extensions/pi-subagents/test/unit/prompt-template-bridge.test.ts +408 -0
- package/dist/extensions/pi-subagents/test/unit/prompt-workflows.test.ts +134 -0
- package/dist/extensions/pi-subagents/test/unit/recursion-guard.test.ts +257 -0
- package/dist/extensions/pi-subagents/test/unit/render-helpers.test.ts +209 -0
- package/dist/extensions/pi-subagents/test/unit/result-intercom.test.ts +226 -0
- package/dist/extensions/pi-subagents/test/unit/rpc.test.ts +294 -0
- package/dist/extensions/pi-subagents/test/unit/run-id-resolver.test.ts +147 -0
- package/dist/extensions/pi-subagents/test/unit/run-status.test.ts +997 -0
- package/dist/extensions/pi-subagents/test/unit/scheduled-runs.test.ts +478 -0
- package/dist/extensions/pi-subagents/test/unit/schemas.test.ts +562 -0
- package/dist/extensions/pi-subagents/test/unit/single-output.test.ts +213 -0
- package/dist/extensions/pi-subagents/test/unit/skills-fallback.test.ts +438 -0
- package/dist/extensions/pi-subagents/test/unit/slash-bridge.test.ts +54 -0
- package/dist/extensions/pi-subagents/test/unit/slash-chain-groups.test.ts +464 -0
- package/dist/extensions/pi-subagents/test/unit/stale-run-reconciler.test.ts +255 -0
- package/dist/extensions/pi-subagents/test/unit/status-format.test.ts +19 -0
- package/dist/extensions/pi-subagents/test/unit/subagent-control.test.ts +245 -0
- package/dist/extensions/pi-subagents/test/unit/subagent-prompt-runtime.test.ts +517 -0
- package/dist/extensions/pi-subagents/test/unit/temp-paths.test.ts +72 -0
- package/dist/extensions/pi-subagents/test/unit/tool-budget.test.ts +52 -0
- package/dist/extensions/pi-subagents/test/unit/tool-description.test.ts +237 -0
- package/dist/extensions/pi-subagents/test/unit/total-cost.test.ts +60 -0
- package/dist/extensions/pi-subagents/test/unit/ts-loader.test.ts +33 -0
- package/dist/extensions/pi-subagents/test/unit/turn-budget.test.ts +202 -0
- package/dist/extensions/pi-subagents/test/unit/types-fork-preamble.test.ts +23 -0
- package/dist/extensions/pi-subagents/test/unit/wait.test.ts +398 -0
- package/dist/extensions/pi-subagents/test/unit/widget-nested-render.test.ts +88 -0
- package/dist/extensions/pi-subagents/test/unit/windows-hide-spawn.test.ts +26 -0
- package/dist/extensions/pi-subagents/test/unit/workflow-graph.test.ts +134 -0
- package/dist/extensions/pi-subagents/test/unit/worktree.test.ts +479 -0
- package/dist/extensions/pi-web-agent/package.json +2 -2
- package/dist/extensions/pi-web-agent/src/backends/settings-reader.ts +2 -2
- package/dist/extensions/pi-web-agent/src/changelog-notice.ts +5 -2
- package/dist/extensions/pi-web-agent/src/commands/web-agent-config.ts +1 -1
- package/dist/extensions/pi-web-agent/src/extension.ts +1 -1
- package/dist/extensions/pi-web-agent/src/presentation/config-store.ts +6 -4
- package/dist/extensions/question/helpers.ts +3 -3
- package/dist/extensions/question/index.ts +2 -2
- package/dist/extensions/question/navigation.ts +2 -2
- package/dist/extensions/question/package.json +2 -2
- package/dist/extensions/question/question-list.ts +2 -2
- package/dist/extensions/question/tests/question-list.test.ts +2 -2
- package/dist/extensions/question/tui-adapter.ts +2 -2
- package/dist/extensions/question/types.ts +2 -2
- package/dist/extensions/question/ui-protocol.ts +2 -2
- package/dist/extensions/rtk.ts +2 -2
- package/dist/extensions/tokenin-onboarding.ts +2 -2
- package/dist/extensions/undo.ts +1 -1
- package/dist/extensions/web-agent-onboarding.ts +3 -3
- package/dist/extensions/workflow/adapter.ts +16 -8
- package/dist/extensions/workflow/extension.ts +1 -1
- package/dist/extensions/workflow/package.json +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +4 -0
- package/dist/main.js.map +1 -1
- package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/assistant-message.js +2 -0
- package/dist/modes/interactive/components/assistant-message.js.map +1 -1
- package/dist/modes/interactive/components/first-time-setup.d.ts +1 -1
- package/dist/modes/interactive/components/first-time-setup.d.ts.map +1 -1
- package/dist/modes/interactive/components/first-time-setup.js +19 -5
- package/dist/modes/interactive/components/first-time-setup.js.map +1 -1
- package/dist/skills/caveman/SKILL.md +49 -0
- package/dist/skills/handoff-text/SKILL.md +13 -0
- package/dist/utils/thinking-tags.d.ts +7 -0
- package/dist/utils/thinking-tags.d.ts.map +1 -0
- package/dist/utils/thinking-tags.js +63 -0
- package/dist/utils/thinking-tags.js.map +1 -0
- package/docs/docs.json +4 -0
- package/docs/extensions.md +2 -0
- package/docs/settings.md +15 -0
- package/docs/shared-host-extensions.md +109 -0
- package/package.json +2 -2
|
@@ -3,10 +3,9 @@
|
|
|
3
3
|
// Uses module-level state (matching powerline-footer pattern).
|
|
4
4
|
|
|
5
5
|
import { complete, type Context } from "@earendil-works/pi-ai";
|
|
6
|
-
import type
|
|
6
|
+
import { getAgentDir, getSettingsPath, type ExtensionContext } from "@selesai/code";
|
|
7
7
|
import { existsSync, readFileSync, writeFileSync, mkdirSync } from "node:fs";
|
|
8
8
|
import { join, dirname } from "node:path";
|
|
9
|
-
import { homedir } from "node:os";
|
|
10
9
|
|
|
11
10
|
type VibeMode = "generate" | "file";
|
|
12
11
|
|
|
@@ -76,11 +75,6 @@ let recentVibes: string[] = [];
|
|
|
76
75
|
// Configuration Management
|
|
77
76
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
78
77
|
|
|
79
|
-
function getSettingsPath(): string {
|
|
80
|
-
const homeDir = process.env.HOME || process.env.USERPROFILE || homedir();
|
|
81
|
-
return join(homeDir, ".pi", "agent", "settings.json");
|
|
82
|
-
}
|
|
83
|
-
|
|
84
78
|
function isRecord(value: unknown): value is Record<string, unknown> {
|
|
85
79
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
86
80
|
}
|
|
@@ -208,8 +202,7 @@ function saveModelConfig(): boolean {
|
|
|
208
202
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
209
203
|
|
|
210
204
|
function getVibesDir(): string {
|
|
211
|
-
|
|
212
|
-
return join(homeDir, ".pi", "agent", "vibes");
|
|
205
|
+
return join(getAgentDir(), "vibes");
|
|
213
206
|
}
|
|
214
207
|
|
|
215
208
|
function toVibeFileSlug(theme: string): string {
|
|
@@ -231,7 +224,7 @@ function getVibeFilePath(theme: string): string {
|
|
|
231
224
|
function loadVibesFromFile(theme: string): string[] {
|
|
232
225
|
const filePath = getVibeFilePath(theme);
|
|
233
226
|
if (!existsSync(filePath)) return [];
|
|
234
|
-
|
|
227
|
+
|
|
235
228
|
try {
|
|
236
229
|
const content = readFileSync(filePath, "utf-8");
|
|
237
230
|
return content
|
|
@@ -247,12 +240,12 @@ function loadVibesFromFile(theme: string): string[] {
|
|
|
247
240
|
function saveVibesToFile(theme: string, vibes: string[]): void {
|
|
248
241
|
const vibesDir = getVibesDir();
|
|
249
242
|
const filePath = getVibeFilePath(theme);
|
|
250
|
-
|
|
243
|
+
|
|
251
244
|
// Ensure directory exists
|
|
252
245
|
if (!existsSync(vibesDir)) {
|
|
253
246
|
mkdirSync(vibesDir, { recursive: true });
|
|
254
247
|
}
|
|
255
|
-
|
|
248
|
+
|
|
256
249
|
writeFileSync(filePath, vibes.join("\n"));
|
|
257
250
|
}
|
|
258
251
|
|
|
@@ -269,26 +262,26 @@ function mulberry32(seed: number): () => number {
|
|
|
269
262
|
// Get vibe at index using seeded shuffle (no-repeat until all used)
|
|
270
263
|
function getVibeAtIndex(vibes: string[], index: number, seed: number): string {
|
|
271
264
|
if (vibes.length === 0) return `${config.fallback}...`;
|
|
272
|
-
|
|
265
|
+
|
|
273
266
|
// For small lists or when we've cycled through, just use modulo
|
|
274
267
|
const effectiveIndex = index % vibes.length;
|
|
275
|
-
|
|
268
|
+
|
|
276
269
|
// Create deterministic shuffle using seed
|
|
277
270
|
const rng = mulberry32(seed);
|
|
278
271
|
const indices = Array.from({ length: vibes.length }, (_, i) => i);
|
|
279
|
-
|
|
272
|
+
|
|
280
273
|
// Fisher-Yates shuffle with seeded RNG
|
|
281
274
|
for (let i = indices.length - 1; i > 0; i--) {
|
|
282
275
|
const j = Math.floor(rng() * (i + 1));
|
|
283
276
|
[indices[i], indices[j]] = [indices[j], indices[i]];
|
|
284
277
|
}
|
|
285
|
-
|
|
278
|
+
|
|
286
279
|
return vibes[indices[effectiveIndex]];
|
|
287
280
|
}
|
|
288
281
|
|
|
289
282
|
function getNextVibeFromFile(): string {
|
|
290
283
|
if (!config.theme) return `${config.fallback}...`;
|
|
291
|
-
|
|
284
|
+
|
|
292
285
|
// Load/reload cache if theme changed
|
|
293
286
|
if (vibeCacheTheme !== config.theme) {
|
|
294
287
|
vibeCache = loadVibesFromFile(config.theme);
|
|
@@ -296,11 +289,11 @@ function getNextVibeFromFile(): string {
|
|
|
296
289
|
vibeSeed = Date.now(); // New seed for new theme
|
|
297
290
|
vibeIndex = 0;
|
|
298
291
|
}
|
|
299
|
-
|
|
292
|
+
|
|
300
293
|
if (vibeCache.length === 0) {
|
|
301
294
|
return `${config.fallback}...`;
|
|
302
295
|
}
|
|
303
|
-
|
|
296
|
+
|
|
304
297
|
const vibe = getVibeAtIndex(vibeCache, vibeIndex, vibeSeed);
|
|
305
298
|
vibeIndex++;
|
|
306
299
|
return vibe;
|
|
@@ -313,12 +306,12 @@ function getNextVibeFromFile(): string {
|
|
|
313
306
|
function buildVibePrompt(ctx: VibeGenContext): string {
|
|
314
307
|
// Truncate user prompt to save tokens (most context in first 100 chars)
|
|
315
308
|
const task = ctx.userPrompt.slice(0, 100);
|
|
316
|
-
|
|
309
|
+
|
|
317
310
|
// Build exclusion list from recent vibes
|
|
318
|
-
const exclude = recentVibes.length > 0
|
|
311
|
+
const exclude = recentVibes.length > 0
|
|
319
312
|
? `Don't use: ${recentVibes.join(", ")}`
|
|
320
313
|
: "";
|
|
321
|
-
|
|
314
|
+
|
|
322
315
|
// Use configured template with variable substitution
|
|
323
316
|
return config.promptTemplate
|
|
324
317
|
.replace(/\{theme\}/g, ctx.theme)
|
|
@@ -328,28 +321,28 @@ function buildVibePrompt(ctx: VibeGenContext): string {
|
|
|
328
321
|
|
|
329
322
|
function parseVibeResponse(response: string, fallback: string): string {
|
|
330
323
|
if (!response) return `${fallback}...`;
|
|
331
|
-
|
|
324
|
+
|
|
332
325
|
// Take only the first line (AI sometimes adds explanations)
|
|
333
326
|
let vibe = response.trim().split('\n')[0].trim();
|
|
334
|
-
|
|
327
|
+
|
|
335
328
|
// Remove quotes if model wrapped the response
|
|
336
329
|
vibe = vibe.replace(/^["']|["']$/g, "");
|
|
337
|
-
|
|
330
|
+
|
|
338
331
|
// Ensure ellipsis
|
|
339
332
|
if (!vibe.endsWith("...")) {
|
|
340
333
|
vibe = vibe.replace(/\.+$/, "") + "...";
|
|
341
334
|
}
|
|
342
|
-
|
|
335
|
+
|
|
343
336
|
// Enforce length limit (configurable, default 65 chars)
|
|
344
337
|
if (vibe.length > config.maxLength) {
|
|
345
338
|
vibe = vibe.slice(0, config.maxLength - 3) + "...";
|
|
346
339
|
}
|
|
347
|
-
|
|
340
|
+
|
|
348
341
|
// Final validation
|
|
349
342
|
if (!vibe || vibe === "...") {
|
|
350
343
|
return `${fallback}...`;
|
|
351
344
|
}
|
|
352
|
-
|
|
345
|
+
|
|
353
346
|
return vibe;
|
|
354
347
|
}
|
|
355
348
|
|
|
@@ -375,7 +368,7 @@ async function generateVibe(
|
|
|
375
368
|
if (!extensionCtx) {
|
|
376
369
|
return `${config.fallback}...`;
|
|
377
370
|
}
|
|
378
|
-
|
|
371
|
+
|
|
379
372
|
// Parse model spec (provider/modelId format, where modelId may contain slashes)
|
|
380
373
|
const slashIndex = config.modelSpec.indexOf("/");
|
|
381
374
|
if (slashIndex === -1) {
|
|
@@ -386,23 +379,23 @@ async function generateVibe(
|
|
|
386
379
|
if (!provider || !modelId) {
|
|
387
380
|
return `${config.fallback}...`;
|
|
388
381
|
}
|
|
389
|
-
|
|
382
|
+
|
|
390
383
|
// Resolve model from registry
|
|
391
384
|
const model = extensionCtx.modelRegistry.find(provider, modelId);
|
|
392
385
|
if (!model) {
|
|
393
386
|
console.debug(`[working-vibes] Model not found: ${config.modelSpec}`);
|
|
394
387
|
return `${config.fallback}...`;
|
|
395
388
|
}
|
|
396
|
-
|
|
389
|
+
|
|
397
390
|
// Get auth
|
|
398
391
|
const auth = await extensionCtx.modelRegistry.getApiKeyAndHeaders(model);
|
|
399
392
|
if (!auth.ok) {
|
|
400
393
|
console.debug(`[working-vibes] Auth failed for ${provider}: ${auth.error}`);
|
|
401
394
|
return `${config.fallback}...`;
|
|
402
395
|
}
|
|
403
|
-
|
|
396
|
+
|
|
404
397
|
const aiContext = buildAiContext(buildVibePrompt(ctx));
|
|
405
|
-
|
|
398
|
+
|
|
406
399
|
const response = await complete(model, aiContext, { apiKey: auth.apiKey, headers: auth.headers, signal });
|
|
407
400
|
|
|
408
401
|
const textContent = response.content.find(c => c.type === "text");
|
|
@@ -415,7 +408,7 @@ async function generateVibe(
|
|
|
415
408
|
function trackRecentVibe(vibe: string): void {
|
|
416
409
|
// Don't track fallback messages
|
|
417
410
|
if (vibe === `${config.fallback}...`) return;
|
|
418
|
-
|
|
411
|
+
|
|
419
412
|
// Add to front, remove duplicates
|
|
420
413
|
recentVibes = [vibe, ...recentVibes.filter(v => v !== vibe)].slice(0, MAX_RECENT_VIBES);
|
|
421
414
|
}
|
|
@@ -425,7 +418,7 @@ function updateVibeFromFile(setWorkingMessage: (msg?: string) => void): void {
|
|
|
425
418
|
}
|
|
426
419
|
|
|
427
420
|
async function generateAndUpdate(
|
|
428
|
-
prompt: string,
|
|
421
|
+
prompt: string,
|
|
429
422
|
setWorkingMessage: (msg?: string) => void,
|
|
430
423
|
): Promise<void> {
|
|
431
424
|
// File mode: instant, no API call
|
|
@@ -433,27 +426,27 @@ async function generateAndUpdate(
|
|
|
433
426
|
updateVibeFromFile(setWorkingMessage);
|
|
434
427
|
return;
|
|
435
428
|
}
|
|
436
|
-
|
|
429
|
+
|
|
437
430
|
// Generate mode: API call with abort handling
|
|
438
431
|
// Cancel any in-flight generation and create new controller
|
|
439
432
|
// Capture in local variable to avoid race condition with subsequent calls
|
|
440
433
|
const controller = new AbortController();
|
|
441
434
|
currentGeneration?.abort();
|
|
442
435
|
currentGeneration = controller;
|
|
443
|
-
|
|
436
|
+
|
|
444
437
|
// Create timeout signal (3 seconds)
|
|
445
438
|
const timeoutSignal = AbortSignal.timeout(config.timeout);
|
|
446
439
|
const combinedSignal = AbortSignal.any([
|
|
447
440
|
controller.signal,
|
|
448
441
|
timeoutSignal,
|
|
449
442
|
]);
|
|
450
|
-
|
|
443
|
+
|
|
451
444
|
try {
|
|
452
445
|
const vibe = await generateVibe(
|
|
453
446
|
{ theme: config.theme!, userPrompt: prompt },
|
|
454
447
|
combinedSignal,
|
|
455
448
|
);
|
|
456
|
-
|
|
449
|
+
|
|
457
450
|
// Only update if still streaming and THIS generation wasn't aborted
|
|
458
451
|
if (isStreaming && !controller.signal.aborted) {
|
|
459
452
|
trackRecentVibe(vibe);
|
|
@@ -499,19 +492,19 @@ export function setVibeModel(modelSpec: string): boolean {
|
|
|
499
492
|
}
|
|
500
493
|
|
|
501
494
|
export function onVibeBeforeAgentStart(
|
|
502
|
-
prompt: string,
|
|
495
|
+
prompt: string,
|
|
503
496
|
setWorkingMessage: (msg?: string) => void,
|
|
504
497
|
): void {
|
|
505
498
|
// Skip if no theme configured or no extensionCtx
|
|
506
499
|
if (!config.theme || !extensionCtx) return;
|
|
507
|
-
|
|
500
|
+
|
|
508
501
|
// Queue themed placeholder BEFORE agent_start creates the loader
|
|
509
502
|
// This sets pendingWorkingMessage which is applied when loader is created
|
|
510
503
|
setWorkingMessage(`Channeling ${config.theme}...`);
|
|
511
|
-
|
|
504
|
+
|
|
512
505
|
// Mark vibe generation time for rate limiting
|
|
513
506
|
lastVibeTime = Date.now();
|
|
514
|
-
|
|
507
|
+
|
|
515
508
|
// Async: generate and update (fire-and-forget, don't await)
|
|
516
509
|
generateAndUpdate(prompt, setWorkingMessage);
|
|
517
510
|
}
|
|
@@ -528,11 +521,11 @@ export function onVibeToolCall(
|
|
|
528
521
|
): void {
|
|
529
522
|
// Skip if no theme, not streaming, or no extensionCtx
|
|
530
523
|
if (!config.theme || !extensionCtx || !isStreaming) return;
|
|
531
|
-
|
|
524
|
+
|
|
532
525
|
// Rate limit: skip if not enough time has passed
|
|
533
526
|
const now = Date.now();
|
|
534
527
|
if (now - lastVibeTime < config.refreshInterval) return;
|
|
535
|
-
|
|
528
|
+
|
|
536
529
|
// Prefer agent context if provided (richer, more contextual)
|
|
537
530
|
// Fall back to tool-based hint
|
|
538
531
|
let hint: string;
|
|
@@ -553,7 +546,7 @@ export function onVibeToolCall(
|
|
|
553
546
|
hint = `running command: ${cmd}`;
|
|
554
547
|
}
|
|
555
548
|
}
|
|
556
|
-
|
|
549
|
+
|
|
557
550
|
// Update time and generate new vibe
|
|
558
551
|
lastVibeTime = now;
|
|
559
552
|
generateAndUpdate(hint, setWorkingMessage);
|
|
@@ -613,11 +606,11 @@ export async function generateVibesBatch(
|
|
|
613
606
|
): Promise<GenerateVibesResult> {
|
|
614
607
|
const filePath = getVibeFilePath(theme);
|
|
615
608
|
const safeCount = Number.isFinite(count) ? Math.min(Math.max(Math.floor(count), 1), 500) : 100;
|
|
616
|
-
|
|
609
|
+
|
|
617
610
|
if (!extensionCtx) {
|
|
618
611
|
return { success: false, count: 0, filePath, error: "Extension not initialized" };
|
|
619
612
|
}
|
|
620
|
-
|
|
613
|
+
|
|
621
614
|
// Parse model spec
|
|
622
615
|
const slashIndex = config.modelSpec.indexOf("/");
|
|
623
616
|
if (slashIndex === -1) {
|
|
@@ -625,31 +618,31 @@ export async function generateVibesBatch(
|
|
|
625
618
|
}
|
|
626
619
|
const provider = config.modelSpec.slice(0, slashIndex);
|
|
627
620
|
const modelId = config.modelSpec.slice(slashIndex + 1);
|
|
628
|
-
|
|
621
|
+
|
|
629
622
|
// Resolve model
|
|
630
623
|
const model = extensionCtx.modelRegistry.find(provider, modelId);
|
|
631
624
|
if (!model) {
|
|
632
625
|
return { success: false, count: 0, filePath, error: `Model not found: ${config.modelSpec}` };
|
|
633
626
|
}
|
|
634
|
-
|
|
627
|
+
|
|
635
628
|
// Get auth
|
|
636
629
|
const auth = await extensionCtx.modelRegistry.getApiKeyAndHeaders(model);
|
|
637
630
|
if (!auth.ok) {
|
|
638
631
|
return { success: false, count: 0, filePath, error: auth.error };
|
|
639
632
|
}
|
|
640
|
-
|
|
633
|
+
|
|
641
634
|
// Build batch prompt
|
|
642
635
|
const prompt = BATCH_PROMPT
|
|
643
636
|
.replace(/\{theme\}/g, theme)
|
|
644
637
|
.replace(/\{count\}/g, String(safeCount));
|
|
645
|
-
|
|
638
|
+
|
|
646
639
|
const aiContext = buildAiContext(prompt);
|
|
647
|
-
|
|
640
|
+
|
|
648
641
|
try {
|
|
649
642
|
// Use longer timeout for batch generation (30 seconds)
|
|
650
643
|
const signal = AbortSignal.timeout(30000);
|
|
651
644
|
const response = await complete(model, aiContext, { apiKey: auth.apiKey, headers: auth.headers, signal });
|
|
652
|
-
|
|
645
|
+
|
|
653
646
|
const textContent = response.content.find(c => c.type === "text");
|
|
654
647
|
if (!textContent?.text) {
|
|
655
648
|
const error = response.stopReason === "error" && response.errorMessage
|
|
@@ -657,7 +650,7 @@ export async function generateVibesBatch(
|
|
|
657
650
|
: "Empty response from model";
|
|
658
651
|
return { success: false, count: 0, filePath, error };
|
|
659
652
|
}
|
|
660
|
-
|
|
653
|
+
|
|
661
654
|
// Parse response: one vibe per line
|
|
662
655
|
const vibes = textContent.text
|
|
663
656
|
.split("\n")
|
|
@@ -673,20 +666,20 @@ export async function generateVibesBatch(
|
|
|
673
666
|
return vibe;
|
|
674
667
|
})
|
|
675
668
|
.filter(vibe => vibe.length > 3 && vibe !== "..."); // Filter invalid
|
|
676
|
-
|
|
669
|
+
|
|
677
670
|
if (vibes.length === 0) {
|
|
678
671
|
return { success: false, count: 0, filePath, error: "No valid vibes generated" };
|
|
679
672
|
}
|
|
680
|
-
|
|
673
|
+
|
|
681
674
|
// Save to file
|
|
682
675
|
saveVibesToFile(theme, vibes);
|
|
683
|
-
|
|
676
|
+
|
|
684
677
|
// Clear cache so next use loads fresh
|
|
685
678
|
if (vibeCacheTheme === theme) {
|
|
686
679
|
vibeCache = [];
|
|
687
680
|
vibeCacheTheme = null;
|
|
688
681
|
}
|
|
689
|
-
|
|
682
|
+
|
|
690
683
|
return { success: true, count: vibes.length, filePath };
|
|
691
684
|
} catch (error) {
|
|
692
685
|
const message = error instanceof Error ? error.message : "Unknown error";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { getAgentDir, type ExtensionAPI, type ExtensionContext } from "@
|
|
1
|
+
import { getAgentDir, type ExtensionAPI, type ExtensionContext } from "@selesai/code";
|
|
2
2
|
import { exec as execCb } from "child_process";
|
|
3
3
|
import { existsSync, readFileSync, realpathSync } from "fs";
|
|
4
4
|
import { mkdtemp, readdir, readFile, rm, stat } from "fs/promises";
|