@gajae-code/coding-agent 0.18.6 → 0.18.8
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 +318 -1
- package/dist/types/async/job-manager.d.ts +1 -1
- package/dist/types/capability/mcp.d.ts +2 -0
- package/dist/types/capability/skill.d.ts +2 -0
- package/dist/types/capability/types.d.ts +6 -0
- package/dist/types/cli/public-command-errors.d.ts +3 -1
- package/dist/types/cli/setup-cli.d.ts +1 -1
- package/dist/types/commands/deep-interview.d.ts +3 -0
- package/dist/types/config/autorouting-tier-map.d.ts +348 -9
- package/dist/types/config/file-lock.d.ts +1 -0
- package/dist/types/config/model-bindings-applier.d.ts +2 -0
- package/dist/types/config/model-profile-activation.d.ts +11 -3
- package/dist/types/config/model-registry.d.ts +4 -9
- package/dist/types/config/settings.d.ts +4 -0
- package/dist/types/config/skill-settings-defaults.d.ts +2 -0
- package/dist/types/cursor-delete-path.d.ts +1 -0
- package/dist/types/cursor-mcp-name.d.ts +8 -0
- package/dist/types/customization/inventory.d.ts +2 -0
- package/dist/types/debug/report-bundle-parent.d.ts +2 -0
- package/dist/types/defaults/gjc/extensions/grok-cli-vendor/src/provider/stream.d.ts +1 -0
- package/dist/types/defaults/gjc/extensions/grok-cli-vendor/src/provider/version-manager.d.ts +31 -0
- package/dist/types/defaults/gjc-skills.generated.d.ts +5 -6
- package/dist/types/discovery/helpers.d.ts +8 -3
- package/dist/types/export/html/css-color.d.ts +2 -0
- package/dist/types/export/html/template.generated.d.ts +1 -1
- package/dist/types/extensibility/extensions/types.d.ts +7 -0
- package/dist/types/extensibility/gjc-plugins/runtime-adapters.d.ts +14 -1
- package/dist/types/extensibility/plugins/marketplace/cache.d.ts +2 -0
- package/dist/types/extensibility/plugins/plugin-link-path.d.ts +2 -0
- package/dist/types/extensibility/runtime-skill-discovery.d.ts +3 -1
- package/dist/types/extensibility/skill-management.d.ts +3 -1
- package/dist/types/extensibility/skills.d.ts +2 -0
- package/dist/types/gjc-runtime/deep-interview-crystallize.d.ts +74 -0
- package/dist/types/gjc-runtime/deep-interview-runtime.d.ts +11 -0
- package/dist/types/gjc-runtime/gc-runtime.d.ts +5 -0
- package/dist/types/gjc-runtime/ralplan-runtime.d.ts +0 -5
- package/dist/types/gjc-runtime/state-argv.d.ts +1 -1
- package/dist/types/gjc-runtime/state-migrations.d.ts +8 -0
- package/dist/types/gjc-runtime/state-runtime.d.ts +95 -0
- package/dist/types/gjc-runtime/state-writer.d.ts +11 -1
- package/dist/types/gjc-runtime/ultragoal-runtime.d.ts +8 -0
- package/dist/types/internal-urls/skill-path.d.ts +1 -0
- package/dist/types/lsp/workspace-path.d.ts +1 -0
- package/dist/types/modes/acp/acp-agent.d.ts +7 -0
- package/dist/types/modes/components/custom-editor.d.ts +6 -0
- package/dist/types/modes/components/customization/customization-dashboard.d.ts +1 -0
- package/dist/types/modes/components/extensions/state-manager.d.ts +4 -3
- package/dist/types/modes/controllers/input-controller.d.ts +9 -0
- package/dist/types/modes/interactive-mode.d.ts +1 -0
- package/dist/types/modes/utils/interrupt-ownership.d.ts +3 -0
- package/dist/types/modes/utils/keybinding-matchers.d.ts +1 -0
- package/dist/types/modes/utils/macos-option-forwarding.d.ts +17 -0
- package/dist/types/progress/collect-project-progress.d.ts +38 -0
- package/dist/types/progress/progress-contract.d.ts +154 -0
- package/dist/types/progress/progress-snapshot.d.ts +11 -0
- package/dist/types/progress/project-progress.d.ts +141 -0
- package/dist/types/progress/render-progress.d.ts +28 -0
- package/dist/types/runtime-mcp/elicitation.d.ts +12 -0
- package/dist/types/runtime-mcp/oauth-public-url.d.ts +1 -0
- package/dist/types/runtime-mcp/plugin-network-boundary.d.ts +1 -0
- package/dist/types/runtime-mcp/smithery-registry.d.ts +24 -0
- package/dist/types/runtime-mcp/types.d.ts +6 -0
- package/dist/types/sdk/acp/adapter.d.ts +1 -1
- package/dist/types/sdk/broker/broker-exit.d.ts +6 -2
- package/dist/types/sdk/broker/broker.d.ts +18 -1
- package/dist/types/sdk/broker/lifecycle.d.ts +9 -0
- package/dist/types/sdk/broker/session-index.d.ts +12 -6
- package/dist/types/sdk/broker/task-artifact-owner-validation.d.ts +55 -0
- package/dist/types/sdk/bus/index.d.ts +12 -1
- package/dist/types/sdk/bus/telegram-daemon-contract.d.ts +6 -1
- package/dist/types/sdk/bus/telegram-daemon.d.ts +3 -2
- package/dist/types/sdk/client/client.d.ts +2 -0
- package/dist/types/sdk/host/host.d.ts +6 -0
- package/dist/types/sdk/host/query/handlers.d.ts +3 -0
- package/dist/types/sdk/index.d.ts +1 -0
- package/dist/types/sdk/router/session-router.d.ts +9 -0
- package/dist/types/sdk/session-list.d.ts +1 -1
- package/dist/types/sdk/session.d.ts +8 -0
- package/dist/types/session/agent-session.d.ts +38 -9
- package/dist/types/session/artifacts.d.ts +2 -2
- package/dist/types/session/internal/managed-gc-retirement-codec.d.ts +32 -0
- package/dist/types/session/internal/managed-session-scope.d.ts +79 -2
- package/dist/types/session/internal/managed-session-storage.d.ts +36 -1
- package/dist/types/session/internal/managed-task-owner-cleanup.d.ts +62 -0
- package/dist/types/session/internal/task-artifact-owner-access.d.ts +19 -0
- package/dist/types/session/internal/task-artifact-owner-transcript.d.ts +11 -0
- package/dist/types/session/session-manager.d.ts +31 -5
- package/dist/types/session/session-retirement.d.ts +71 -0
- package/dist/types/session/session-storage.d.ts +62 -48
- package/dist/types/session/session-transcript-header.d.ts +2 -0
- package/dist/types/session/task-artifact-owner-codec.d.ts +109 -0
- package/dist/types/session/task-artifact-owner-retirement.d.ts +7 -0
- package/dist/types/session/task-artifact-owner.d.ts +10 -0
- package/dist/types/setup/credential-auto-import.d.ts +1 -1
- package/dist/types/setup/credential-import.d.ts +6 -4
- package/dist/types/skill-state/active-state.d.ts +38 -0
- package/dist/types/slash-commands/helpers/progress-report.d.ts +8 -0
- package/dist/types/task/executor.d.ts +3 -0
- package/dist/types/tools/bash-skill-urls.d.ts +1 -1
- package/dist/types/tools/index.d.ts +3 -0
- package/dist/types/tools/python.d.ts +9 -1
- package/dist/types/tools/recipe/recipe-guard.d.ts +7 -0
- package/dist/types/tools/restricted-cwd.d.ts +1 -0
- package/dist/types/tools/todo-write.d.ts +6 -0
- package/dist/types/utils/tools-checksum.d.ts +7 -0
- package/package.json +7 -7
- package/scripts/generate-sdk-operation-inventory.ts +21 -0
- package/scripts/resident-memory-bench.ts +174 -20
- package/scripts/verify-managed-empty-stop.ts +28 -0
- package/src/async/job-manager.ts +228 -122
- package/src/capability/index.ts +18 -0
- package/src/capability/mcp.ts +2 -0
- package/src/capability/skill.ts +2 -0
- package/src/capability/types.ts +6 -0
- package/src/cli/auth-broker-cli.ts +1 -1
- package/src/cli/config-cli.ts +8 -18
- package/src/cli/customize-doctor.ts +15 -2
- package/src/cli/public-command-errors.ts +21 -1
- package/src/cli/setup-cli.ts +4 -4
- package/src/cli/skills-cli.ts +5 -0
- package/src/cli-main.ts +7 -8
- package/src/commands/deep-interview.ts +47 -8
- package/src/commands/sdk.ts +140 -29
- package/src/config/autorouting-tier-map.ts +117 -7
- package/src/config/file-lock.ts +307 -68
- package/src/config/mcp-schema.json +4 -0
- package/src/config/model-bindings-applier.ts +20 -0
- package/src/config/model-profile-activation.ts +240 -46
- package/src/config/model-registry.ts +47 -153
- package/src/config/settings.ts +44 -4
- package/src/config/skill-settings-defaults.ts +7 -0
- package/src/coordinator-mcp/policy.ts +3 -2
- package/src/cursor-delete-path.ts +10 -0
- package/src/cursor-mcp-name.ts +15 -0
- package/src/cursor.ts +13 -2
- package/src/customization/inventory.ts +3 -0
- package/src/debug/report-bundle-parent.ts +22 -0
- package/src/debug/report-bundle.ts +3 -0
- package/src/debug/system-info.ts +13 -1
- package/src/defaults/gjc/extensions/grok-cli-vendor/src/provider/stream.ts +67 -4
- package/src/defaults/gjc/extensions/grok-cli-vendor/src/provider/version-manager.ts +80 -0
- package/src/defaults/gjc/skills/deep-interview/SKILL.md +105 -10
- package/src/defaults/gjc/skills/ralplan/SKILL.md +6 -4
- package/src/defaults/gjc-defaults.test.ts +18 -1
- package/src/defaults/gjc-defaults.ts +3 -0
- package/src/defaults/gjc-skills.generated.ts +58 -36
- package/src/discovery/agents.ts +6 -1
- package/src/discovery/builtin.ts +10 -0
- package/src/discovery/helpers.ts +168 -23
- package/src/discovery/mcp-json.ts +6 -0
- package/src/discovery/ssh.ts +9 -4
- package/src/discovery/substitute-plugin-root.ts +3 -1
- package/src/edit/file-read-cache.ts +1 -1
- package/src/eval/py/executor.ts +380 -120
- package/src/export/html/css-color.ts +9 -0
- package/src/export/html/index.ts +5 -4
- package/src/export/html/template.generated.ts +1 -1
- package/src/extensibility/extensions/runner.ts +4 -0
- package/src/extensibility/extensions/types.ts +7 -0
- package/src/extensibility/gjc-plugins/runtime-adapters.ts +73 -8
- package/src/extensibility/plugins/manager.ts +3 -2
- package/src/extensibility/plugins/marketplace/cache.ts +15 -0
- package/src/extensibility/plugins/marketplace/manager.ts +11 -3
- package/src/extensibility/plugins/plugin-link-path.ts +12 -0
- package/src/extensibility/runtime-skill-discovery.ts +20 -2
- package/src/extensibility/skill-management.ts +6 -2
- package/src/extensibility/skills.ts +6 -1
- package/src/gjc-runtime/deep-interview-crystallize.ts +1814 -0
- package/src/gjc-runtime/deep-interview-recorder.ts +20 -2
- package/src/gjc-runtime/deep-interview-runtime.ts +1415 -13
- package/src/gjc-runtime/deep-interview-stage.ts +98 -21
- package/src/gjc-runtime/gc-runtime.ts +206 -8
- package/src/gjc-runtime/launch-worktree.ts +14 -4
- package/src/gjc-runtime/ralplan-runtime.ts +447 -52
- package/src/gjc-runtime/state-argv.ts +2 -0
- package/src/gjc-runtime/state-migrations.ts +91 -29
- package/src/gjc-runtime/state-runtime.ts +3716 -135
- package/src/gjc-runtime/state-writer.ts +83 -8
- package/src/gjc-runtime/ultragoal-runtime.ts +16 -4
- package/src/gjc-runtime/workflow-manifest.generated.json +70 -42
- package/src/gjc-runtime/workflow-manifest.ts +54 -21
- package/src/harness-control-plane/operate.ts +12 -4
- package/src/harness-control-plane/owner.ts +5 -1
- package/src/hashline/parser.ts +48 -9
- package/src/hashline/recovery.ts +13 -4
- package/src/hindsight/config.ts +9 -3
- package/src/internal-urls/docs-index.generated.ts +19 -18
- package/src/internal-urls/skill-path.ts +19 -0
- package/src/internal-urls/skill-protocol.ts +2 -0
- package/src/lsp/edits.ts +6 -0
- package/src/lsp/workspace-path.ts +51 -0
- package/src/main.ts +195 -31
- package/src/modes/acp/acp-agent.ts +163 -7
- package/src/modes/components/custom-editor.ts +14 -0
- package/src/modes/components/customization/customization-dashboard.ts +12 -0
- package/src/modes/components/extensions/extension-dashboard.ts +2 -2
- package/src/modes/components/extensions/state-manager.ts +15 -5
- package/src/modes/components/model-selector.ts +1 -4
- package/src/modes/components/provider-onboarding-selector.ts +1 -1
- package/src/modes/components/status-line/segments.ts +4 -0
- package/src/modes/controllers/event-controller.ts +11 -4
- package/src/modes/controllers/input-controller.ts +74 -29
- package/src/modes/controllers/runtime-mcp-command-controller.ts +8 -3
- package/src/modes/controllers/selector-controller.ts +28 -15
- package/src/modes/interactive-mode.ts +4 -0
- package/src/modes/runtime-init.ts +4 -0
- package/src/modes/utils/abort-message.ts +3 -1
- package/src/modes/utils/interrupt-ownership.ts +12 -0
- package/src/modes/utils/keybinding-matchers.ts +4 -0
- package/src/modes/utils/macos-option-forwarding.ts +80 -0
- package/src/progress/collect-project-progress.ts +153 -0
- package/src/progress/progress-contract.ts +172 -0
- package/src/progress/progress-snapshot.ts +140 -0
- package/src/progress/project-progress.ts +446 -0
- package/src/progress/render-progress.ts +209 -0
- package/src/prompts/system/master-mode.md +1 -0
- package/src/prompts/tools/skill-discovery.md +1 -1
- package/src/runtime-mcp/client.ts +13 -4
- package/src/runtime-mcp/config-writer.ts +10 -6
- package/src/runtime-mcp/config.ts +1 -0
- package/src/runtime-mcp/elicitation.ts +142 -0
- package/src/runtime-mcp/oauth-flow.ts +5 -0
- package/src/runtime-mcp/oauth-public-url.ts +8 -0
- package/src/runtime-mcp/plugin-network-boundary.ts +4 -0
- package/src/runtime-mcp/smithery-registry.ts +22 -3
- package/src/runtime-mcp/transports/http.ts +2 -2
- package/src/runtime-mcp/types.ts +6 -0
- package/src/sdk/acp/adapter.ts +93 -8
- package/src/sdk/broker/broker-exit.ts +52 -23
- package/src/sdk/broker/broker.ts +83 -7
- package/src/sdk/broker/ensure.ts +2 -0
- package/src/sdk/broker/lifecycle.ts +820 -73
- package/src/sdk/broker/session-index.ts +191 -81
- package/src/sdk/broker/task-artifact-owner-validation.ts +259 -0
- package/src/sdk/bus/chat-daemon-cli.ts +38 -1
- package/src/sdk/bus/chat-daemon-control.ts +2 -2
- package/src/sdk/bus/chat-daemon-runtime.ts +3 -0
- package/src/sdk/bus/index.ts +241 -46
- package/src/sdk/bus/telegram-daemon-contract.ts +6 -1
- package/src/sdk/bus/telegram-daemon.ts +4 -2
- package/src/sdk/cli/session-cli.ts +17 -3
- package/src/sdk/client/client.ts +28 -8
- package/src/sdk/host/host.ts +6 -0
- package/src/sdk/host/query/handlers.ts +9 -1
- package/src/sdk/host/session-runtime.test.ts +2805 -411
- package/src/sdk/host/session-runtime.ts +428 -111
- package/src/sdk/host/surface-policy.ts +1 -0
- package/src/sdk/index.ts +8 -0
- package/src/sdk/lifecycle-session.ts +3 -1
- package/src/sdk/mcp/server.ts +15 -3
- package/src/sdk/prompt-deadline-manager.ts +15 -0
- package/src/sdk/protocol/operation-inventory.generated.json +146 -0
- package/src/sdk/protocol/operation-registry.ts +9 -2
- package/src/sdk/router/session-router.ts +94 -14
- package/src/sdk/session-list.ts +1 -0
- package/src/sdk/session.ts +81 -38
- package/src/session/agent-session.ts +674 -224
- package/src/session/artifacts.ts +174 -70
- package/src/session/internal/managed-gc-retirement-codec.ts +319 -0
- package/src/session/internal/managed-session-scope.ts +3457 -462
- package/src/session/internal/managed-session-storage.ts +482 -61
- package/src/session/internal/managed-task-owner-cleanup.ts +473 -0
- package/src/session/internal/task-artifact-owner-access.ts +245 -0
- package/src/session/internal/task-artifact-owner-transcript.ts +614 -0
- package/src/session/session-manager.ts +939 -133
- package/src/session/session-retirement.ts +714 -0
- package/src/session/session-storage.ts +418 -174
- package/src/session/session-transcript-header.ts +17 -0
- package/src/session/task-artifact-owner-codec.ts +641 -0
- package/src/session/task-artifact-owner-retirement.ts +477 -0
- package/src/session/task-artifact-owner.ts +289 -0
- package/src/setup/credential-auto-import.ts +12 -3
- package/src/setup/credential-import.ts +176 -5
- package/src/setup/paseo/announce.ts +6 -1
- package/src/skill-state/active-state.ts +132 -2
- package/src/slash-commands/builtin-registry.ts +39 -9
- package/src/slash-commands/helpers/progress-report.ts +23 -0
- package/src/stt/setup.ts +3 -5
- package/src/task/commands.ts +3 -1
- package/src/task/executor.ts +4 -0
- package/src/task/index.ts +6 -0
- package/src/tools/ask.ts +205 -6
- package/src/tools/ast-edit.ts +4 -0
- package/src/tools/bash-allowed-prefixes.ts +15 -0
- package/src/tools/bash-skill-urls.ts +56 -3
- package/src/tools/bash.ts +48 -79
- package/src/tools/descriptors.ts +5 -1
- package/src/tools/eval.ts +56 -36
- package/src/tools/image-gen.ts +1 -1
- package/src/tools/index.ts +3 -0
- package/src/tools/python.ts +187 -66
- package/src/tools/recipe/index.ts +9 -0
- package/src/tools/recipe/recipe-guard.ts +19 -0
- package/src/tools/restricted-cwd.ts +10 -0
- package/src/tools/skill-discovery.ts +5 -0
- package/src/tools/skill.ts +28 -1
- package/src/tools/todo-write.ts +10 -1
- package/src/tools/tool-catalog.generated.ts +1 -1
- package/src/tools/write.ts +1 -0
- package/src/utils/tools-checksum.ts +34 -0
- package/src/utils/tools-manager.ts +24 -6
- package/src/web/search/providers/codex.ts +3 -2
package/src/sdk/broker/broker.ts
CHANGED
|
@@ -6,9 +6,14 @@ import path from "node:path";
|
|
|
6
6
|
import type { NativeBrokerRestartIntent, NativeDirectoryTreeSnapshot } from "@gajae-code/natives";
|
|
7
7
|
import { logger, resolveEquivalentPath } from "@gajae-code/utils";
|
|
8
8
|
import packageJson from "../../../package.json" with { type: "json" };
|
|
9
|
+
import { FileLockAcquireError } from "../../config/file-lock";
|
|
9
10
|
import type { ModelProfileErrorDetails } from "../../config/model-profile-contract";
|
|
10
11
|
import { planLaunchWorktree } from "../../gjc-runtime/launch-worktree";
|
|
11
12
|
import { readExistingStateForMutation, withWorkflowStateLock } from "../../gjc-runtime/state-writer";
|
|
13
|
+
import type {
|
|
14
|
+
TaskArtifactOwnerDeletionEvidence,
|
|
15
|
+
TaskArtifactOwnerRetirementContinuation,
|
|
16
|
+
} from "../../session/task-artifact-owner-codec";
|
|
12
17
|
import { SdkClient, SdkClientError } from "../client";
|
|
13
18
|
import {
|
|
14
19
|
BROKER_RUNTIME_ABORT_CAPABILITY_FIELD,
|
|
@@ -127,6 +132,7 @@ import {
|
|
|
127
132
|
type SpawnSubstrateProvider,
|
|
128
133
|
} from "./spawn-authority";
|
|
129
134
|
import { createSpawnSubstrateProvider } from "./spawn-substrate";
|
|
135
|
+
import type { BrokerTaskArtifactOwnerRetirementDisposition } from "./task-artifact-owner-validation";
|
|
130
136
|
import { BrokerTransport } from "./transport";
|
|
131
137
|
|
|
132
138
|
export interface BrokerSettings {
|
|
@@ -158,6 +164,8 @@ export interface BrokerSettings {
|
|
|
158
164
|
restartRequestId?: string;
|
|
159
165
|
/** Cancel bootstrap before retained publication when the owning CLI receives a signal. */
|
|
160
166
|
startupAbortSignal?: AbortSignal;
|
|
167
|
+
/** Monotonic checkpoint deadline, leaving time for retained publication. */
|
|
168
|
+
startupCheckpointDeadline?: number;
|
|
161
169
|
/** Called synchronously when retained publication establishes broker readiness. */
|
|
162
170
|
onStartupReady?: () => void;
|
|
163
171
|
/** Test-only delay after session checkpoint to verify unpublished discovery ownership. */
|
|
@@ -293,6 +301,19 @@ export type BrokerCleanupEvidence = {
|
|
|
293
301
|
retainedTranscriptSuccessorPath?: string;
|
|
294
302
|
retainedTranscriptPlaceholderPath?: string;
|
|
295
303
|
retainedTranscriptUnknownPath?: string;
|
|
304
|
+
/** Immutable task-artifact owner authority captured before the first deletion effect. */
|
|
305
|
+
taskArtifactOwnerDeletionEvidence?: TaskArtifactOwnerDeletionEvidence;
|
|
306
|
+
/** Latest exact native remnant; it never replaces the original deletion evidence. */
|
|
307
|
+
taskArtifactOwnerRetirementContinuation?: TaskArtifactOwnerRetirementContinuation;
|
|
308
|
+
/** Strict owner-only wire disposition, decoded only with its separately stored evidence. */
|
|
309
|
+
taskArtifactOwnerRetirementOutcome?: BrokerTaskArtifactOwnerRetirementDisposition;
|
|
310
|
+
taskArtifactOwnerPayloadRetired?: true;
|
|
311
|
+
taskArtifactOwnerNamespaceRetained?: true;
|
|
312
|
+
taskArtifactOwnerRetired?: true;
|
|
313
|
+
/** Durable fact that transcript retirement completed while the owner namespace remains. */
|
|
314
|
+
taskArtifactOwnerTranscriptDeleted?: true;
|
|
315
|
+
/** Stable artifacts-phase owner refusal diagnostic. */
|
|
316
|
+
taskArtifactOwnerCleanupError?: string;
|
|
296
317
|
/** Durable proof that artifact cleanup completed before transcript mutation. */
|
|
297
318
|
artifactsRemoved?: boolean;
|
|
298
319
|
artifactsAbsentAtAuthorization?: true;
|
|
@@ -756,6 +777,17 @@ function normalizeAliasedString(
|
|
|
756
777
|
return { value: values[0] };
|
|
757
778
|
}
|
|
758
779
|
|
|
780
|
+
const BROKER_TASK_ARTIFACT_OWNER_CLEANUP_FIELDS = [
|
|
781
|
+
"taskArtifactOwnerDeletionEvidence",
|
|
782
|
+
"taskArtifactOwnerRetirementContinuation",
|
|
783
|
+
"taskArtifactOwnerRetirementOutcome",
|
|
784
|
+
"taskArtifactOwnerPayloadRetired",
|
|
785
|
+
"taskArtifactOwnerNamespaceRetained",
|
|
786
|
+
"taskArtifactOwnerRetired",
|
|
787
|
+
"taskArtifactOwnerTranscriptDeleted",
|
|
788
|
+
"taskArtifactOwnerCleanupError",
|
|
789
|
+
] as const;
|
|
790
|
+
|
|
759
791
|
export function normalizeBrokerInput(operation: string, input: Record<string, unknown>): InputNormalization {
|
|
760
792
|
const normalized: Record<string, unknown> = { ...input };
|
|
761
793
|
const session = normalizeAliasedString(input, "sessionId", ["id"]);
|
|
@@ -834,6 +866,18 @@ export function normalizeBrokerInput(operation: string, input: Record<string, un
|
|
|
834
866
|
if (cwd.value !== undefined) normalized.stateRoot = path.join(cwd.value, ".gjc", "state");
|
|
835
867
|
else if (stateRoot.value !== undefined) return error("invalid_input", "stateRoot requires cwd.");
|
|
836
868
|
|
|
869
|
+
if (operation === "session.delete") {
|
|
870
|
+
const hasOwnerField = (value: unknown): boolean =>
|
|
871
|
+
typeof value === "object" &&
|
|
872
|
+
value !== null &&
|
|
873
|
+
!Array.isArray(value) &&
|
|
874
|
+
BROKER_TASK_ARTIFACT_OWNER_CLEANUP_FIELDS.some(key => Object.hasOwn(value, key));
|
|
875
|
+
if (hasOwnerField(input) || hasOwnerField(target) || hasOwnerField(input.cleanup))
|
|
876
|
+
return error(
|
|
877
|
+
"invalid_input",
|
|
878
|
+
"Task-artifact owner cleanup state is broker-managed and cannot be supplied by clients.",
|
|
879
|
+
);
|
|
880
|
+
}
|
|
837
881
|
if (target) {
|
|
838
882
|
const normalizedTarget = { ...target };
|
|
839
883
|
delete normalizedTarget.path;
|
|
@@ -1525,10 +1569,12 @@ export class Broker {
|
|
|
1525
1569
|
#publishedAt: bigint | null = null;
|
|
1526
1570
|
#startedAt: bigint | null = null;
|
|
1527
1571
|
#watchInFlight = false;
|
|
1572
|
+
#checkpointInFlight = false;
|
|
1528
1573
|
#stopping = false;
|
|
1529
1574
|
#transport: BrokerTransport | null = null;
|
|
1530
1575
|
#heartbeatTimer: NodeJS.Timeout | null = null;
|
|
1531
1576
|
#startupAbortSignal: AbortSignal | undefined;
|
|
1577
|
+
#startupCheckpointDeadline: number | undefined;
|
|
1532
1578
|
#onStartupReady: (() => void) | undefined;
|
|
1533
1579
|
#startupPrePublicationDelayMs: number;
|
|
1534
1580
|
#startupPrePublicationTestHook: (() => Promise<void>) | undefined;
|
|
@@ -1568,6 +1614,7 @@ export class Broker {
|
|
|
1568
1614
|
this.#ownsResolveModelPin = settings.resolveModelPin === undefined;
|
|
1569
1615
|
this.#resolveModelPin = settings.resolveModelPin ?? createDefaultSdkHostModelResolver(this.settings.agentDir);
|
|
1570
1616
|
this.#startupAbortSignal = settings.startupAbortSignal;
|
|
1617
|
+
this.#startupCheckpointDeadline = settings.startupCheckpointDeadline;
|
|
1571
1618
|
this.#onStartupReady = settings.onStartupReady;
|
|
1572
1619
|
this.#startupPrePublicationDelayMs =
|
|
1573
1620
|
Number.isSafeInteger(settings.startupPrePublicationDelayMs) &&
|
|
@@ -3786,6 +3833,7 @@ export class Broker {
|
|
|
3786
3833
|
this.#publishedAt = null;
|
|
3787
3834
|
this.#startedAt = process.hrtime.bigint();
|
|
3788
3835
|
this.#watchInFlight = false;
|
|
3836
|
+
this.#checkpointInFlight = false;
|
|
3789
3837
|
this.#throwIfStartupAborted();
|
|
3790
3838
|
await Promise.all([this.ledger.assertSupportedStateVersions(), readBrokerDiscovery(this.settings.agentDir)]);
|
|
3791
3839
|
this.#throwIfStartupAborted();
|
|
@@ -3896,7 +3944,7 @@ export class Broker {
|
|
|
3896
3944
|
// checkpoint settles. The bootstrap watchdog owns this pre-publication
|
|
3897
3945
|
// interval; publishing first allowed it to kill an endpoint already handed
|
|
3898
3946
|
// to callers when a legitimate index-lock wait outlived the fence.
|
|
3899
|
-
await this.#checkpointSessionHeartbeats();
|
|
3947
|
+
await this.#checkpointSessionHeartbeats(this.#startupAbortSignal, this.#startupCheckpointDeadline);
|
|
3900
3948
|
this.#throwIfStartupAborted();
|
|
3901
3949
|
await this.#startupPrePublicationTestHook?.();
|
|
3902
3950
|
if (this.#startupPrePublicationDelayMs > 0) await Bun.sleep(this.#startupPrePublicationDelayMs);
|
|
@@ -4192,7 +4240,7 @@ export class Broker {
|
|
|
4192
4240
|
return;
|
|
4193
4241
|
}
|
|
4194
4242
|
this.#startupAdmissions.reopen();
|
|
4195
|
-
if (this.#publicationState === "healthy-owned")
|
|
4243
|
+
if (this.#publicationState === "healthy-owned") void this.#checkpointSessionHeartbeats();
|
|
4196
4244
|
return;
|
|
4197
4245
|
}
|
|
4198
4246
|
this.#fence(observation === "ambiguous" ? "observation-ambiguous" : "suspect-unpublished");
|
|
@@ -4229,20 +4277,39 @@ export class Broker {
|
|
|
4229
4277
|
if (publication) await this.#writeHeartbeat(publication);
|
|
4230
4278
|
}
|
|
4231
4279
|
/** Re-observes provably live session hosts and checkpoints their liveness. */
|
|
4232
|
-
async heartbeatSessions(now = Date.now()): Promise<number> {
|
|
4233
|
-
return await this.index.checkpointLiveHeartbeats(now);
|
|
4280
|
+
async heartbeatSessions(now = Date.now(), abortSignal?: AbortSignal, deadlineAt?: number): Promise<number> {
|
|
4281
|
+
return await this.index.checkpointLiveHeartbeats(now, abortSignal, deadlineAt);
|
|
4234
4282
|
}
|
|
4235
|
-
async #checkpointSessionHeartbeats(): Promise<void> {
|
|
4283
|
+
async #checkpointSessionHeartbeats(abortSignal?: AbortSignal, startupCheckpointDeadline?: number): Promise<void> {
|
|
4284
|
+
if (this.#checkpointInFlight || this.#stopping) return;
|
|
4285
|
+
this.#checkpointInFlight = true;
|
|
4236
4286
|
try {
|
|
4237
|
-
|
|
4287
|
+
// The CLI reserves publication headroom in this startup deadline.
|
|
4288
|
+
// Periodic passes use their own budget, not a retired startup signal.
|
|
4289
|
+
await this.heartbeatSessions(Date.now(), abortSignal, startupCheckpointDeadline);
|
|
4238
4290
|
} catch (error) {
|
|
4291
|
+
if (
|
|
4292
|
+
error instanceof FileLockAcquireError &&
|
|
4293
|
+
error.orphanPath &&
|
|
4294
|
+
this.#publication !== null &&
|
|
4295
|
+
this.#publicationState === "healthy-owned" &&
|
|
4296
|
+
this.#fenceReason === null &&
|
|
4297
|
+
this.#completionTask === null &&
|
|
4298
|
+
this.#provenOwnedRoot()
|
|
4299
|
+
) {
|
|
4300
|
+
await this.#complete("owned-root", "heartbeat-renewal-blocked", null, error.orphanPath);
|
|
4301
|
+
return;
|
|
4302
|
+
}
|
|
4239
4303
|
logger.warn(`sdk broker: session heartbeat checkpoint failed: ${String(error)}`);
|
|
4304
|
+
} finally {
|
|
4305
|
+
this.#checkpointInFlight = false;
|
|
4240
4306
|
}
|
|
4241
4307
|
}
|
|
4242
4308
|
async #complete(
|
|
4243
4309
|
mode: BrokerExitMode,
|
|
4244
4310
|
reason: BrokerExitReason,
|
|
4245
4311
|
signal: BrokerExitRecord["signal"] = null,
|
|
4312
|
+
blockingLockPath?: string,
|
|
4246
4313
|
): Promise<void> {
|
|
4247
4314
|
if (this.#completionTask) return this.#completionTask;
|
|
4248
4315
|
const now = process.hrtime.bigint();
|
|
@@ -4254,12 +4321,21 @@ export class Broker {
|
|
|
4254
4321
|
fenceReason: this.#fenceReason,
|
|
4255
4322
|
fencedForMs: fenceStartedAt === null ? 0 : Math.max(0, Number((now - fenceStartedAt) / 1_000_000n)),
|
|
4256
4323
|
uptimeMs: this.#startedAt === null ? 0 : Math.max(0, Number((now - this.#startedAt) / 1_000_000n)),
|
|
4324
|
+
...(blockingLockPath === undefined ? {} : { blockingLockPath }),
|
|
4257
4325
|
pid: process.pid,
|
|
4258
4326
|
signal,
|
|
4259
4327
|
writtenAt: Date.now(),
|
|
4260
4328
|
};
|
|
4261
|
-
|
|
4329
|
+
const message =
|
|
4330
|
+
reason === "heartbeat-renewal-blocked" && blockingLockPath
|
|
4331
|
+
? `blocked by retained removal transition ${blockingLockPath}`
|
|
4332
|
+
: undefined;
|
|
4333
|
+
(mode === "lost-root" || message !== undefined ? logger.warn : logger.info)("sdk broker: exiting", {
|
|
4334
|
+
...exitRecord,
|
|
4335
|
+
...(message === undefined ? {} : { message }),
|
|
4336
|
+
});
|
|
4262
4337
|
this.#stopping = true;
|
|
4338
|
+
this.#checkpointInFlight = false;
|
|
4263
4339
|
this.#publicationState = "stopping";
|
|
4264
4340
|
// A lost-root broker has been fenced: it no longer owns the published root, and
|
|
4265
4341
|
// its settlement is bounded, so any startup still queued behind it would be
|
package/src/sdk/broker/ensure.ts
CHANGED
|
@@ -41,6 +41,8 @@ function brokerStartupFailureReason(marker: BrokerStartupFailureMarker | undefin
|
|
|
41
41
|
|
|
42
42
|
function brokerStartupExitReason(record: BrokerStartupExitRecord | undefined): string | undefined {
|
|
43
43
|
if (!record) return undefined;
|
|
44
|
+
if (record.reason === "startup-lock-blocked")
|
|
45
|
+
return `SDK broker startup blocked by retained removal transition ${record.blockingLockPath}.`;
|
|
44
46
|
if (record.reason === "startup-deadline")
|
|
45
47
|
return `SDK broker startup exceeded its ${record.timeoutMs}ms fence deadline.`;
|
|
46
48
|
return `SDK broker startup interrupted by ${record.signal} before readiness.`;
|