@gajae-code/coding-agent 0.11.11 → 0.12.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/CHANGELOG.md +131 -4
- package/dist/types/async/job-manager.d.ts +17 -3
- package/dist/types/cli/read-cli.d.ts +1 -0
- package/dist/types/commands/deep-interview.d.ts +9 -0
- package/dist/types/commands/harness.d.ts +22 -0
- package/dist/types/commands/read.d.ts +6 -0
- package/dist/types/config/model-registry.d.ts +4 -0
- package/dist/types/config/provider-auth-health.d.ts +14 -0
- package/dist/types/config/provider-ranking.d.ts +59 -0
- package/dist/types/config/settings-schema.d.ts +83 -1
- package/dist/types/config/settings.d.ts +2 -0
- package/dist/types/exa/mcp-client.d.ts +10 -1
- package/dist/types/exec/bash-executor.d.ts +45 -12
- package/dist/types/extensibility/extensions/types.d.ts +38 -4
- package/dist/types/extensibility/gjc-plugins/index.d.ts +12 -2
- package/dist/types/extensibility/gjc-plugins/installer.d.ts +63 -7
- package/dist/types/extensibility/gjc-plugins/lifecycle-reconciliation.d.ts +55 -0
- package/dist/types/extensibility/gjc-plugins/lifecycle.d.ts +64 -0
- package/dist/types/extensibility/gjc-plugins/runtime-quarantine.d.ts +67 -0
- package/dist/types/extensibility/gjc-plugins/session-validation.d.ts +3 -1
- package/dist/types/extensibility/gjc-plugins/types.d.ts +124 -0
- package/dist/types/extensibility/shared-events.d.ts +6 -0
- package/dist/types/gjc-runtime/deep-interview-ambiguity.d.ts +5 -12
- package/dist/types/gjc-runtime/deep-interview-recorder.d.ts +17 -32
- package/dist/types/gjc-runtime/deep-interview-stage.d.ts +37 -0
- package/dist/types/gjc-runtime/deep-interview-state.d.ts +4 -135
- package/dist/types/gjc-runtime/gc-runtime.d.ts +1 -1
- package/dist/types/gjc-runtime/launch-tmux.d.ts +1 -0
- package/dist/types/gjc-runtime/memory-guard-owner-claims.d.ts +47 -0
- package/dist/types/gjc-runtime/ralplan-runtime.d.ts +70 -1
- package/dist/types/gjc-runtime/state-writer.d.ts +5 -46
- package/dist/types/gjc-runtime/team-launch.d.ts +1 -1
- package/dist/types/gjc-runtime/team-runtime.d.ts +27 -1
- package/dist/types/gjc-runtime/team-store.d.ts +12 -0
- package/dist/types/gjc-runtime/team-worker-heartbeat.d.ts +43 -0
- package/dist/types/gjc-runtime/team-worker-memory-guard.d.ts +92 -0
- package/dist/types/gjc-runtime/tmux-owner-isolation.d.ts +17 -0
- package/dist/types/gjc-runtime/ultragoal-receipt-freshness.d.ts +8 -0
- package/dist/types/gjc-runtime/ultragoal-runtime.d.ts +31 -80
- package/dist/types/gjc-runtime/workflow-manifest.d.ts +3 -5
- package/dist/types/internal-urls/local-root-gc.d.ts +2 -0
- package/dist/types/main.d.ts +1 -1
- package/dist/types/memories/index.d.ts +2 -0
- package/dist/types/modes/acp/acp-agent.d.ts +10 -19
- package/dist/types/modes/components/assistant-message.d.ts +3 -1
- package/dist/types/modes/components/gjc-bundle-settings.d.ts +34 -0
- package/dist/types/modes/components/irc-sidebar.d.ts +41 -0
- package/dist/types/modes/components/notifications-settings-editor.d.ts +1 -0
- package/dist/types/modes/components/read-tool-group.d.ts +4 -4
- package/dist/types/modes/components/session-observer-overlay.d.ts +22 -0
- package/dist/types/modes/components/settings-selector.d.ts +11 -0
- package/dist/types/modes/components/status-line/gh.d.ts +5 -0
- package/dist/types/modes/components/tool-execution.d.ts +8 -0
- package/dist/types/modes/components/transcript-viewer-overlay.d.ts +18 -1
- package/dist/types/modes/controllers/event-controller.d.ts +3 -0
- package/dist/types/modes/interactive-mode.d.ts +2 -0
- package/dist/types/modes/irc-observation-ledger.d.ts +17 -1
- package/dist/types/modes/types.d.ts +2 -0
- package/dist/types/modes/utils/ui-helpers.d.ts +16 -0
- package/dist/types/reminders/star-reminder.d.ts +3 -13
- package/dist/types/runtime-mcp/manager.d.ts +1 -0
- package/dist/types/runtime-mcp/smithery-auth.d.ts +5 -0
- package/dist/types/sdk/acp/adapter.d.ts +3 -1
- package/dist/types/sdk/broker/lifecycle.d.ts +5 -0
- package/dist/types/sdk/broker/transport.d.ts +2 -0
- package/dist/types/sdk/bus/attachment-registry.d.ts +1 -0
- package/dist/types/sdk/bus/chat-daemon-control.d.ts +4 -1
- package/dist/types/sdk/bus/config.d.ts +6 -2
- package/dist/types/sdk/bus/control-drain-lease.d.ts +52 -0
- package/dist/types/sdk/bus/index.d.ts +44 -1
- package/dist/types/sdk/bus/kind-aware-reconciliation.d.ts +44 -0
- package/dist/types/sdk/bus/lifecycle-control-runtime.d.ts +4 -0
- package/dist/types/sdk/bus/prompt-reconciliation.d.ts +2 -1
- package/dist/types/sdk/bus/reconciliation-store.d.ts +69 -0
- package/dist/types/sdk/bus/rich-draft.d.ts +1 -0
- package/dist/types/sdk/bus/rich-render.d.ts +2 -0
- package/dist/types/sdk/bus/telegram-adoption-intent.d.ts +165 -0
- package/dist/types/sdk/bus/telegram-cli.d.ts +12 -0
- package/dist/types/sdk/bus/telegram-daemon-contract.d.ts +11 -4
- package/dist/types/sdk/bus/telegram-daemon.d.ts +25 -1
- package/dist/types/sdk/bus/telegram-reference.d.ts +11 -1
- package/dist/types/sdk/bus/threaded-render.d.ts +3 -2
- package/dist/types/sdk/bus/topic-registry.d.ts +11 -1
- package/dist/types/sdk/host/control/operations.d.ts +1 -1
- package/dist/types/sdk/host/host.d.ts +2 -0
- package/dist/types/sdk/host/query/handlers.d.ts +5 -0
- package/dist/types/sdk/host/query/revision-store.d.ts +2 -0
- package/dist/types/sdk/host/reverse-leases.d.ts +1 -1
- package/dist/types/sdk/prompt-status.d.ts +23 -3
- package/dist/types/sdk/session.d.ts +6 -0
- package/dist/types/session/agent-session.d.ts +82 -12
- package/dist/types/session/artifacts.d.ts +8 -0
- package/dist/types/session/blob-store.d.ts +57 -4
- package/dist/types/session/internal/managed-session-storage.d.ts +8 -1
- package/dist/types/session/memory-guard-checkpoint-participant.d.ts +69 -0
- package/dist/types/session/session-manager.d.ts +48 -19
- package/dist/types/session/session-storage.d.ts +4 -0
- package/dist/types/session/streaming-output.d.ts +96 -12
- package/dist/types/setup/credential-import.d.ts +12 -0
- package/dist/types/skill-state/active-state.d.ts +12 -4
- package/dist/types/skill-state/workflow-hud.d.ts +9 -0
- package/dist/types/task/executor.d.ts +3 -2
- package/dist/types/task/index.d.ts +3 -1
- package/dist/types/task/provider-retry-status.d.ts +8 -0
- package/dist/types/task/receipt.d.ts +7 -1
- package/dist/types/task/types.d.ts +23 -0
- package/dist/types/tools/ask-answer-registry.d.ts +2 -2
- package/dist/types/tools/bash-interactive.d.ts +4 -1
- package/dist/types/tools/bash.d.ts +3 -1
- package/dist/types/tools/browser/launch.d.ts +7 -0
- package/dist/types/tools/fetch.d.ts +17 -1
- package/dist/types/tools/image-gen.d.ts +4 -0
- package/dist/types/tools/index.d.ts +4 -0
- package/dist/types/tools/output-meta.d.ts +44 -3
- package/dist/types/tools/path-utils.d.ts +1 -0
- package/dist/types/tools/read-internals.d.ts +12 -0
- package/dist/types/tools/read.d.ts +45 -7
- package/dist/types/tools/resource-gc.d.ts +4 -0
- package/dist/types/tools/review.d.ts +5 -7
- package/dist/types/tools/subagent.d.ts +2 -0
- package/dist/types/tools/tool-result.d.ts +7 -1
- package/dist/types/utils/gh.d.ts +13 -0
- package/dist/types/utils/image-resize.d.ts +1 -0
- package/dist/types/web/search/providers/kimi.d.ts +2 -0
- package/dist/types/web/search/providers/searxng.d.ts +7 -0
- package/dist/types/web/search/providers/xai.d.ts +2 -0
- package/package.json +11 -13
- package/scripts/acp-conformance-agent.ts +218 -0
- package/scripts/benchmark-sticky-viewport-pr1.ts +239 -0
- package/scripts/capture-gjc-bundle-settings.ts +306 -0
- package/scripts/capture-sticky-viewport-showcase.ts +292 -0
- package/scripts/generate-sdk-operation-inventory.ts +5 -0
- package/scripts/resident-memory-bench.ts +1341 -0
- package/scripts/run-acp-conformance.ts +285 -0
- package/scripts/verify-gjc-sdk-canonicalization.ts +122 -18
- package/scripts/verify-sticky-viewport-showcase.ts +611 -0
- package/src/async/job-manager.ts +78 -20
- package/src/capability/index.ts +8 -0
- package/src/cli/fast-help.ts +1 -1
- package/src/cli/plugin-cli.ts +176 -18
- package/src/cli/read-cli.ts +2 -1
- package/src/cli.ts +1 -0
- package/src/commands/deep-interview.ts +29 -9
- package/src/commands/harness.ts +35 -12
- package/src/commands/read.ts +11 -2
- package/src/commands/team.ts +20 -2
- package/src/config/file-lock.ts +11 -2
- package/src/config/model-registry.ts +21 -2
- package/src/config/provider-auth-health.ts +42 -0
- package/src/config/provider-ranking.ts +119 -0
- package/src/config/settings-schema.ts +74 -1
- package/src/config/settings.ts +246 -108
- package/src/coordinator-mcp/question-gate-codec.ts +1 -1
- package/src/coordinator-mcp/server.ts +5 -12
- package/src/defaults/gjc/skills/deep-interview/SKILL.md +230 -82
- package/src/defaults/gjc/skills/ralplan/SKILL.md +77 -41
- package/src/defaults/gjc/skills/team/SKILL.md +3 -1
- package/src/defaults/gjc/skills/ultragoal/SKILL.md +62 -39
- package/src/defaults/gjc/skills/ultragoal/validation-batch-contracts.md +12 -0
- package/src/defaults/gjc-defaults.ts +4 -4
- package/src/eval/py/executor.ts +7 -2
- package/src/exa/mcp-client.ts +12 -3
- package/src/exec/bash-executor.ts +144 -27
- package/src/extensibility/extensions/runner.ts +15 -0
- package/src/extensibility/extensions/types.ts +46 -5
- package/src/extensibility/gjc-plugins/constrained-hooks.ts +8 -2
- package/src/extensibility/gjc-plugins/index.ts +19 -2
- package/src/extensibility/gjc-plugins/installer.ts +189 -50
- package/src/extensibility/gjc-plugins/lifecycle-reconciliation.ts +199 -0
- package/src/extensibility/gjc-plugins/lifecycle.ts +626 -0
- package/src/extensibility/gjc-plugins/observability.ts +3 -3
- package/src/extensibility/gjc-plugins/prompt-appendix.ts +5 -1
- package/src/extensibility/gjc-plugins/runtime-adapters.ts +12 -2
- package/src/extensibility/gjc-plugins/runtime-quarantine.ts +121 -0
- package/src/extensibility/gjc-plugins/schema.ts +84 -12
- package/src/extensibility/gjc-plugins/session-validation.ts +9 -3
- package/src/extensibility/gjc-plugins/types.ts +141 -0
- package/src/extensibility/gjc-plugins/validation.ts +9 -0
- package/src/extensibility/shared-events.ts +5 -0
- package/src/gjc-runtime/deep-interview-ambiguity.ts +47 -82
- package/src/gjc-runtime/deep-interview-recorder.ts +227 -310
- package/src/gjc-runtime/deep-interview-runtime.ts +109 -270
- package/src/gjc-runtime/deep-interview-stage.ts +1016 -0
- package/src/gjc-runtime/deep-interview-state.ts +12 -943
- package/src/gjc-runtime/gc-render.ts +1 -0
- package/src/gjc-runtime/gc-runtime.ts +11 -1
- package/src/gjc-runtime/launch-tmux.ts +25 -6
- package/src/gjc-runtime/managed-owner-admission.ts +1 -1
- package/src/gjc-runtime/memory-guard-owner-claims.ts +389 -0
- package/src/gjc-runtime/ralplan-runtime.ts +1149 -98
- package/src/gjc-runtime/state-runtime.ts +2 -1
- package/src/gjc-runtime/state-writer.ts +70 -222
- package/src/gjc-runtime/team-launch.ts +42 -5
- package/src/gjc-runtime/team-runtime.ts +1085 -40
- package/src/gjc-runtime/team-store.ts +32 -0
- package/src/gjc-runtime/team-worker-heartbeat.ts +149 -0
- package/src/gjc-runtime/team-worker-memory-guard.ts +363 -0
- package/src/gjc-runtime/team-workers.ts +1 -0
- package/src/gjc-runtime/tmux-owner-isolation.ts +28 -0
- package/src/gjc-runtime/tmux-sessions.ts +58 -13
- package/src/gjc-runtime/ultragoal-receipt-freshness.ts +20 -0
- package/src/gjc-runtime/ultragoal-runtime.ts +414 -618
- package/src/gjc-runtime/workflow-manifest.generated.json +105 -449
- package/src/gjc-runtime/workflow-manifest.ts +38 -247
- package/src/hooks/native-skill-hook.ts +17 -4
- package/src/hooks/skill-state.ts +1 -23
- package/src/internal-urls/docs-index.generated.ts +21 -22
- package/src/internal-urls/local-root-gc.ts +127 -0
- package/src/main.ts +9 -5
- package/src/memories/index.ts +10 -0
- package/src/modes/DESIGN.md +98 -0
- package/src/modes/acp/acp-agent.ts +339 -191
- package/src/modes/acp/acp-event-mapper.ts +14 -7
- package/src/modes/acp/acp-mode.ts +39 -3
- package/src/modes/components/assistant-message.ts +123 -22
- package/src/modes/components/gjc-bundle-settings.ts +508 -0
- package/src/modes/components/irc-sidebar.ts +176 -62
- package/src/modes/components/model-selector.ts +61 -4
- package/src/modes/components/notifications-settings-editor.ts +12 -1
- package/src/modes/components/oauth-selector.ts +96 -28
- package/src/modes/components/read-tool-group.ts +82 -14
- package/src/modes/components/session-observer-overlay.ts +457 -83
- package/src/modes/components/settings-selector.ts +116 -23
- package/src/modes/components/status-line/gh.ts +16 -0
- package/src/modes/components/tool-execution.ts +138 -27
- package/src/modes/components/tool-status-header.ts +3 -14
- package/src/modes/components/transcript-viewer-overlay.ts +99 -24
- package/src/modes/controllers/command-controller.ts +4 -0
- package/src/modes/controllers/event-controller.ts +109 -27
- package/src/modes/controllers/extension-ui-controller.ts +26 -2
- package/src/modes/controllers/input-controller.ts +18 -3
- package/src/modes/controllers/selector-controller.ts +127 -36
- package/src/modes/interactive-mode.ts +62 -3
- package/src/modes/irc-observation-ledger.ts +71 -15
- package/src/modes/runtime-init.ts +22 -2
- package/src/modes/types.ts +2 -0
- package/src/modes/utils/ui-helpers.ts +94 -1
- package/src/prompts/agent-fragments/ralplan-persistence.md +4 -3
- package/src/prompts/agents/architect.md +9 -1
- package/src/prompts/agents/critic.md +9 -0
- package/src/prompts/system/eager-todo.md +8 -4
- package/src/prompts/system/system-prompt.md +11 -5
- package/src/prompts/tools/bash.md +5 -5
- package/src/prompts/tools/read.md +4 -2
- package/src/prompts/tools/search-tool-bm25.md +5 -0
- package/src/prompts/tools/task.md +1 -1
- package/src/reminders/star-reminder.ts +4 -42
- package/src/runtime-mcp/manager.ts +19 -4
- package/src/runtime-mcp/smithery-auth.ts +17 -2
- package/src/runtime-mcp/smithery-connect.ts +11 -1
- package/src/sdk/acp/adapter.ts +22 -6
- package/src/sdk/broker/lifecycle.ts +25 -6
- package/src/sdk/broker/transport.ts +35 -3
- package/src/sdk/bus/attachment-registry.ts +5 -1
- package/src/sdk/bus/chat-daemon-cli.ts +4 -39
- package/src/sdk/bus/chat-daemon-control.ts +6 -3
- package/src/sdk/bus/config.ts +18 -2
- package/src/sdk/bus/control-drain-lease.ts +104 -0
- package/src/sdk/bus/index.ts +984 -146
- package/src/sdk/bus/kind-aware-reconciliation.ts +317 -0
- package/src/sdk/bus/lifecycle-commands.ts +4 -1
- package/src/sdk/bus/lifecycle-control-runtime.ts +403 -88
- package/src/sdk/bus/prompt-reconciliation.ts +2 -1
- package/src/sdk/bus/reconciliation-store.ts +303 -0
- package/src/sdk/bus/rich-draft.ts +1 -1
- package/src/sdk/bus/rich-render.ts +2 -2
- package/src/sdk/bus/telegram-adoption-intent.ts +574 -0
- package/src/sdk/bus/telegram-cli.ts +33 -8
- package/src/sdk/bus/telegram-daemon-cli.ts +1 -0
- package/src/sdk/bus/telegram-daemon-contract.ts +11 -4
- package/src/sdk/bus/telegram-daemon.ts +916 -23
- package/src/sdk/bus/telegram-reference.ts +40 -3
- package/src/sdk/bus/threaded-render.ts +48 -3
- package/src/sdk/bus/topic-registry.ts +20 -0
- package/src/sdk/host/control/dispatch.ts +5 -1
- package/src/sdk/host/control/operations.ts +1 -1
- package/src/sdk/host/host.ts +23 -1
- package/src/sdk/host/query/handlers.ts +55 -0
- package/src/sdk/host/query/revision-store.ts +36 -2
- package/src/sdk/host/reverse-leases.ts +44 -7
- package/src/sdk/mcp/server.ts +46 -18
- package/src/sdk/prompt-status.ts +16 -3
- package/src/sdk/protocol/operation-inventory.generated.json +51 -0
- package/src/sdk/protocol/operation-registry.ts +7 -2
- package/src/sdk/session.ts +101 -10
- package/src/session/agent-session.ts +1286 -220
- package/src/session/artifacts.ts +22 -0
- package/src/session/auth-broker-config.ts +10 -3
- package/src/session/blob-store.ts +915 -24
- package/src/session/internal/managed-session-scope.ts +44 -6
- package/src/session/internal/managed-session-storage.ts +48 -6
- package/src/session/memory-guard-checkpoint-participant.ts +131 -0
- package/src/session/session-manager.ts +2364 -438
- package/src/session/session-storage.ts +9 -1
- package/src/session/streaming-output.ts +500 -111
- package/src/setup/credential-import.ts +75 -13
- package/src/setup/provider-onboarding.ts +19 -4
- package/src/skill-state/active-state.ts +32 -10
- package/src/skill-state/workflow-hud.ts +42 -2
- package/src/skill-state/workflow-mutation-guard.ts +560 -8
- package/src/task/executor.ts +122 -39
- package/src/task/index.ts +23 -14
- package/src/task/provider-retry-status.ts +16 -0
- package/src/task/receipt.ts +23 -7
- package/src/task/render.ts +6 -2
- package/src/task/types.ts +108 -0
- package/src/tools/ask-answer-registry.ts +12 -6
- package/src/tools/ask.ts +169 -118
- package/src/tools/ast-edit.ts +1 -0
- package/src/tools/ast-grep.ts +1 -0
- package/src/tools/bash-interactive.ts +8 -3
- package/src/tools/bash.ts +503 -60
- package/src/tools/browser/launch.ts +41 -6
- package/src/tools/fetch.ts +114 -23
- package/src/tools/find.ts +1 -0
- package/src/tools/image-gen.ts +29 -5
- package/src/tools/index.ts +4 -0
- package/src/tools/output-meta.ts +281 -20
- package/src/tools/path-utils.ts +8 -3
- package/src/tools/read-internals.ts +44 -0
- package/src/tools/read.ts +1560 -310
- package/src/tools/resource-gc.ts +182 -18
- package/src/tools/review.ts +5 -7
- package/src/tools/search.ts +1 -0
- package/src/tools/subagent-render.ts +6 -2
- package/src/tools/subagent.ts +6 -0
- package/src/tools/telegram-send.ts +6 -3
- package/src/tools/tool-result.ts +14 -1
- package/src/utils/gh.ts +39 -0
- package/src/utils/image-resize.ts +3 -0
- package/src/web/search/providers/anthropic.ts +4 -4
- package/src/web/search/providers/codex.ts +1 -1
- package/src/web/search/providers/kimi.ts +15 -5
- package/src/web/search/providers/searxng.ts +47 -4
- package/src/web/search/providers/xai.ts +7 -2
- package/dist/types/gjc-runtime/deep-interview-draft.d.ts +0 -8
- package/dist/types/gjc-runtime/deep-interview-payload.d.ts +0 -41
- package/dist/types/gjc-runtime/deep-interview-repair.d.ts +0 -17
- package/dist/types/gjc-runtime/ultragoal-pipeline.d.ts +0 -23
- package/src/defaults/gjc/skills/ultragoal/pipeline-validation-contracts.md +0 -30
- package/src/gjc-runtime/deep-interview-draft.ts +0 -843
- package/src/gjc-runtime/deep-interview-payload.ts +0 -262
- package/src/gjc-runtime/deep-interview-repair.ts +0 -1674
- package/src/gjc-runtime/ultragoal-pipeline.ts +0 -306
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import * as fs from "node:fs/promises";
|
|
2
|
+
import * as os from "node:os";
|
|
3
|
+
import * as path from "node:path";
|
|
4
|
+
import { isEnoent } from "@gajae-code/utils";
|
|
5
|
+
import type { GcCollectResult, GcContext, GcError, GcRecord, GcStoreAdapter } from "../gjc-runtime/gc-runtime";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* GC for `local://` session roots.
|
|
9
|
+
*
|
|
10
|
+
* `resolveLocalRoot` gives every session its own `<tmp>/gjc-local/<session-id>`
|
|
11
|
+
* directory, and the first `local://` resolution seeds it with a migration
|
|
12
|
+
* marker. Nothing ever removes those directories, so a machine accumulates one
|
|
13
|
+
* per session indefinitely — and the overwhelming majority only ever hold the
|
|
14
|
+
* marker, because most sessions never write a `local://` file.
|
|
15
|
+
*
|
|
16
|
+
* Only marker-only directories are eligible, and only after a grace period.
|
|
17
|
+
* That keeps the rule provably safe without needing a session-liveness oracle:
|
|
18
|
+
* a directory holding real content is never touched, and a session that just
|
|
19
|
+
* started is still inside its grace window.
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
const LOCAL_ROOT_PARENT = "gjc-local";
|
|
23
|
+
const LEGACY_MIGRATION_MARKER = ".gjc-local-legacy-migrated-v1";
|
|
24
|
+
|
|
25
|
+
/** Directories younger than this are left alone so a live session is never raced. */
|
|
26
|
+
const GRACE_MS = 24 * 60 * 60 * 1000;
|
|
27
|
+
|
|
28
|
+
/** Bound the scan so a pathological directory cannot stall `gjc gc`. */
|
|
29
|
+
const MAX_ENTRIES = 20_000;
|
|
30
|
+
|
|
31
|
+
function localRootParent(env: NodeJS.ProcessEnv): string {
|
|
32
|
+
return path.join(env.TMPDIR?.trim() || os.tmpdir(), LOCAL_ROOT_PARENT);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/** A root is prunable only when the marker is the single thing inside it. */
|
|
36
|
+
async function classify(dir: string, now: number): Promise<{ status: string; stale: boolean; reason: string } | null> {
|
|
37
|
+
let entries: string[];
|
|
38
|
+
try {
|
|
39
|
+
entries = await fs.readdir(dir);
|
|
40
|
+
} catch (error) {
|
|
41
|
+
if (isEnoent(error)) return null;
|
|
42
|
+
throw error;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
const extra = entries.filter(name => name !== LEGACY_MIGRATION_MARKER);
|
|
46
|
+
if (extra.length > 0)
|
|
47
|
+
return {
|
|
48
|
+
status: "in_use",
|
|
49
|
+
stale: false,
|
|
50
|
+
reason: `Holds ${extra.length} entr${extra.length === 1 ? "y" : "ies"} beyond the marker`,
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
const stat = await fs.stat(dir);
|
|
54
|
+
if (now - stat.mtimeMs < GRACE_MS) return { status: "recent", stale: false, reason: "Inside the grace window" };
|
|
55
|
+
return { status: "marker_only", stale: true, reason: "Only the migration marker, past the grace window" };
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export const localRootsGcAdapter: GcStoreAdapter = {
|
|
59
|
+
store: "local_roots",
|
|
60
|
+
async collect(ctx: GcContext): Promise<GcCollectResult> {
|
|
61
|
+
const records: GcRecord[] = [];
|
|
62
|
+
const errors: GcError[] = [];
|
|
63
|
+
const parent = localRootParent(ctx.env);
|
|
64
|
+
const now = Date.now();
|
|
65
|
+
|
|
66
|
+
let dirents: string[];
|
|
67
|
+
try {
|
|
68
|
+
dirents = await fs.readdir(parent);
|
|
69
|
+
} catch (error) {
|
|
70
|
+
if (isEnoent(error)) return { records, errors };
|
|
71
|
+
errors.push({ store: "local_roots", scope: parent, message: (error as Error).message });
|
|
72
|
+
return { records, errors };
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
for (const name of dirents.slice(0, MAX_ENTRIES)) {
|
|
76
|
+
const dir = path.join(parent, name);
|
|
77
|
+
try {
|
|
78
|
+
const classified = await classify(dir, now);
|
|
79
|
+
if (!classified) continue;
|
|
80
|
+
records.push({
|
|
81
|
+
store: "local_roots",
|
|
82
|
+
id: name,
|
|
83
|
+
path: dir,
|
|
84
|
+
status: classified.status,
|
|
85
|
+
stale: classified.stale,
|
|
86
|
+
removable: classified.stale,
|
|
87
|
+
action: classified.stale ? "would_remove" : "none",
|
|
88
|
+
reason: classified.reason,
|
|
89
|
+
});
|
|
90
|
+
} catch (error) {
|
|
91
|
+
errors.push({ store: "local_roots", scope: dir, message: (error as Error).message });
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
if (dirents.length > MAX_ENTRIES) {
|
|
96
|
+
errors.push({
|
|
97
|
+
store: "local_roots",
|
|
98
|
+
scope: parent,
|
|
99
|
+
message: `Scan truncated at ${MAX_ENTRIES} entries`,
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
return { records, errors };
|
|
104
|
+
},
|
|
105
|
+
async prune(record: GcRecord) {
|
|
106
|
+
const dir = record.path;
|
|
107
|
+
if (!dir) return { removed: false, error: "Missing local root path" };
|
|
108
|
+
|
|
109
|
+
// Re-validate immediately before removing: the session may have written a
|
|
110
|
+
// file between collect and prune.
|
|
111
|
+
let classified: Awaited<ReturnType<typeof classify>>;
|
|
112
|
+
try {
|
|
113
|
+
classified = await classify(dir, Date.now());
|
|
114
|
+
} catch (error) {
|
|
115
|
+
return { removed: false, error: (error as Error).message };
|
|
116
|
+
}
|
|
117
|
+
if (!classified) return { removed: false, skipped: "Local root disappeared" };
|
|
118
|
+
if (!classified.stale) return { removed: false, skipped: `Local root no longer eligible (${classified.status})` };
|
|
119
|
+
|
|
120
|
+
try {
|
|
121
|
+
await fs.rm(dir, { recursive: true, force: true });
|
|
122
|
+
return { removed: true };
|
|
123
|
+
} catch (error) {
|
|
124
|
+
return { removed: false, error: (error as Error).message };
|
|
125
|
+
}
|
|
126
|
+
},
|
|
127
|
+
};
|
package/src/main.ts
CHANGED
|
@@ -698,7 +698,7 @@ async function promptForkSession(session: SessionInfo): Promise<boolean> {
|
|
|
698
698
|
}
|
|
699
699
|
}
|
|
700
700
|
|
|
701
|
-
async function getChangelogForDisplay(parsed: Args): Promise<string | undefined> {
|
|
701
|
+
export async function getChangelogForDisplay(parsed: Args): Promise<string | undefined> {
|
|
702
702
|
if (parsed.continue || parsed.resume) {
|
|
703
703
|
return undefined;
|
|
704
704
|
}
|
|
@@ -710,15 +710,19 @@ async function getChangelogForDisplay(parsed: Args): Promise<string | undefined>
|
|
|
710
710
|
|
|
711
711
|
const lastVersion = settings.get("lastChangelogVersion");
|
|
712
712
|
if (!lastVersion) {
|
|
713
|
-
settings.
|
|
714
|
-
|
|
713
|
+
if (settings.canWriteDurableConfig()) {
|
|
714
|
+
settings.set("lastChangelogVersion", VERSION);
|
|
715
|
+
await flushChangelogVersion();
|
|
716
|
+
}
|
|
715
717
|
return getInstalledVersionChangelogEntry(entries, VERSION)?.content;
|
|
716
718
|
}
|
|
717
719
|
|
|
718
720
|
if (lastVersion !== VERSION) {
|
|
719
721
|
const newEntries = getNewEntries(entries, lastVersion);
|
|
720
|
-
settings.
|
|
721
|
-
|
|
722
|
+
if (settings.canWriteDurableConfig()) {
|
|
723
|
+
settings.set("lastChangelogVersion", VERSION);
|
|
724
|
+
await flushChangelogVersion();
|
|
725
|
+
}
|
|
722
726
|
if (newEntries.length > 0) {
|
|
723
727
|
return newEntries.map(e => e.content).join("\n\n");
|
|
724
728
|
}
|
package/src/memories/index.ts
CHANGED
|
@@ -976,6 +976,11 @@ function redactSecrets(input: string): string {
|
|
|
976
976
|
/(?:sk|pk|rk|tok|key|secret|token|password)[-_A-Za-z0-9]{12,}/g,
|
|
977
977
|
/[A-Za-z0-9_-]{16,}\.[A-Za-z0-9_-]{16,}\.[A-Za-z0-9_-]{16,}/g,
|
|
978
978
|
/(?:AKIA|ASIA)[A-Z0-9]{16}/g,
|
|
979
|
+
// GitHub tokens carry no keyword the first pattern recognizes, so without
|
|
980
|
+
// this they reached MEMORY.md and memory_summary.md verbatim — and the
|
|
981
|
+
// summary is injected into every later session. Same shapes the
|
|
982
|
+
// contribution-prep scrubber already covers.
|
|
983
|
+
/\b(?:gh[opsur]_[A-Za-z0-9_]{12,}|github_pat_[A-Za-z0-9_]{12,})\b/g,
|
|
979
984
|
];
|
|
980
985
|
for (const pattern of patterns) {
|
|
981
986
|
out = out.replace(pattern, "[REDACTED]");
|
|
@@ -983,6 +988,11 @@ function redactSecrets(input: string): string {
|
|
|
983
988
|
return out;
|
|
984
989
|
}
|
|
985
990
|
|
|
991
|
+
/** Secret scrubbing applied to every phase-2 consolidation output. Test seam. */
|
|
992
|
+
export function redactMemorySecretsForTesting(input: string): string {
|
|
993
|
+
return redactSecrets(input);
|
|
994
|
+
}
|
|
995
|
+
|
|
986
996
|
function sanitizeSkillName(name: string): string {
|
|
987
997
|
return name
|
|
988
998
|
.toLowerCase()
|
package/src/modes/DESIGN.md
CHANGED
|
@@ -261,3 +261,101 @@ record both manifest counts as 108 plus CJK review results.
|
|
|
261
261
|
|
|
262
262
|
No raw third-party design corpus, screenshot, or reference asset is stored by
|
|
263
263
|
this workflow.
|
|
264
|
+
|
|
265
|
+
## Sticky transcript viewport contract
|
|
266
|
+
|
|
267
|
+
Live mode remains in natural terminal flow. Entering manual history makes the
|
|
268
|
+
application-owned transcript lane scrollable while the status line and every
|
|
269
|
+
later direct composer child are a fixed suffix at the bottom. PageUp/PageDown
|
|
270
|
+
move by the transcript capacity; the wheel remains three rows. A focused editor
|
|
271
|
+
keeps focus, and ordinary editor input or paste follows live before processing
|
|
272
|
+
that input.
|
|
273
|
+
|
|
274
|
+
Manual output has one bounded boolean indication, exactly **`New output — type
|
|
275
|
+
to follow`**. It is not a count. New visible agent/tool/extension output may set
|
|
276
|
+
it while manual; reflow, transient chrome, reconciliation, and user input may
|
|
277
|
+
not. Following clears it only after a successful live repaint. Manual-era output
|
|
278
|
+
is authoritative in the application transcript but is never retroactively
|
|
279
|
+
replayed into native host scrollback; subsequent ordinary live output follows
|
|
280
|
+
normal host behavior.
|
|
281
|
+
|
|
282
|
+
The transcript is the only selectable coordinate space. Pinned status/composer
|
|
283
|
+
chrome, notices, blank rows, and overlays never enter selection or copied text;
|
|
284
|
+
CJK selection clamping remains directional and grapheme/cell aware. Under
|
|
285
|
+
constrained height the notice drops first, then decorative pet and low-priority
|
|
286
|
+
hooks. Focused editor/cursor, status, and normal hooks outrank those rows; zero
|
|
287
|
+
transcript capacity is valid and must not corrupt cursor geometry.
|
|
288
|
+
|
|
289
|
+
At narrow widths use ANSI-aware terminal-cell measurement. ASCII/no-color keeps
|
|
290
|
+
textual state without SGR. Korean, Japanese, Chinese, and mixed CJK/Latin prose
|
|
291
|
+
must wrap at semantic phrase boundaries, never through an action/status label or
|
|
292
|
+
short identifier; a semantic CJK break is a visual-QA failure.
|
|
293
|
+
|
|
294
|
+
### Sticky viewport deterministic visual QA
|
|
295
|
+
|
|
296
|
+
`test/fixtures/tui/sticky-viewport-showcase.ts` is a fixed-clock, no-network,
|
|
297
|
+
first-party harness that starts the production `TUI` over a `VirtualTerminal`.
|
|
298
|
+
It constructs transcript, status, hooks, and the real composer as children,
|
|
299
|
+
then drives the live/manual viewport path before capturing the terminal frame.
|
|
300
|
+
Capture with `bun packages/coding-agent/scripts/capture-sticky-viewport-showcase.ts
|
|
301
|
+
--out .gjc/qa/sticky-viewport-<run>` and verify with the paired `--root` script.
|
|
302
|
+
The immutable matrix has exactly 20 keys: `live-overflow`, `manual-history`,
|
|
303
|
+
`manual-new-output`, `multiline-editor-hooks-pet`, `capacity-many`,
|
|
304
|
+
`capacity-one`, `capacity-zero`, and `selection-boundary` at both 80x24 and
|
|
305
|
+
120x36 Unicode/color; plus `manual-new-output/80x24/ascii-no-color`,
|
|
306
|
+
`capacity-zero/48x10/ascii-no-color`,
|
|
307
|
+
`multiline-editor-hooks-pet/48x10/unicode-color`, and
|
|
308
|
+
`narrow-cjk/48x10/unicode-color`. Do not add or replace a manual-follow case.
|
|
309
|
+
|
|
310
|
+
Each key has only `terminal.txt`, ANSI-preserving `terminal-ansi.txt`, `terminal.html`, and `metadata.json`; the manifest records SHA-256 and byte length. Per-key metadata binds immutable font/render assumptions and the ANSI-aware wrapping/truncation policy. `VirtualTerminal` reconstructs ANSI from visible xterm cells, including cell padding, palette/RGB colors, attributes, and inverse video; plain text is always the stripped reconstruction. The verifier owns an independent literal 20-key oracle and fails closed unless stripped ANSI equals text, `terminal.html` equals the exported canonical `ansiToHtml(terminal-ansi.txt)` byte-for-byte (including its complete document envelope and global CSS), HTML independently preserves the ANSI style-run text, every retained row has the exact `Bun.stringWidth` cell width (including trailing spaces), and `ansi_mode` agrees with required Unicode color SGR or ASCII/no-color output. Every metadata entry has exact CJK phrase-boundary metadata: the narrow-CJK key has only the three canonical boundaries in order and every other key has `[]`. Manual captures prove successful production wheel and PageUp paths and retain observable historical transcript-row evidence. It validates exact payload paths (no duplicates or traversal), immutable source/output revisions, state/status/suffix order, notice cardinality, capacity, actual mouse-copied transcript-only selection, composer, CJK, and provenance invariants. `review-input.json` binds the exact manifest digest, capture author/executor identity, acceptance/design versions, required artifacts, narrow-CJK boundaries, and deterministic host matrix. `--require-independent-review` requires an attestation with an exact root key set; exact per-key result and artifact-check key sets; exact defect `{ description, accepted }` keys with a trimmed, nonblank description; canonical trimmed reviewer identity distinct from both bound identities; the independent-terminal-reviewer role; fixture revision; expected and observed counts of 20; exact checked keys; accepted per-key artifact-check/notes results; accepted artifact/CJK/host decisions; bound digest; and final `accept`. Any malformed, incomplete, or extra attestation content fails closed.
|
|
311
|
+
## GJC Bundles
|
|
312
|
+
|
|
313
|
+
GJC Bundles is a directly hosted Settings surface using the existing framed-list
|
|
314
|
+
grammar. A bundle identity is always displayed as its name plus `(user)` or
|
|
315
|
+
`(project)`. Same-name rows in opposite scopes are distinct identities and are
|
|
316
|
+
never merged, selected together, or mutated through one another.
|
|
317
|
+
|
|
318
|
+
Only safe source presentation is permitted. Never render or retain a raw source
|
|
319
|
+
locator, userinfo, query, fragment, token, authentication material, or a full
|
|
320
|
+
parent path in labels, descriptions, status, confirmation, errors, or evidence.
|
|
321
|
+
|
|
322
|
+
Persisted enablement is user intent: bundle and eligible-surface enabled or
|
|
323
|
+
disabled state. Effective runtime status is advisory display evidence only and
|
|
324
|
+
never acts as hidden authorization. Deterministic quarantine blocks an enable
|
|
325
|
+
action; disable is always available. Runtime evidence does not alter either
|
|
326
|
+
rule.
|
|
327
|
+
|
|
328
|
+
Focus, cursor, wrapping, ANSI-aware cell measurement, CJK semantic wrapping,
|
|
329
|
+
and list scrolling follow the existing settings contracts above. Up/Down wrap
|
|
330
|
+
within lists. A non-cancellable bundle mutation visibly locks navigation,
|
|
331
|
+
including Escape and tab changes, until it completes; the lock names its
|
|
332
|
+
reason. Long names and descriptions wrap in allocated content regions without
|
|
333
|
+
hiding scope identity, CJK text breaks only at semantic boundaries, ANSI styles
|
|
334
|
+
do not affect width measurement, and long surface lists scroll while retaining
|
|
335
|
+
the focused row and scroll position.
|
|
336
|
+
|
|
337
|
+
This Settings surface does not install or uninstall bundles, edit sources, or
|
|
338
|
+
repair quarantine. It supports only list/detail, update review/apply,
|
|
339
|
+
bundle-toggle, and eligible-surface-toggle actions.
|
|
340
|
+
|
|
341
|
+
### Create-only refusal and source reachability
|
|
342
|
+
|
|
343
|
+
An already-installed target is refused with `already_installed_use_upgrade`,
|
|
344
|
+
independently of `--force`, and the refusal performs no filesystem mutation:
|
|
345
|
+
it is decided before any registry lock is acquired, because acquiring a lock
|
|
346
|
+
itself creates the scope root.
|
|
347
|
+
|
|
348
|
+
Refusal is bound to the bundle name declared in the manifest, because that name
|
|
349
|
+
*is* the identity component. When the source is a local directory the name is
|
|
350
|
+
read without resolving, so a deleted-and-recreated or offline-but-present source
|
|
351
|
+
still refuses correctly.
|
|
352
|
+
|
|
353
|
+
When the source cannot be read at all — a deleted directory, an unreachable git
|
|
354
|
+
remote, a missing tarball — the target's identity is genuinely unknowable before
|
|
355
|
+
resolution, so the operation resolves and reports the source failure instead of
|
|
356
|
+
refusing. Matching on the stored locator was tried and rejected as unsound: one
|
|
357
|
+
locator can resolve to different content over time, the same URI can back two
|
|
358
|
+
differently named bundles, and a stored `uri#ref` differs from a bare `uri`, so
|
|
359
|
+
locator-based refusal would refuse installs that should proceed. Refusing on a
|
|
360
|
+
guess is worse than reporting the real failure, so identity must be readable for
|
|
361
|
+
refusal to apply.
|