@timurproko/a1 0.2.7-dev.1275 → 0.2.7-dev.1285
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/README.md +5 -1
- package/dist/app/session-shell/apps-dialog.d.ts +1 -1
- package/dist/app/session-shell/apps-dialog.js +2 -1
- package/dist/app/session-shell/dialog-coordinator.d.ts +4 -5
- package/dist/app/session-shell/dialog-coordinator.js +41 -12
- package/dist/app/session-shell/input-route.d.ts +23 -0
- package/dist/app/session-shell/input-route.js +59 -0
- package/dist/app/session-shell/session-selectors.d.ts +3 -3
- package/dist/app/session-shell/session-selectors.js +7 -2
- package/dist/app/session-shell/session-shell-root.d.ts +4 -68
- package/dist/app/session-shell/session-shell-root.js +6 -2
- package/dist/app/session-shell/session-shell.js +9 -13
- package/dist/app/session-shell/shell-host.js +2 -2
- package/dist/app/session-shell/shell-options.d.ts +65 -0
- package/dist/app/session-shell/shell-options.js +1 -0
- package/dist/app/session-shell/viewport-pointer.js +5 -1
- package/dist/app/session-shell/workflow-router.d.ts +4 -2
- package/dist/app/session-shell/workflow-router.js +12 -0
- package/dist/cli/dispatch.js +27 -1
- package/dist/cli/packages.js +18 -2
- package/dist/cli/session-context.js +6 -2
- package/dist/composition/owned-ui.js +20 -8
- package/dist/composition/session-naming.js +1 -1
- package/dist/composition/session-runtime-registry.d.ts +2 -0
- package/dist/composition/session-runtime-registry.js +49 -9
- package/dist/composition/settings-route-host.js +1 -0
- package/dist/contracts/agent-engine/package-ports.d.ts +10 -14
- package/dist/contracts/agent-engine/package-ports.js +5 -9
- package/dist/contracts/owned-ui/session-workflows.d.ts +6 -0
- package/dist/contracts/owned-ui/shell-components.d.ts +10 -0
- package/dist/contracts/presentation/component.d.ts +7 -0
- package/dist/contracts/presentation/index.d.ts +3 -0
- package/dist/contracts/presentation/index.js +4 -0
- package/dist/contracts/presentation/progress-palette.generated.d.ts +25 -1
- package/dist/contracts/presentation/progress-palette.generated.js +2 -135
- package/dist/contracts/presentation/progress-spinner.d.ts +7 -0
- package/dist/contracts/presentation/progress-spinner.js +1 -0
- package/dist/features/launch/session-context.d.ts +8 -0
- package/dist/features/launch/session-context.js +19 -10
- package/dist/features/owned-ui/project-trust-dialog.d.ts +1 -1
- package/dist/features/owned-ui/project-trust-dialog.js +5 -5
- package/dist/features/owned-ui/project-trust-prompt.js +2 -2
- package/dist/features/owned-ui/reference-screen-app.d.ts +2 -0
- package/dist/features/owned-ui/reference-screen-app.js +12 -5
- package/dist/features/owned-ui/session-fork-prompt.d.ts +2 -1
- package/dist/features/owned-ui/session-fork-prompt.js +11 -5
- package/dist/features/owned-ui/settings-app.d.ts +1 -1
- package/dist/features/owned-ui/settings-app.js +20 -13
- package/dist/features/owned-ui/settings-model-dialog.js +3 -3
- package/dist/features/owned-ui/settings-spinner-preview.d.ts +9 -0
- package/dist/features/owned-ui/settings-spinner-preview.js +29 -0
- package/dist/features/session-naming/context.d.ts +17 -0
- package/dist/features/session-naming/context.js +39 -0
- package/dist/features/session-naming/controller.d.ts +1 -5
- package/dist/features/session-naming/controller.js +7 -4
- package/dist/features/session-naming/generate.d.ts +2 -1
- package/dist/features/session-naming/generate.js +14 -10
- package/dist/features/session-naming/index.d.ts +1 -1
- package/dist/foundation/lifecycle/index.d.ts +3 -1
- package/dist/foundation/lifecycle/index.js +3 -1
- package/dist/foundation/lifecycle/session-claim-lock.d.ts +2 -2
- package/dist/foundation/lifecycle/session-claim-lock.js +36 -10
- package/dist/foundation/lifecycle/session-context-retry.d.ts +2 -0
- package/dist/foundation/lifecycle/session-context-retry.js +17 -0
- package/dist/foundation/lifecycle/session-repository-context.d.ts +7 -1
- package/dist/foundation/lifecycle/session-repository-context.js +105 -39
- package/dist/foundation/lifecycle/session-worktree-entry.d.ts +3 -0
- package/dist/foundation/lifecycle/session-worktree-entry.js +87 -0
- package/dist/foundation/release/automatic-update.js +2 -2
- package/dist/foundation/release/bootstrap.js +19 -3
- package/dist/foundation/release/release-gc.js +20 -5
- package/dist/foundation/release/release-state.d.ts +12 -3
- package/dist/foundation/release/release-state.js +55 -24
- package/dist/foundation/release/release-use.d.ts +10 -0
- package/dist/foundation/release/release-use.js +70 -0
- package/dist/foundation/release/update-activation.js +2 -2
- package/dist/foundation/release/update-recovery.js +2 -2
- package/dist/foundation/release/update.js +1 -1
- package/dist/foundation/release/warmup.js +8 -9
- package/dist/foundation/session-writer-lock/index.d.ts +2 -2
- package/dist/foundation/session-writer-lock/index.js +82 -12
- package/dist/foundation/startup/startup-descriptor.js +2 -2
- package/dist/foundation/terminal-cleanup/fatal-diagnostic.d.ts +2 -0
- package/dist/foundation/terminal-cleanup/fatal-diagnostic.js +59 -0
- package/dist/foundation/terminal-cleanup/fatal-exit.js +1 -29
- package/dist/integrations/pi/components/deferred-selector.d.ts +6 -0
- package/dist/integrations/pi/components/deferred-selector.js +40 -0
- package/dist/integrations/pi/components/login-dialog-loader.d.ts +3 -0
- package/dist/integrations/pi/components/login-dialog-loader.js +57 -0
- package/dist/integrations/pi/components/login-links.d.ts +6 -0
- package/dist/integrations/pi/components/login-links.js +31 -0
- package/dist/integrations/pi/components/login-text.d.ts +7 -0
- package/dist/integrations/pi/components/login-text.js +17 -0
- package/dist/integrations/pi/components/modal-frame.d.ts +5 -0
- package/dist/integrations/pi/components/modal-frame.js +30 -2
- package/dist/integrations/pi/components/resources/builtin-themes.d.ts +2 -2
- package/dist/integrations/pi/components/resources/builtin-themes.js +2 -2
- package/dist/integrations/pi/components/share-operation-dialog.d.ts +2 -1
- package/dist/integrations/pi/components/share-operation-dialog.js +13 -5
- package/dist/integrations/pi/components/shell-footer-status.d.ts +2 -1
- package/dist/integrations/pi/components/shell-footer-status.js +15 -8
- package/dist/integrations/pi/components/shell-selectors-dialogs.d.ts +11 -8
- package/dist/integrations/pi/components/shell-selectors-dialogs.js +36 -35
- package/dist/integrations/pi/components/shell-session-info-reference.d.ts +1 -1
- package/dist/integrations/pi/components/shell-session-info-reference.js +55 -49
- package/dist/integrations/pi/components/theme.d.ts +2 -0
- package/dist/integrations/pi/components/theme.js +4 -0
- package/dist/integrations/pi/components/upstream/adjacent/core/keybindings.d.ts +1 -1
- package/dist/integrations/pi/components/upstream/adjacent/core/keybindings.js +1 -1
- package/dist/integrations/pi/components/upstream/assets/earendil-image.json +2 -2
- package/dist/integrations/pi/components/upstream/components/auth-url.d.ts +16 -0
- package/dist/integrations/pi/components/upstream/components/auth-url.js +49 -0
- package/dist/integrations/pi/components/upstream/components/countdown-timer.d.ts +1 -1
- package/dist/integrations/pi/components/upstream/components/earendil-announcement.js +1 -1
- package/dist/integrations/pi/components/upstream/components/extension-editor.d.ts +1 -1
- package/dist/integrations/pi/components/upstream/components/extension-editor.js +1 -1
- package/dist/integrations/pi/components/upstream/components/extension-input.js +1 -1
- package/dist/integrations/pi/components/upstream/components/extension-selector.d.ts +1 -0
- package/dist/integrations/pi/components/upstream/components/extension-selector.js +22 -11
- package/dist/integrations/pi/components/upstream/components/login-dialog.d.ts +3 -0
- package/dist/integrations/pi/components/upstream/components/login-dialog.js +216 -0
- package/dist/integrations/pi/components/upstream/components/mermaid.js +1 -1
- package/dist/integrations/pi/components/upstream/components/oauth-selector.d.ts +19 -0
- package/dist/integrations/pi/components/upstream/components/oauth-selector.js +123 -0
- package/dist/integrations/pi/components/upstream/components/owned-editor.d.ts +1 -1
- package/dist/integrations/pi/components/upstream/components/owned-editor.js +1 -1
- package/dist/integrations/pi/components/upstream/components/pi-logo.js +1 -1
- package/dist/integrations/pi/components/upstream/components/scoped-models-selector.d.ts +1 -1
- package/dist/integrations/pi/components/upstream/components/session-footer.js +22 -13
- package/dist/integrations/pi/components/upstream/components/session-selector-search.js +1 -1
- package/dist/integrations/pi/components/upstream/components/session-selector.js +1 -1
- package/dist/integrations/pi/components/upstream/components/skill-invocation-message.d.ts +1 -1
- package/dist/integrations/pi/components/upstream/components/skill-invocation-message.js +1 -1
- package/dist/integrations/pi/components/upstream/components/status-indicator.d.ts +1 -1
- package/dist/integrations/pi/components/upstream/components/status-indicator.js +1 -1
- package/dist/integrations/pi/components/upstream/components/themed-text.d.ts +1 -1
- package/dist/integrations/pi/components/upstream/components/themed-text.js +1 -1
- package/dist/integrations/pi/components/upstream/components/thinking-selector.d.ts +1 -1
- package/dist/integrations/pi/components/upstream/components/thinking-selector.js +1 -1
- package/dist/integrations/pi/components/upstream/components/tool-execution.js +1 -1
- package/dist/integrations/pi/components/upstream/components/tree-selector.d.ts +1 -1
- package/dist/integrations/pi/components/upstream/components/tree-selector.js +1 -1
- package/dist/integrations/pi/components/upstream/components/trust-selector.d.ts +2 -0
- package/dist/integrations/pi/components/upstream/components/trust-selector.js +30 -13
- package/dist/integrations/pi/components/upstream/external-editor.js +1 -1
- package/dist/integrations/pi/components/upstream/history/editor-core.d.ts +1 -1
- package/dist/integrations/pi/components/upstream/history/editor-core.js +1 -1
- package/dist/integrations/pi/components/upstream/history/kill-ring.d.ts +1 -1
- package/dist/integrations/pi/components/upstream/history/kill-ring.js +1 -1
- package/dist/integrations/pi/components/upstream/history/printable-key.js +1 -1
- package/dist/integrations/pi/components/upstream/history/text-helpers.js +1 -1
- package/dist/integrations/pi/components/upstream/history/undo-stack.d.ts +1 -1
- package/dist/integrations/pi/components/upstream/history/undo-stack.js +1 -1
- package/dist/integrations/pi/components/upstream/history/word-navigation.js +1 -1
- package/dist/integrations/pi/components/upstream/model-search.d.ts +1 -1
- package/dist/integrations/pi/components/upstream/program-status-reporter.d.ts +1 -1
- package/dist/integrations/pi/components/upstream/theme/theme.js +1 -1
- package/dist/integrations/pi/engine/adapter.d.ts +3 -1
- package/dist/integrations/pi/engine/adapter.js +24 -6
- package/dist/integrations/pi/engine/changelog.js +5 -2
- package/dist/integrations/pi/engine/delivery-retention.d.ts +7 -0
- package/dist/integrations/pi/engine/delivery-retention.js +66 -0
- package/dist/integrations/pi/engine/event-delivery.d.ts +17 -1
- package/dist/integrations/pi/engine/event-delivery.js +25 -3
- package/dist/integrations/pi/engine/extension-ui-binding.d.ts +2 -1
- package/dist/integrations/pi/engine/extension-ui-binding.js +45 -0
- package/dist/integrations/pi/engine/host-ports.d.ts +2 -0
- package/dist/integrations/pi/engine/host.d.ts +3 -0
- package/dist/integrations/pi/engine/host.js +2 -0
- package/dist/integrations/pi/engine/package-integration.js +19 -4
- package/dist/integrations/pi/engine/pending-delivery.d.ts +4 -1
- package/dist/integrations/pi/engine/pending-delivery.js +51 -18
- package/dist/integrations/pi/engine/resources/changelog.json +4 -4
- package/dist/integrations/pi/engine/runtime-integration.d.ts +8 -0
- package/dist/integrations/pi/engine/runtime-integration.js +58 -9
- package/dist/integrations/pi/engine/session-cwd-recovery.d.ts +11 -0
- package/dist/integrations/pi/engine/session-cwd-recovery.js +18 -0
- package/dist/integrations/pi/engine/session-runtime.d.ts +3 -0
- package/dist/integrations/pi/engine/session-runtime.js +2 -0
- package/dist/integrations/pi/engine/session-selection.d.ts +3 -2
- package/dist/integrations/pi/engine/session-selection.js +25 -5
- package/dist/integrations/pi/engine/transcript-image-assets.d.ts +3 -0
- package/dist/integrations/pi/engine/transcript-image-assets.js +65 -14
- package/dist/integrations/pi/engine/view-state.d.ts +14 -0
- package/dist/integrations/pi/engine/view-state.js +17 -0
- package/dist/integrations/pi/engine/workflow-runner.d.ts +2 -0
- package/dist/integrations/pi/engine/workflow-runner.js +47 -26
- package/dist/integrations/pi/engine/worktree-tools.d.ts +4 -0
- package/dist/integrations/pi/engine/worktree-tools.js +26 -0
- package/dist/integrations/pi/session-presenters/components.d.ts +2 -1
- package/dist/integrations/pi/session-presenters/components.js +12 -10
- package/dist/integrations/pi/session-presenters/presenters.d.ts +3 -1
- package/dist/integrations/pi/session-presenters/presenters.js +2 -2
- package/dist/integrations/pi/startup-public.d.ts +1 -1
- package/dist/integrations/pi/startup-public.js +16 -20
- package/dist/integrations/pi/startup-public.manifest.json +29 -29
- package/dist/integrations/pi/tui-runtime/damage-aware-terminal.d.ts +1 -1
- package/dist/integrations/pi/tui-runtime/damage-aware-terminal.js +1 -1
- package/dist/product-identity.json +1 -1
- package/dist/runtime-payload-inventory.json +5027 -5027
- package/dist/ui/components/index.d.ts +1 -1
- package/dist/ui/components/index.js +1 -1
- package/dist/ui/components/list-block.d.ts +2 -2
- package/dist/ui/components/list-block.js +4 -3
- package/dist/ui/components/progress-status.d.ts +7 -0
- package/dist/ui/components/progress-status.js +21 -0
- package/dist/ui/components/value-menu.d.ts +1 -1
- package/dist/ui/components/value-menu.js +4 -2
- package/dist/ui/settings/declarations.d.ts +16 -4
- package/dist/ui/settings/declarations.js +13 -4
- package/dist/ui/settings/early-accent.d.ts +24 -0
- package/docs/architecture/internal-naming.md +1 -1
- package/docs/architecture/project-structure.md +7 -11
- package/docs/features/session-exports.md +1 -1
- package/docs/features/session-naming.md +8 -6
- package/docs/features/worktrees.md +38 -0
- package/docs/local-worktree-cleanup.md +27 -4
- package/docs/openspec-archive-automation.md +30 -4
- package/docs/worktree-link-recovery.md +2 -2
- package/package.json +5 -5
package/dist/cli/dispatch.js
CHANGED
|
@@ -20,6 +20,10 @@ export function cliUsage(capabilities) {
|
|
|
20
20
|
"uninstall [--yes] [--purge]",
|
|
21
21
|
"uninstall <source>",
|
|
22
22
|
"list",
|
|
23
|
+
"worktree enter <branch> [--base <branch>]",
|
|
24
|
+
"worktree attach <path>",
|
|
25
|
+
"worktree detach",
|
|
26
|
+
"worktree list",
|
|
23
27
|
"session worktrees",
|
|
24
28
|
"session link-worktree <path>",
|
|
25
29
|
"session unlink-worktree",
|
|
@@ -51,7 +55,13 @@ export function cliHelp(capabilities) {
|
|
|
51
55
|
` ${command} uninstall <source>`,
|
|
52
56
|
` ${command} list`,
|
|
53
57
|
"",
|
|
54
|
-
"
|
|
58
|
+
"Worktrees (successful enter/attach is authoritative; detach preserves files):",
|
|
59
|
+
` ${command} worktree enter <branch> [--base <branch>]`,
|
|
60
|
+
` ${command} worktree attach <path>`,
|
|
61
|
+
` ${command} worktree detach`,
|
|
62
|
+
` ${command} worktree list`,
|
|
63
|
+
"",
|
|
64
|
+
"Session context (compatibility aliases):",
|
|
55
65
|
` ${command} session worktrees`,
|
|
56
66
|
` ${command} session link-worktree <path>`,
|
|
57
67
|
` ${command} session unlink-worktree`,
|
|
@@ -123,6 +133,8 @@ export function parseCliCommand(arguments_, capabilities) {
|
|
|
123
133
|
}
|
|
124
134
|
if (command === "update")
|
|
125
135
|
return parseUpdate(rest, capabilities.runningChannel ?? "stable");
|
|
136
|
+
if (command === "worktree")
|
|
137
|
+
return parseWorktree(rest);
|
|
126
138
|
if (command === "session")
|
|
127
139
|
return parseSessionContext(rest);
|
|
128
140
|
if (command?.startsWith("update:"))
|
|
@@ -131,6 +143,20 @@ export function parseCliCommand(arguments_, capabilities) {
|
|
|
131
143
|
// explicit, and a typo must never start an interactive or maintenance path.
|
|
132
144
|
return { kind: "noop" };
|
|
133
145
|
}
|
|
146
|
+
function parseWorktree(rest) {
|
|
147
|
+
const [action, value, flag, base, extra] = rest;
|
|
148
|
+
if (action === "enter" && value !== undefined && !value.startsWith("-")
|
|
149
|
+
&& (flag === undefined || (flag === "--base" && base !== undefined && !base.startsWith("-"))) && extra === undefined) {
|
|
150
|
+
return { kind: "session-context", request: { action: "enter-worktree", branch: value, ...(base === undefined ? {} : { base }) } };
|
|
151
|
+
}
|
|
152
|
+
if (action === "attach" && value !== undefined && flag === undefined) {
|
|
153
|
+
return { kind: "session-context", request: { action: "link-worktree", path: value } };
|
|
154
|
+
}
|
|
155
|
+
if ((action === "detach" || action === "list") && value === undefined) {
|
|
156
|
+
return { kind: "session-context", request: { action: action === "detach" ? "unlink-worktree" : "worktrees" } };
|
|
157
|
+
}
|
|
158
|
+
return { kind: "error", message: PRODUCT_TEXT.diagnostic("worktree accepts enter <branch> [--base <branch>], attach <path>, detach, or list.") };
|
|
159
|
+
}
|
|
134
160
|
function parseSessionContext(rest) {
|
|
135
161
|
const [action, value, extra] = rest;
|
|
136
162
|
if (action === "link-worktree") {
|
package/dist/cli/packages.js
CHANGED
|
@@ -21,7 +21,7 @@ export async function runPackageCommand(request, environment) {
|
|
|
21
21
|
const port = environment.createPort({
|
|
22
22
|
profileRoot,
|
|
23
23
|
cwd,
|
|
24
|
-
onProgress: progress => stdout(style.dim(`${progress.message}\n`)),
|
|
24
|
+
onProgress: progress => stdout((progress.severity === "warning" ? style.yellow : style.dim)(`${progress.message}\n`)),
|
|
25
25
|
onDiagnostic: diagnostic => {
|
|
26
26
|
stderr(`${style.yellow(diagnostic.message)}\n`);
|
|
27
27
|
if (diagnostic.detail)
|
|
@@ -60,11 +60,27 @@ export function renderPackageOutcome(outcome, style = chalk) {
|
|
|
60
60
|
case "remove":
|
|
61
61
|
return `${style.green(`Removed ${outcome.source}`)}\n`;
|
|
62
62
|
case "update":
|
|
63
|
-
return
|
|
63
|
+
return renderPackageUpdate(outcome, style);
|
|
64
64
|
case "list":
|
|
65
65
|
return renderPackageList(outcome, style);
|
|
66
66
|
}
|
|
67
67
|
}
|
|
68
|
+
function renderPackageUpdate(outcome, style) {
|
|
69
|
+
const summary = outcome.updateSummary;
|
|
70
|
+
if (summary?.offline)
|
|
71
|
+
return `${style.yellow("Skipped package updates (offline mode)")}\n`;
|
|
72
|
+
const changes = summary?.changes ?? [];
|
|
73
|
+
if (changes.length > 0) {
|
|
74
|
+
const heading = `Updated ${changes.length} package${changes.length === 1 ? "" : "s"}:`;
|
|
75
|
+
return `${style.green(heading)}\n${changes.map(change => ` ${change}\n`).join("")}`;
|
|
76
|
+
}
|
|
77
|
+
if (summary?.warningCount) {
|
|
78
|
+
return `${style.yellow(outcome.source
|
|
79
|
+
? `${outcome.source} was not updated, see the warnings above`
|
|
80
|
+
: "No packages were updated, see the warnings above")}\n`;
|
|
81
|
+
}
|
|
82
|
+
return `${style.green(outcome.source ? `${outcome.source} is already up to date` : "Packages are already up to date")}\n`;
|
|
83
|
+
}
|
|
68
84
|
function renderPackageList(outcome, style) {
|
|
69
85
|
if (outcome.packages.length === 0)
|
|
70
86
|
return `${style.dim("No packages installed.")}\n`;
|
|
@@ -16,7 +16,7 @@ export async function runSessionContextCommand(request, options = {}) {
|
|
|
16
16
|
if (outcome.kind === "unlinked")
|
|
17
17
|
stdout("Session worktree context cleared.\n");
|
|
18
18
|
if (outcome.kind === "linked")
|
|
19
|
-
stdout(`Session worktree context linked: ${outcome.cwd}\n`);
|
|
19
|
+
stdout(`Session worktree context linked: ${outcome.cwd} (${outcome.branch})\n`);
|
|
20
20
|
if (outcome.kind === "worktrees") {
|
|
21
21
|
for (const entry of outcome.entries) {
|
|
22
22
|
// Compatibility: the primary agent is the only agent of a single-session runtime, so it stays unnamed.
|
|
@@ -44,7 +44,7 @@ function readIdentity(environment) {
|
|
|
44
44
|
/** Known coordination failures must not expose internal paths or another session's identity. */
|
|
45
45
|
function recoveryDetail(code) {
|
|
46
46
|
const details = {
|
|
47
|
-
"worktree-claim-busy": "
|
|
47
|
+
"worktree-claim-busy": "coordination did not settle within the operation budget; no ownership was changed; retry this link shortly if the system remains busy",
|
|
48
48
|
"worktree-legacy-recovery-required": "an older-format worktree lock requires safe recovery; stop all older A1 processes, move only session-worktree-claims/mutation.lock to a backup while stopped, then start the updated A1; keep all sessions and worktree claims",
|
|
49
49
|
"worktree-coordination-unavailable": "worktree coordination is unavailable; repair or update this A1 installation, then retry",
|
|
50
50
|
"worktree-coordination-io": "worktree coordination could not access its files; check A1 data-directory permissions and filesystem availability, then retry",
|
|
@@ -54,6 +54,10 @@ function recoveryDetail(code) {
|
|
|
54
54
|
"session-runtime-stopped": "this shell belongs to a stopped runtime; resume in a running A1 session before linking",
|
|
55
55
|
"worktree-active-in-another-session": "another live agent owns this worktree; use a different worktree or wait for its owner to release it",
|
|
56
56
|
"worktree-owner-unverifiable": "worktree ownership cannot be verified; retain the claim and use another worktree rather than forcing recovery",
|
|
57
|
+
"worktree-primary-checkout": "attach a task worktree, not the primary checkout; use worktree enter to create one",
|
|
58
|
+
"worktree-git-locked": "Git has locked this worktree; retain it and ask its owner to release the lock",
|
|
59
|
+
"worktree-foreign-repository": "the selected worktree belongs to a different repository; the previous attachment was preserved",
|
|
60
|
+
"worktree-context-changed": "the attachment changed during the operation; no ownership was overridden",
|
|
57
61
|
};
|
|
58
62
|
return code === null ? undefined : details[code];
|
|
59
63
|
}
|
|
@@ -17,22 +17,23 @@ import { createPiTerminalBridge } from "../integrations/pi/tui-runtime/presentat
|
|
|
17
17
|
import { createOwnedRouteHost } from "./settings-route-host.js";
|
|
18
18
|
import { renderPiShellChangelogLines } from "../integrations/pi/components/shell-presenters-info.js";
|
|
19
19
|
import { nativeHyperlinkStyle } from "../ui/components/spans.js";
|
|
20
|
-
import { SessionRuntimeRegistry } from "./session-runtime-registry.js";
|
|
21
20
|
import { bindAutomaticSessionNaming } from "./session-naming.js";
|
|
22
21
|
import { deferStartupReleaseUpdateObservation, readPackageVersion, StartupReleaseNote } from "./startup-route.js";
|
|
23
22
|
import { createOwnedSettingsManager, watchSharedSettings } from "./owned-settings.js";
|
|
24
23
|
/** Production default: without an inspector the registry never registers; loaded lazily. */
|
|
25
24
|
const inspectLiveProcessOnDemand = async (pid) => (await import("../foundation/lifecycle/process-liveness.js")).inspectLiveProcess(pid);
|
|
25
|
+
/** Load coordination only when composing a session, not while evaluating the startup facade. */
|
|
26
|
+
async function createSessionRuntimes(bare, inspectProcess) {
|
|
27
|
+
const { SessionRuntimeRegistry } = await import("./session-runtime-registry.js");
|
|
28
|
+
return new SessionRuntimeRegistry({ runtimeId: bare ? process.env[PRODUCT_IDENTITY.environment.sessionRuntimeId] : undefined, inspectProcess });
|
|
29
|
+
}
|
|
26
30
|
export async function composeOwnedUiApplication(options = {}) {
|
|
27
31
|
return (await composeOwnedUi(options)).application;
|
|
28
32
|
}
|
|
29
33
|
export async function composeOwnedUi(options = {}) {
|
|
30
34
|
const cwd = options.cwd ?? process.cwd();
|
|
31
35
|
const productMode = options.productMode ?? "bare", bare = productMode === "bare";
|
|
32
|
-
const sessionRuntimes =
|
|
33
|
-
runtimeId: bare ? process.env[PRODUCT_IDENTITY.environment.sessionRuntimeId] : undefined,
|
|
34
|
-
inspectProcess: options.inspectProcess ?? inspectLiveProcessOnDemand,
|
|
35
|
-
});
|
|
36
|
+
const sessionRuntimes = await createSessionRuntimes(bare, options.inspectProcess ?? inspectLiveProcessOnDemand);
|
|
36
37
|
const productPaths = resolveProductPaths();
|
|
37
38
|
// Rationale: the manager reads the engine's settings port lazily, after the session exists.
|
|
38
39
|
let backend;
|
|
@@ -46,12 +47,14 @@ export async function composeOwnedUi(options = {}) {
|
|
|
46
47
|
const bareSettings = bare ? settings : null;
|
|
47
48
|
// Invariant: process-wide engine state has one owner. The host installs the HTTP dispatcher, applies
|
|
48
49
|
// the theme singletons, and announces startup notices once; every session is created through it.
|
|
49
|
-
const host = await (options.createEngineHost ?? createPiEngineHost)(engineHostOptions(options, productMode, bareSettings));
|
|
50
|
+
const host = await (options.createEngineHost ?? createPiEngineHost)(engineHostOptions(options, productMode, bareSettings, productPaths.runtimeDir));
|
|
50
51
|
const sessionForkPrompt = options.sessionForkPrompt;
|
|
51
52
|
try {
|
|
52
53
|
backend = await host.create({
|
|
53
54
|
cwd,
|
|
54
55
|
...(bare ? { repositoryContextReader: sessionRuntimes.readerFor(undefined) } : {}),
|
|
56
|
+
...(bare && process.env[PRODUCT_IDENTITY.environment.sessionRuntimeId] !== undefined
|
|
57
|
+
? { worktreeCwdReader: sessionRuntimes.toolReaderFor(undefined) } : {}),
|
|
55
58
|
...(options.sessionPath === undefined ? {} : { sessionPath: options.sessionPath }),
|
|
56
59
|
...(options.sessionSelection === undefined ? {} : { sessionSelection: options.sessionSelection }),
|
|
57
60
|
...(sessionForkPrompt === undefined ? {} : { sessionForkPrompt }),
|
|
@@ -127,7 +130,7 @@ export async function composeOwnedUi(options = {}) {
|
|
|
127
130
|
let presenter;
|
|
128
131
|
try {
|
|
129
132
|
const presenterOptions = {
|
|
130
|
-
presenters: createPiSessionPresenters(backend),
|
|
133
|
+
presenters: createPiSessionPresenters(backend, spinnerPresenterOptions(bareSettings)),
|
|
131
134
|
engine: {
|
|
132
135
|
backend,
|
|
133
136
|
cwd: backend.identity.cwd,
|
|
@@ -201,6 +204,12 @@ export async function composeOwnedUi(options = {}) {
|
|
|
201
204
|
};
|
|
202
205
|
return { application, settings };
|
|
203
206
|
}
|
|
207
|
+
function spinnerPresenterOptions(settings) {
|
|
208
|
+
return settings === null ? {} : { spinner: {
|
|
209
|
+
snapshot: () => settings.value("spinnerStyle"),
|
|
210
|
+
onChange: (listener) => settings.onChange(() => listener()),
|
|
211
|
+
} };
|
|
212
|
+
}
|
|
204
213
|
/** The settings-driven ports only bare A1 receives: viewport, background, quit outro, suggestions, image limit, and skills. */
|
|
205
214
|
function bareShellPorts(settings, generator, diagnostics) {
|
|
206
215
|
const viewportSettings = {
|
|
@@ -235,10 +244,13 @@ function bareShellPorts(settings, generator, diagnostics) {
|
|
|
235
244
|
},
|
|
236
245
|
};
|
|
237
246
|
}
|
|
238
|
-
function engineHostOptions(options, productMode, settings) {
|
|
247
|
+
function engineHostOptions(options, productMode, settings, runtimeDir) {
|
|
239
248
|
const bare = productMode === "bare";
|
|
240
249
|
return {
|
|
241
250
|
productMode,
|
|
251
|
+
deliveryIncident: failure => {
|
|
252
|
+
void import("../foundation/terminal-cleanup/index.js").then(module => module.writeFatalDiagnostic(`${runtimeDir}/crashes`, "delivery", Object.assign(new Error(), { deliveryFailure: failure }), options.packageVersion)).catch(() => undefined);
|
|
253
|
+
},
|
|
242
254
|
availableThemes: () => getAvailablePiThemes().map(theme => theme.name),
|
|
243
255
|
...(bare ? { workflowHost: { reserveExport: async (id, format) => (await import("../foundation/lifecycle/user-exports.js")).reserveUserExport(id, format) } } : {}),
|
|
244
256
|
announceStartupChangelog: !bare,
|
|
@@ -6,7 +6,7 @@ export function bindAutomaticSessionNaming(backend, settings, bare) {
|
|
|
6
6
|
const naming = new SessionNamingController({
|
|
7
7
|
backend, naming: backend.naming,
|
|
8
8
|
enabled: () => settings?.value("sessionAutoName") ?? true,
|
|
9
|
-
format: () => settings?.value("sessionNameFormat") ?? "
|
|
9
|
+
format: () => settings?.value("sessionNameFormat") ?? "sentence",
|
|
10
10
|
withContext: async (consume, signal) => {
|
|
11
11
|
const sessionId = backend.identity.currentHistorySessionId();
|
|
12
12
|
const sessionFile = backend.identity.currentSessionFile();
|
|
@@ -16,6 +16,8 @@ export declare class SessionRuntimeRegistry {
|
|
|
16
16
|
branch: string;
|
|
17
17
|
revision: string;
|
|
18
18
|
} | null>;
|
|
19
|
+
/** Strict tool cwd lookup: transient startup failure never redirects a write to primary. */
|
|
20
|
+
toolReaderFor(agentId: string | undefined): (sessionId: string, sessionFile: string, signal: AbortSignal) => Promise<string>;
|
|
19
21
|
/** Drain publication before releasing claims; never republish after disposal. */
|
|
20
22
|
dispose(): Promise<void>;
|
|
21
23
|
}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
export class SessionRuntimeRegistry {
|
|
3
3
|
#options;
|
|
4
4
|
#identities = new Map();
|
|
5
|
+
#activated = new Map();
|
|
5
6
|
#abort = new AbortController();
|
|
6
7
|
#owner = null;
|
|
7
8
|
#timer = null;
|
|
@@ -15,7 +16,9 @@ export class SessionRuntimeRegistry {
|
|
|
15
16
|
const { runtimeId, inspectProcess } = this.#options;
|
|
16
17
|
if (this.#disposed || runtimeId === undefined || inspectProcess === undefined)
|
|
17
18
|
return null;
|
|
18
|
-
const
|
|
19
|
+
const previous = this.#identities.get(agentId);
|
|
20
|
+
const identity = previous?.sessionId === sessionId && previous.sessionFile === sessionFile
|
|
21
|
+
? previous : { sessionId, sessionFile };
|
|
19
22
|
this.#identities.set(agentId, identity);
|
|
20
23
|
// Invariant: initial activation or inspection failure must not disable retries.
|
|
21
24
|
this.#arm();
|
|
@@ -23,25 +26,62 @@ export class SessionRuntimeRegistry {
|
|
|
23
26
|
const owner = await this.#ownerIdentity();
|
|
24
27
|
if (owner === null || !this.#current(agentId, identity))
|
|
25
28
|
return null;
|
|
26
|
-
const { activateSessionRepositoryContext,
|
|
29
|
+
const { activateSessionRepositoryContext, readActiveSessionRepositoryContext } = await import("../foundation/lifecycle/session-repository-context.js");
|
|
27
30
|
if (!this.#current(agentId, identity))
|
|
28
31
|
return null;
|
|
29
32
|
const options = {
|
|
33
|
+
runtimeId,
|
|
30
34
|
signal: AbortSignal.any([signal, this.#abort.signal]),
|
|
31
35
|
inspectProcess,
|
|
32
36
|
...(agentId === undefined ? {} : { agentId }),
|
|
33
37
|
};
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
+
if (this.#activated.get(agentId) !== identity) {
|
|
39
|
+
await activateSessionRepositoryContext(identity, runtimeId, owner, options);
|
|
40
|
+
if (!this.#current(agentId, identity))
|
|
41
|
+
return null;
|
|
42
|
+
this.#activated.set(agentId, identity);
|
|
43
|
+
}
|
|
44
|
+
try {
|
|
45
|
+
const context = await readActiveSessionRepositoryContext(identity, options);
|
|
46
|
+
if (context === null)
|
|
47
|
+
return null;
|
|
38
48
|
if (context.branch === null)
|
|
39
49
|
throw new Error("associated branch unavailable");
|
|
40
50
|
return { cwd: context.cwd, branch: context.branch, revision: context.revision };
|
|
41
|
-
}
|
|
51
|
+
}
|
|
52
|
+
catch (error) {
|
|
53
|
+
const code = error instanceof Error && "code" in error ? error.code : null;
|
|
54
|
+
if ((code === "session-runtime-unavailable" || code === "worktree-context-changed") && this.#current(agentId, identity)) {
|
|
55
|
+
this.#activated.delete(agentId);
|
|
56
|
+
}
|
|
57
|
+
throw error;
|
|
58
|
+
}
|
|
42
59
|
});
|
|
43
60
|
};
|
|
44
61
|
}
|
|
62
|
+
/** Strict tool cwd lookup: transient startup failure never redirects a write to primary. */
|
|
63
|
+
toolReaderFor(agentId) {
|
|
64
|
+
const read = this.readerFor(agentId);
|
|
65
|
+
return async (sessionId, sessionFile, signal) => {
|
|
66
|
+
const { retrySessionCoordination } = await import("../foundation/lifecycle/session-context-retry.js");
|
|
67
|
+
return await retrySessionCoordination(async () => {
|
|
68
|
+
signal.throwIfAborted();
|
|
69
|
+
if (this.#disposed || this.#options.runtimeId === undefined)
|
|
70
|
+
throw new Error("worktree runtime is not active");
|
|
71
|
+
const context = await read(sessionId, sessionFile, signal);
|
|
72
|
+
if (this.#disposed)
|
|
73
|
+
throw new Error("worktree runtime is not active");
|
|
74
|
+
const active = this.#activated.get(agentId);
|
|
75
|
+
if (active?.sessionId !== sessionId || active.sessionFile !== sessionFile) {
|
|
76
|
+
throw Object.assign(new Error("worktree runtime registration is still recovering"), { code: "session-runtime-unavailable" });
|
|
77
|
+
}
|
|
78
|
+
if (context !== null)
|
|
79
|
+
return context.cwd;
|
|
80
|
+
const { readSessionStartupRoot } = await import("../foundation/lifecycle/session-repository-context.js");
|
|
81
|
+
return await readSessionStartupRoot({ sessionId, sessionFile });
|
|
82
|
+
}, 8_000, signal);
|
|
83
|
+
};
|
|
84
|
+
}
|
|
45
85
|
/** Drain publication before releasing claims; never republish after disposal. */
|
|
46
86
|
async dispose() {
|
|
47
87
|
this.#disposed = true;
|
|
@@ -82,7 +122,7 @@ export class SessionRuntimeRegistry {
|
|
|
82
122
|
#arm() {
|
|
83
123
|
if (this.#timer !== null)
|
|
84
124
|
return;
|
|
85
|
-
this.#timer = setInterval(() => this.#queueRefresh(), this.#options.refreshMs ??
|
|
125
|
+
this.#timer = setInterval(() => this.#queueRefresh(), this.#options.refreshMs ?? 1_000);
|
|
86
126
|
this.#timer.unref();
|
|
87
127
|
}
|
|
88
128
|
#queueRefresh() {
|
|
@@ -96,7 +136,7 @@ export class SessionRuntimeRegistry {
|
|
|
96
136
|
return;
|
|
97
137
|
const { registerSessionRepositoryRuntime } = await import("../foundation/lifecycle/session-repository-context.js");
|
|
98
138
|
for (const [agentId, identity] of this.#identities) {
|
|
99
|
-
if (!this.#current(agentId, identity))
|
|
139
|
+
if (!this.#current(agentId, identity) || this.#activated.get(agentId) === identity)
|
|
100
140
|
continue;
|
|
101
141
|
await registerSessionRepositoryRuntime(identity, runtimeId, owner, {
|
|
102
142
|
inspectProcess,
|
|
@@ -92,6 +92,7 @@ async function loadReferenceSurface(settings, route, title, document, options) {
|
|
|
92
92
|
id,
|
|
93
93
|
title,
|
|
94
94
|
document: content,
|
|
95
|
+
...(route === "session" ? { presentation: "dialog" } : {}),
|
|
95
96
|
scrollSettings: () => ({
|
|
96
97
|
scrollbarAppearance: settings.value("scrollbarAppearance"),
|
|
97
98
|
scrollbarStyle: settings.value("scrollbarStyle"),
|
|
@@ -1,17 +1,6 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Extension packages are managed outside any session: the command that installs
|
|
3
|
-
* one runs before the runtime exists, against a profile root chosen by the caller
|
|
4
|
-
* rather than by whatever session happens to be open. So this port stands apart
|
|
5
|
-
* from the session-scoped service ports and names only what a package operation
|
|
6
|
-
* needs — a root, a source, and an outcome a caller can render without knowing
|
|
7
|
-
* which engine performed it.
|
|
8
|
-
*/
|
|
1
|
+
/** Non-interactive package operations use a caller-chosen profile root before any session exists. */
|
|
9
2
|
export type AgentPackageOperation = "install" | "remove" | "update" | "refresh-models" | "list";
|
|
10
|
-
/**
|
|
11
|
-
* Why an operation ended, kept separate from the prose so callers can branch on
|
|
12
|
-
* it. `not-found` is the one failure an engine can state structurally — the source
|
|
13
|
-
* is not configured in this profile — rather than only in a message.
|
|
14
|
-
*/
|
|
3
|
+
/** Status is separate from prose; not-found means the source is unconfigured. */
|
|
15
4
|
export type AgentPackageStatus = "completed" | "not-found" | "failed";
|
|
16
5
|
export interface AgentPackageDescriptor {
|
|
17
6
|
readonly source: string;
|
|
@@ -25,10 +14,17 @@ export interface AgentPackageOutcome {
|
|
|
25
14
|
readonly source: string | null;
|
|
26
15
|
readonly packages: readonly AgentPackageDescriptor[];
|
|
27
16
|
readonly detail: string | null;
|
|
17
|
+
/** Update facts distinguish a checked result from skipped or warned work. */
|
|
18
|
+
readonly updateSummary?: {
|
|
19
|
+
readonly offline: boolean;
|
|
20
|
+
readonly warningCount: number;
|
|
21
|
+
readonly changes: readonly string[];
|
|
22
|
+
};
|
|
28
23
|
}
|
|
29
24
|
export interface AgentPackageProgress {
|
|
30
25
|
readonly operation: AgentPackageOperation;
|
|
31
26
|
readonly message: string;
|
|
27
|
+
readonly severity?: "warning";
|
|
32
28
|
}
|
|
33
29
|
export interface AgentPackagesPort {
|
|
34
30
|
readonly capabilities: {
|
|
@@ -57,4 +53,4 @@ export interface AgentPackagesPortInput {
|
|
|
57
53
|
readonly onDiagnostic?: (diagnostic: AgentPackageDiagnostic) => void;
|
|
58
54
|
}
|
|
59
55
|
export declare function assertAgentPackagesPort(port: AgentPackagesPort): void;
|
|
60
|
-
export declare function agentPackageOutcome(operation: AgentPackageOperation, status: AgentPackageStatus, detail?: string | null, source?: string | null, packages?: readonly AgentPackageDescriptor[]): AgentPackageOutcome;
|
|
56
|
+
export declare function agentPackageOutcome(operation: AgentPackageOperation, status: AgentPackageStatus, detail?: string | null, source?: string | null, packages?: readonly AgentPackageDescriptor[], updateSummary?: AgentPackageOutcome["updateSummary"]): AgentPackageOutcome;
|
|
@@ -1,11 +1,4 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Extension packages are managed outside any session: the command that installs
|
|
3
|
-
* one runs before the runtime exists, against a profile root chosen by the caller
|
|
4
|
-
* rather than by whatever session happens to be open. So this port stands apart
|
|
5
|
-
* from the session-scoped service ports and names only what a package operation
|
|
6
|
-
* needs — a root, a source, and an outcome a caller can render without knowing
|
|
7
|
-
* which engine performed it.
|
|
8
|
-
*/
|
|
1
|
+
/** Non-interactive package operations use a caller-chosen profile root before any session exists. */
|
|
9
2
|
export function assertAgentPackagesPort(port) {
|
|
10
3
|
if (typeof port?.capabilities !== "object" || port.capabilities === null)
|
|
11
4
|
throw new TypeError("packages port capabilities are required");
|
|
@@ -20,12 +13,15 @@ export function assertAgentPackagesPort(port) {
|
|
|
20
13
|
throw new TypeError(`packages capability ${capability} must be explicit`);
|
|
21
14
|
}
|
|
22
15
|
}
|
|
23
|
-
export function agentPackageOutcome(operation, status, detail, source, packages = []) {
|
|
16
|
+
export function agentPackageOutcome(operation, status, detail, source, packages = [], updateSummary) {
|
|
24
17
|
return Object.freeze({
|
|
25
18
|
operation,
|
|
26
19
|
status,
|
|
27
20
|
source: source ?? null,
|
|
28
21
|
packages: Object.freeze([...packages]),
|
|
29
22
|
detail: detail ?? null,
|
|
23
|
+
...(updateSummary === undefined ? {} : {
|
|
24
|
+
updateSummary: Object.freeze({ ...updateSummary, changes: Object.freeze([...updateSummary.changes]) }),
|
|
25
|
+
}),
|
|
30
26
|
});
|
|
31
27
|
}
|
|
@@ -47,6 +47,8 @@ export interface OwnedUiWorkflowRequest {
|
|
|
47
47
|
readonly confirmed?: boolean;
|
|
48
48
|
/** Recovery cwd selected after an import/resume source cwd is unavailable. */
|
|
49
49
|
readonly cwdOverride?: string;
|
|
50
|
+
/** Explicit missing-folder recovery; cancellation never changes the active session. */
|
|
51
|
+
readonly cwdRecoveryChoice?: "continue" | "fork" | "cancel";
|
|
50
52
|
/** Cancellation for an owned operation surface such as `/share`. */
|
|
51
53
|
readonly signal?: AbortSignal;
|
|
52
54
|
/** Progress label for that operation surface, e.g. when `/share` picks its upload destination. */
|
|
@@ -126,6 +128,10 @@ export interface OwnedUiWorkflowResult {
|
|
|
126
128
|
readonly messages?: readonly OwnedUiWorkflowMessage[];
|
|
127
129
|
readonly detail?: string;
|
|
128
130
|
readonly selectorTitle?: string;
|
|
131
|
+
/** A missing-folder selector, distinct from ordinary workflow selection. */
|
|
132
|
+
readonly cwdRecovery?: {
|
|
133
|
+
readonly fallbackCwd: string;
|
|
134
|
+
};
|
|
129
135
|
readonly options?: readonly OwnedUiWorkflowOption[];
|
|
130
136
|
readonly presentation?: OwnedUiWorkflowPresentation;
|
|
131
137
|
}
|
|
@@ -14,9 +14,19 @@ export interface OwnedUiShellKeybindingsHost {
|
|
|
14
14
|
reload(): void;
|
|
15
15
|
}
|
|
16
16
|
export interface OwnedUiShellComponentPort {
|
|
17
|
+
readonly ready?: Promise<void>;
|
|
17
18
|
render(width: number): readonly string[];
|
|
19
|
+
/** Bounds scrollable replacement inputs within the dock. */
|
|
20
|
+
renderInDock?(width: number, maxHeight: number): readonly string[];
|
|
18
21
|
invalidate(): void;
|
|
19
22
|
handleInput?(data: string): void;
|
|
23
|
+
/** Pointer input in one-based component-local coordinates, when supported. */
|
|
24
|
+
handleLocalMouse?(event: {
|
|
25
|
+
readonly kind: "press" | "release" | "motion" | "wheel-up" | "wheel-down";
|
|
26
|
+
readonly button: number;
|
|
27
|
+
readonly column: number;
|
|
28
|
+
readonly row: number;
|
|
29
|
+
}): void;
|
|
20
30
|
setFocused?(focused: boolean): void;
|
|
21
31
|
dispose?(): void;
|
|
22
32
|
}
|
|
@@ -2,6 +2,13 @@ export interface PresentationComponentPort {
|
|
|
2
2
|
render(width: number): readonly string[];
|
|
3
3
|
invalidate(): void;
|
|
4
4
|
handleInput?(data: string): void;
|
|
5
|
+
/** Optional pointer input in one-based component-local coordinates. */
|
|
6
|
+
handleLocalMouse?(event: {
|
|
7
|
+
readonly kind: "press" | "release" | "motion" | "wheel-up" | "wheel-down";
|
|
8
|
+
readonly button: number;
|
|
9
|
+
readonly column: number;
|
|
10
|
+
readonly row: number;
|
|
11
|
+
}): void;
|
|
5
12
|
setFocused?(focused: boolean): void;
|
|
6
13
|
dispose?(): void;
|
|
7
14
|
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { PresentationComponentPort } from "./component.js";
|
|
2
2
|
export type { PresentationComponentPort, PresentationPointerSurface } from "./component.js";
|
|
3
|
+
export type { ProgressSpinnerSource, ProgressSpinnerStyle } from "./progress-spinner.js";
|
|
3
4
|
export { samePointerSurfaces } from "./component.js";
|
|
4
5
|
export type { CanvasBackgroundStyle, ShellPresentationPorts, ThemeSource, UiTheme, UiThemeBackground, UiThemeToken } from "./theme.js";
|
|
5
6
|
export type { TerminalComponentPort, TerminalDamageDecision, TerminalDamageDecisionReason, TerminalDamageFrameDescriptor, TerminalDamageFrameSafety, TerminalDamageOptions, TerminalDamagePort, TerminalHyperlinkInspection, TerminalInputCoordinationDecision, TerminalInputCoordinationScheduler, TerminalInputDiagnosticsEvent, TerminalInputDiagnosticsPhase, TerminalInputListener, TerminalInputListenerResult, TerminalInputSurfaceKind, TerminalLayoutEntry, TerminalLayoutNode, TerminalOverlayAnchor, TerminalOverlayHandle, TerminalOverlayMargin, TerminalOverlayOptions, TerminalOverlayUnfocusOptions, TerminalPointerSurface, TerminalPort, TerminalPreInputListener, TerminalProgramStatus, TerminalRuntimeFactory, TerminalRuntimeOptions, TerminalRuntimePort, TerminalRuntimeState, TerminalSizeValue, TerminalStopOptions, TerminalViewport, TerminalWheelScrollLines, } from "./terminal.js";
|
|
@@ -22,6 +23,8 @@ export declare const DIALOG_BACK_SHORTCUT_HINT: Readonly<{
|
|
|
22
23
|
}>;
|
|
23
24
|
/** Global inset inherited by every semantic row inside an A1-owned dialog frame. */
|
|
24
25
|
export declare const DIALOG_CONTENT_PADDING_X = 1;
|
|
26
|
+
/** Wraps choice navigation, leaving empty lists at a safe index. */
|
|
27
|
+
export declare function wrapChoiceIndex(index: number, delta: number, count: number): number;
|
|
25
28
|
export interface DialogFrameGeometry {
|
|
26
29
|
readonly frameWidth: number;
|
|
27
30
|
readonly contentPaddingX: number;
|
|
@@ -6,6 +6,10 @@ export const DIALOG_CLOSE_SHORTCUT_HINT = Object.freeze({ key: "esc", action: "c
|
|
|
6
6
|
export const DIALOG_BACK_SHORTCUT_HINT = Object.freeze({ key: "esc", action: "back" });
|
|
7
7
|
/** Global inset inherited by every semantic row inside an A1-owned dialog frame. */
|
|
8
8
|
export const DIALOG_CONTENT_PADDING_X = 1;
|
|
9
|
+
/** Wraps choice navigation, leaving empty lists at a safe index. */
|
|
10
|
+
export function wrapChoiceIndex(index, delta, count) {
|
|
11
|
+
return count > 0 ? ((index + delta) % count + count) % count : 0;
|
|
12
|
+
}
|
|
9
13
|
/** Shared full-width-rule/content-width geometry for string and component dialog renderers. */
|
|
10
14
|
export function dialogFrameGeometry(width) {
|
|
11
15
|
const frameWidth = Math.max(0, width);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Generated by scripts/pi/sync-progress-palette.ts from A1's named accent projection
|
|
3
|
-
* over pinned Pi 1.5.
|
|
3
|
+
* over pinned Pi 1.5.2 (MIT), commit b4afdddf44e059c67ccf5097e5317d913521b470. Do not edit directly.
|
|
4
4
|
*/
|
|
5
5
|
export declare const SHARED_PROGRESS_PALETTE: Readonly<{
|
|
6
6
|
blue: {
|
|
@@ -8,20 +8,24 @@ export declare const SHARED_PROGRESS_PALETTE: Readonly<{
|
|
|
8
8
|
truecolor: {
|
|
9
9
|
accent: string;
|
|
10
10
|
border: string;
|
|
11
|
+
selectedBg: string;
|
|
11
12
|
};
|
|
12
13
|
"256color": {
|
|
13
14
|
accent: string;
|
|
14
15
|
border: string;
|
|
16
|
+
selectedBg: string;
|
|
15
17
|
};
|
|
16
18
|
};
|
|
17
19
|
light: {
|
|
18
20
|
truecolor: {
|
|
19
21
|
accent: string;
|
|
20
22
|
border: string;
|
|
23
|
+
selectedBg: string;
|
|
21
24
|
};
|
|
22
25
|
"256color": {
|
|
23
26
|
accent: string;
|
|
24
27
|
border: string;
|
|
28
|
+
selectedBg: string;
|
|
25
29
|
};
|
|
26
30
|
};
|
|
27
31
|
};
|
|
@@ -30,20 +34,24 @@ export declare const SHARED_PROGRESS_PALETTE: Readonly<{
|
|
|
30
34
|
truecolor: {
|
|
31
35
|
accent: string;
|
|
32
36
|
border: string;
|
|
37
|
+
selectedBg: string;
|
|
33
38
|
};
|
|
34
39
|
"256color": {
|
|
35
40
|
accent: string;
|
|
36
41
|
border: string;
|
|
42
|
+
selectedBg: string;
|
|
37
43
|
};
|
|
38
44
|
};
|
|
39
45
|
light: {
|
|
40
46
|
truecolor: {
|
|
41
47
|
accent: string;
|
|
42
48
|
border: string;
|
|
49
|
+
selectedBg: string;
|
|
43
50
|
};
|
|
44
51
|
"256color": {
|
|
45
52
|
accent: string;
|
|
46
53
|
border: string;
|
|
54
|
+
selectedBg: string;
|
|
47
55
|
};
|
|
48
56
|
};
|
|
49
57
|
};
|
|
@@ -52,20 +60,24 @@ export declare const SHARED_PROGRESS_PALETTE: Readonly<{
|
|
|
52
60
|
truecolor: {
|
|
53
61
|
accent: string;
|
|
54
62
|
border: string;
|
|
63
|
+
selectedBg: string;
|
|
55
64
|
};
|
|
56
65
|
"256color": {
|
|
57
66
|
accent: string;
|
|
58
67
|
border: string;
|
|
68
|
+
selectedBg: string;
|
|
59
69
|
};
|
|
60
70
|
};
|
|
61
71
|
light: {
|
|
62
72
|
truecolor: {
|
|
63
73
|
accent: string;
|
|
64
74
|
border: string;
|
|
75
|
+
selectedBg: string;
|
|
65
76
|
};
|
|
66
77
|
"256color": {
|
|
67
78
|
accent: string;
|
|
68
79
|
border: string;
|
|
80
|
+
selectedBg: string;
|
|
69
81
|
};
|
|
70
82
|
};
|
|
71
83
|
};
|
|
@@ -74,20 +86,24 @@ export declare const SHARED_PROGRESS_PALETTE: Readonly<{
|
|
|
74
86
|
truecolor: {
|
|
75
87
|
accent: string;
|
|
76
88
|
border: string;
|
|
89
|
+
selectedBg: string;
|
|
77
90
|
};
|
|
78
91
|
"256color": {
|
|
79
92
|
accent: string;
|
|
80
93
|
border: string;
|
|
94
|
+
selectedBg: string;
|
|
81
95
|
};
|
|
82
96
|
};
|
|
83
97
|
light: {
|
|
84
98
|
truecolor: {
|
|
85
99
|
accent: string;
|
|
86
100
|
border: string;
|
|
101
|
+
selectedBg: string;
|
|
87
102
|
};
|
|
88
103
|
"256color": {
|
|
89
104
|
accent: string;
|
|
90
105
|
border: string;
|
|
106
|
+
selectedBg: string;
|
|
91
107
|
};
|
|
92
108
|
};
|
|
93
109
|
};
|
|
@@ -96,20 +112,24 @@ export declare const SHARED_PROGRESS_PALETTE: Readonly<{
|
|
|
96
112
|
truecolor: {
|
|
97
113
|
accent: string;
|
|
98
114
|
border: string;
|
|
115
|
+
selectedBg: string;
|
|
99
116
|
};
|
|
100
117
|
"256color": {
|
|
101
118
|
accent: string;
|
|
102
119
|
border: string;
|
|
120
|
+
selectedBg: string;
|
|
103
121
|
};
|
|
104
122
|
};
|
|
105
123
|
light: {
|
|
106
124
|
truecolor: {
|
|
107
125
|
accent: string;
|
|
108
126
|
border: string;
|
|
127
|
+
selectedBg: string;
|
|
109
128
|
};
|
|
110
129
|
"256color": {
|
|
111
130
|
accent: string;
|
|
112
131
|
border: string;
|
|
132
|
+
selectedBg: string;
|
|
113
133
|
};
|
|
114
134
|
};
|
|
115
135
|
};
|
|
@@ -118,20 +138,24 @@ export declare const SHARED_PROGRESS_PALETTE: Readonly<{
|
|
|
118
138
|
truecolor: {
|
|
119
139
|
accent: string;
|
|
120
140
|
border: string;
|
|
141
|
+
selectedBg: string;
|
|
121
142
|
};
|
|
122
143
|
"256color": {
|
|
123
144
|
accent: string;
|
|
124
145
|
border: string;
|
|
146
|
+
selectedBg: string;
|
|
125
147
|
};
|
|
126
148
|
};
|
|
127
149
|
light: {
|
|
128
150
|
truecolor: {
|
|
129
151
|
accent: string;
|
|
130
152
|
border: string;
|
|
153
|
+
selectedBg: string;
|
|
131
154
|
};
|
|
132
155
|
"256color": {
|
|
133
156
|
accent: string;
|
|
134
157
|
border: string;
|
|
158
|
+
selectedBg: string;
|
|
135
159
|
};
|
|
136
160
|
};
|
|
137
161
|
};
|