@gajae-code/coding-agent 0.12.0 → 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 +82 -1
- package/dist/types/async/job-manager.d.ts +17 -3
- package/dist/types/config/settings-schema.d.ts +54 -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 +16 -2
- 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/gjc-runtime/launch-tmux.d.ts +1 -0
- package/dist/types/gjc-runtime/ralplan-runtime.d.ts +18 -0
- package/dist/types/gjc-runtime/team-launch.d.ts +1 -1
- package/dist/types/gjc-runtime/team-runtime.d.ts +25 -0
- package/dist/types/gjc-runtime/team-worker-heartbeat.d.ts +43 -0
- package/dist/types/gjc-runtime/tmux-owner-isolation.d.ts +10 -0
- package/dist/types/gjc-runtime/ultragoal-runtime.d.ts +31 -80
- package/dist/types/modes/acp/acp-agent.d.ts +2 -19
- package/dist/types/modes/components/gjc-bundle-settings.d.ts +34 -0
- package/dist/types/modes/components/notifications-settings-editor.d.ts +1 -0
- package/dist/types/modes/components/session-observer-overlay.d.ts +18 -0
- package/dist/types/modes/components/settings-selector.d.ts +9 -0
- package/dist/types/modes/components/status-line/gh.d.ts +5 -0
- package/dist/types/modes/components/transcript-viewer-overlay.d.ts +18 -1
- package/dist/types/reminders/star-reminder.d.ts +3 -13
- package/dist/types/runtime-mcp/manager.d.ts +1 -0
- package/dist/types/sdk/acp/adapter.d.ts +3 -1
- 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/index.d.ts +29 -0
- package/dist/types/sdk/bus/kind-aware-reconciliation.d.ts +8 -1
- package/dist/types/sdk/bus/lifecycle-control-runtime.d.ts +4 -0
- package/dist/types/sdk/bus/reconciliation-store.d.ts +7 -3
- 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/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 +38 -2
- 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/session-manager.d.ts +23 -6
- package/dist/types/session/session-storage.d.ts +4 -0
- package/dist/types/session/streaming-output.d.ts +36 -7
- package/dist/types/setup/credential-import.d.ts +12 -0
- package/dist/types/skill-state/active-state.d.ts +12 -0
- package/dist/types/skill-state/workflow-hud.d.ts +6 -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/image-gen.d.ts +4 -0
- package/dist/types/tools/index.d.ts +4 -0
- package/dist/types/tools/output-meta.d.ts +23 -2
- package/dist/types/tools/path-utils.d.ts +1 -0
- package/dist/types/tools/read.d.ts +0 -6
- package/dist/types/tools/review.d.ts +5 -7
- package/dist/types/tools/subagent.d.ts +2 -0
- 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 +10 -8
- package/scripts/acp-conformance-agent.ts +218 -0
- package/scripts/capture-gjc-bundle-settings.ts +306 -0
- package/scripts/generate-sdk-operation-inventory.ts +3 -0
- package/scripts/resident-memory-bench.ts +1341 -0
- package/scripts/run-acp-conformance.ts +285 -0
- package/src/async/job-manager.ts +78 -20
- package/src/cli/fast-help.ts +1 -1
- package/src/cli/plugin-cli.ts +176 -18
- package/src/commands/team.ts +19 -1
- package/src/config/file-lock.ts +11 -2
- package/src/config/settings-schema.ts +51 -0
- 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 +1 -0
- package/src/defaults/gjc/skills/ralplan/SKILL.md +19 -16
- package/src/defaults/gjc/skills/team/SKILL.md +2 -0
- package/src/defaults/gjc/skills/ultragoal/SKILL.md +37 -24
- package/src/defaults/gjc/skills/ultragoal/validation-batch-contracts.md +12 -0
- package/src/defaults/gjc-defaults.ts +4 -4
- 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 +18 -1
- 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/gjc-runtime/launch-tmux.ts +25 -6
- package/src/gjc-runtime/managed-owner-admission.ts +1 -1
- package/src/gjc-runtime/ralplan-runtime.ts +411 -17
- package/src/gjc-runtime/team-launch.ts +8 -0
- package/src/gjc-runtime/team-runtime.ts +140 -32
- package/src/gjc-runtime/team-worker-heartbeat.ts +149 -0
- package/src/gjc-runtime/tmux-owner-isolation.ts +10 -0
- package/src/gjc-runtime/tmux-sessions.ts +58 -13
- package/src/gjc-runtime/ultragoal-runtime.ts +401 -611
- package/src/gjc-runtime/workflow-manifest.generated.json +8 -99
- package/src/gjc-runtime/workflow-manifest.ts +4 -68
- package/src/internal-urls/docs-index.generated.ts +15 -15
- package/src/modes/DESIGN.md +51 -0
- package/src/modes/acp/acp-agent.ts +298 -186
- package/src/modes/components/gjc-bundle-settings.ts +508 -0
- package/src/modes/components/notifications-settings-editor.ts +12 -1
- package/src/modes/components/oauth-selector.ts +68 -30
- package/src/modes/components/session-observer-overlay.ts +305 -86
- package/src/modes/components/settings-selector.ts +56 -5
- package/src/modes/components/status-line/gh.ts +16 -0
- 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/extension-ui-controller.ts +7 -0
- package/src/modes/controllers/selector-controller.ts +45 -0
- package/src/modes/runtime-init.ts +3 -0
- package/src/prompts/agent-fragments/ralplan-persistence.md +4 -3
- package/src/prompts/system/eager-todo.md +8 -4
- package/src/prompts/system/system-prompt.md +11 -4
- package/src/prompts/tools/bash.md +5 -5
- 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/sdk/acp/adapter.ts +22 -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/index.ts +661 -126
- package/src/sdk/bus/kind-aware-reconciliation.ts +148 -73
- package/src/sdk/bus/lifecycle-commands.ts +4 -1
- package/src/sdk/bus/lifecycle-control-runtime.ts +403 -88
- package/src/sdk/bus/reconciliation-store.ts +95 -16
- 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/query/revision-store.ts +36 -2
- package/src/sdk/host/reverse-leases.ts +44 -7
- package/src/sdk/prompt-status.ts +16 -3
- package/src/sdk/protocol/operation-inventory.generated.json +22 -0
- package/src/sdk/session.ts +88 -9
- package/src/session/agent-session.ts +822 -172
- 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/session-manager.ts +1614 -435
- package/src/session/session-storage.ts +9 -1
- package/src/session/streaming-output.ts +238 -68
- package/src/setup/credential-import.ts +75 -13
- package/src/skill-state/active-state.ts +32 -0
- package/src/skill-state/workflow-hud.ts +17 -0
- package/src/skill-state/workflow-mutation-guard.ts +496 -2
- 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 +86 -55
- 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/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 +108 -14
- package/src/tools/path-utils.ts +3 -2
- package/src/tools/read.ts +18 -0
- 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/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/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/ultragoal-pipeline.d.ts +0 -23
- package/src/defaults/gjc/skills/ultragoal/pipeline-validation-contracts.md +0 -30
- package/src/gjc-runtime/ultragoal-pipeline.ts +0 -306
|
@@ -33,6 +33,7 @@ import {
|
|
|
33
33
|
ManagedSessionDescendantStore,
|
|
34
34
|
type ManagedSessionSecurityPolicy,
|
|
35
35
|
type ManagedStorageLock,
|
|
36
|
+
managedSecurityFailureClassification,
|
|
36
37
|
prepareManagedDirectoryRoot,
|
|
37
38
|
publishManagedFileNoReplace,
|
|
38
39
|
publishManagedTombstone,
|
|
@@ -873,21 +874,44 @@ function isRecoverableOwnerOnlyModeDrift(error: unknown): boolean {
|
|
|
873
874
|
return message === "mode_mismatch" || message.endsWith(": mode_mismatch");
|
|
874
875
|
}
|
|
875
876
|
|
|
877
|
+
type ManagedScopePrepareStage =
|
|
878
|
+
| "retained_identity"
|
|
879
|
+
| "root_authority"
|
|
880
|
+
| "sessions_root"
|
|
881
|
+
| "scope_directory"
|
|
882
|
+
| "scope_identity"
|
|
883
|
+
| "retained_authority"
|
|
884
|
+
| "store"
|
|
885
|
+
| "binding_publish"
|
|
886
|
+
| "binding_read"
|
|
887
|
+
| "binding_validate"
|
|
888
|
+
| "scope_revalidate"
|
|
889
|
+
| "internal_directory"
|
|
890
|
+
| "locks_directory"
|
|
891
|
+
| "receipts_directory"
|
|
892
|
+
| "tombstones_directory";
|
|
893
|
+
|
|
876
894
|
/** Synchronously create and validate the v2 binding before a default session writer exists. */
|
|
877
895
|
export function prepareManagedSessionScopeForWriteSync(
|
|
878
896
|
scope: ManagedScope,
|
|
879
897
|
policy: ManagedSessionSecurityPolicy = "default",
|
|
880
898
|
authority?: ManagedCandidateWriteAuthority,
|
|
881
899
|
): ManagedScopeResolution {
|
|
900
|
+
let stage: ManagedScopePrepareStage = "retained_identity";
|
|
882
901
|
try {
|
|
883
902
|
assertRetainedManagedDirectoryIdentity(scope);
|
|
903
|
+
stage = "root_authority";
|
|
884
904
|
const root = authority?.rootAuthority ?? scopeRoot(scope, policy);
|
|
885
905
|
if (authority) bindManagedWriteAuthority(scope, authority);
|
|
906
|
+
stage = "sessions_root";
|
|
886
907
|
ensureManagedDirectory(scope.sessionsRoot, root, policy);
|
|
908
|
+
stage = "scope_directory";
|
|
887
909
|
ensureManagedDirectory(scope.directoryPath, root, policy);
|
|
910
|
+
stage = "scope_identity";
|
|
888
911
|
const preparedDirectory = fs.lstatSync(scope.directoryPath, { bigint: true });
|
|
889
912
|
if (!preparedDirectory.isDirectory() || preparedDirectory.isSymbolicLink())
|
|
890
913
|
throw new Error("Managed session directory changed");
|
|
914
|
+
stage = "retained_authority";
|
|
891
915
|
const retainedAuthority =
|
|
892
916
|
authority?.retainedAuthority &&
|
|
893
917
|
authority.retainedDirectory !== undefined &&
|
|
@@ -904,6 +928,7 @@ export function prepareManagedSessionScopeForWriteSync(
|
|
|
904
928
|
retainedAuthority ? { authority: retainedAuthority, authorityBaseDir: scope.directoryPath } : undefined,
|
|
905
929
|
policy,
|
|
906
930
|
);
|
|
931
|
+
stage = "store";
|
|
907
932
|
let store: ManagedSessionDescendantStore;
|
|
908
933
|
try {
|
|
909
934
|
store = buildStore();
|
|
@@ -917,15 +942,19 @@ export function prepareManagedSessionScopeForWriteSync(
|
|
|
917
942
|
store = buildStore();
|
|
918
943
|
}
|
|
919
944
|
const binding = new TextEncoder().encode(`${JSON.stringify(bindingFor(scope))}\n`);
|
|
945
|
+
stage = "binding_publish";
|
|
920
946
|
try {
|
|
921
947
|
store.publishNoReplaceSync(MANAGED_SESSION_BINDING_FILE, binding);
|
|
922
948
|
} catch (error) {
|
|
923
949
|
if ((error as Error).message !== "destination_conflict") throw error;
|
|
924
950
|
}
|
|
951
|
+
stage = "binding_read";
|
|
925
952
|
const capturedBinding = store.readExpected(MANAGED_SESSION_BINDING_FILE);
|
|
926
953
|
if (!capturedBinding) throw new Error("Managed scope binding is unavailable");
|
|
954
|
+
stage = "binding_validate";
|
|
927
955
|
const validated = validateBindingRaw(scope, capturedBinding.bytes.toString("utf8"));
|
|
928
956
|
managedDirectoryAuthorities.set(scope, retainedAuthority);
|
|
957
|
+
stage = "scope_revalidate";
|
|
929
958
|
const directoryStat = fs.lstatSync(scope.directoryPath, { bigint: true });
|
|
930
959
|
if (
|
|
931
960
|
!directoryStat.isDirectory() ||
|
|
@@ -935,11 +964,21 @@ export function prepareManagedSessionScopeForWriteSync(
|
|
|
935
964
|
)
|
|
936
965
|
throw new Error("Managed session directory changed");
|
|
937
966
|
managedDirectoryIdentities.set(scope, { dev: preparedDirectory.dev, ino: preparedDirectory.ino });
|
|
938
|
-
if (validated)
|
|
967
|
+
if (validated) {
|
|
968
|
+
if (validated.kind !== "error") throw new Error("Unexpected managed scope binding result");
|
|
969
|
+
return {
|
|
970
|
+
...validated,
|
|
971
|
+
cause: { classification: validated.code, diagnostic: "prepare:binding_validate" },
|
|
972
|
+
};
|
|
973
|
+
}
|
|
939
974
|
const internal = managedInternalDirectory(scope);
|
|
975
|
+
stage = "internal_directory";
|
|
940
976
|
ensureManagedDirectory(internal, root, policy);
|
|
977
|
+
stage = "locks_directory";
|
|
941
978
|
ensureManagedDirectory(path.join(internal, MANAGED_LOCKS_DIRECTORY), root, policy);
|
|
979
|
+
stage = "receipts_directory";
|
|
942
980
|
ensureManagedDirectory(path.join(internal, MANAGED_RECEIPTS_DIRECTORY), root, policy);
|
|
981
|
+
stage = "tombstones_directory";
|
|
943
982
|
ensureManagedDirectory(path.join(internal, MANAGED_TOMBSTONES_DIRECTORY), root, policy);
|
|
944
983
|
return { kind: "resolved", scope };
|
|
945
984
|
} catch (error) {
|
|
@@ -954,15 +993,14 @@ export function prepareManagedSessionScopeForWriteSync(
|
|
|
954
993
|
message === "durability_not_provable"
|
|
955
994
|
? message
|
|
956
995
|
: "binding_invalid";
|
|
996
|
+
const securityClassification = managedSecurityFailureClassification(error);
|
|
957
997
|
return {
|
|
958
998
|
kind: "error",
|
|
959
999
|
code,
|
|
960
1000
|
message,
|
|
961
|
-
|
|
962
|
-
? {
|
|
963
|
-
: code
|
|
964
|
-
? {}
|
|
965
|
-
: { cause: { classification: code } }),
|
|
1001
|
+
cause: publication
|
|
1002
|
+
? { classification: publication.classification, diagnostic: publication.diagnostic }
|
|
1003
|
+
: { classification: securityClassification ?? code, diagnostic: `prepare:${stage}` },
|
|
966
1004
|
};
|
|
967
1005
|
}
|
|
968
1006
|
}
|
|
@@ -377,12 +377,31 @@ function managedRelativePath(root: ManagedDirectoryRoot, pathname: string): read
|
|
|
377
377
|
|
|
378
378
|
const PROCESS_START_ID = randomUUID();
|
|
379
379
|
|
|
380
|
+
class ManagedSecurityError extends Error {
|
|
381
|
+
readonly #classification: string;
|
|
382
|
+
|
|
383
|
+
constructor(pathname: string, result: NativeSecurity) {
|
|
384
|
+
const classification = result.ok ? "unexpected_security_state" : result.code;
|
|
385
|
+
super(
|
|
386
|
+
result.ok
|
|
387
|
+
? `Unexpected security state for ${pathname}`
|
|
388
|
+
: `Owner-only security rejected ${pathname}: ${classification}`,
|
|
389
|
+
);
|
|
390
|
+
this.name = "ManagedSecurityError";
|
|
391
|
+
this.#classification = classification;
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
getClassification(): string {
|
|
395
|
+
return this.#classification;
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
export function managedSecurityFailureClassification(error: unknown): string | undefined {
|
|
400
|
+
return error instanceof ManagedSecurityError ? error.getClassification() : undefined;
|
|
401
|
+
}
|
|
402
|
+
|
|
380
403
|
function securityError(pathname: string, result: NativeSecurity): Error {
|
|
381
|
-
return new
|
|
382
|
-
result.ok
|
|
383
|
-
? `Unexpected security state for ${pathname}`
|
|
384
|
-
: `Owner-only security rejected ${pathname}: ${result.code}`,
|
|
385
|
-
);
|
|
404
|
+
return new ManagedSecurityError(pathname, result);
|
|
386
405
|
}
|
|
387
406
|
|
|
388
407
|
function secure(pathname: string, kind: "directory" | "file"): void {
|
|
@@ -453,7 +472,11 @@ export class ManagedSessionDescendantStore {
|
|
|
453
472
|
readonly #baseDir: string;
|
|
454
473
|
readonly #policy: ManagedSessionSecurityPolicy;
|
|
455
474
|
readonly #authority: RecoveryFsRoot | undefined;
|
|
475
|
+
#ownsAuthority = false;
|
|
476
|
+
#closed = false;
|
|
456
477
|
readonly #authorityBaseDir: string;
|
|
478
|
+
/** Logical profile root inherited by nested managed session destinations. */
|
|
479
|
+
readonly #profileAgentDir: string;
|
|
457
480
|
readonly #subtreeRoot: ManagedDirectoryRoot;
|
|
458
481
|
|
|
459
482
|
constructor(
|
|
@@ -461,12 +484,14 @@ export class ManagedSessionDescendantStore {
|
|
|
461
484
|
baseDir: string,
|
|
462
485
|
retained?: { authority: RecoveryFsRoot; authorityBaseDir: string },
|
|
463
486
|
policy?: ManagedSessionSecurityPolicy,
|
|
487
|
+
profileAgentDir?: string,
|
|
464
488
|
) {
|
|
465
489
|
managedRelativePath(root, baseDir);
|
|
466
490
|
|
|
467
491
|
this.#root = root;
|
|
468
492
|
this.#baseDir = path.resolve(baseDir);
|
|
469
493
|
this.#policy = policy ?? "default";
|
|
494
|
+
this.#profileAgentDir = profileAgentDir ?? root.canonicalPath;
|
|
470
495
|
this.#authorityBaseDir = retained?.authorityBaseDir ?? this.#baseDir;
|
|
471
496
|
if (retained) {
|
|
472
497
|
const relative = path.relative(retained.authorityBaseDir, this.#baseDir).split(path.sep).join("/");
|
|
@@ -501,6 +526,7 @@ export class ManagedSessionDescendantStore {
|
|
|
501
526
|
throw new Error("Managed descendant root identity changed");
|
|
502
527
|
}
|
|
503
528
|
this.#authority = authority;
|
|
529
|
+
this.#ownsAuthority = true;
|
|
504
530
|
}
|
|
505
531
|
}
|
|
506
532
|
|
|
@@ -520,10 +546,15 @@ export class ManagedSessionDescendantStore {
|
|
|
520
546
|
return this.#policy;
|
|
521
547
|
}
|
|
522
548
|
|
|
549
|
+
get profileAgentDir(): string {
|
|
550
|
+
return this.#profileAgentDir;
|
|
551
|
+
}
|
|
552
|
+
|
|
523
553
|
deriveSubtree(relativePath: string): ManagedSessionDescendantStore {
|
|
524
554
|
const child = this.ensureDirectory(relativePath);
|
|
525
555
|
const resolved = this.#resolve(relativePath);
|
|
526
|
-
if (!this.#authority)
|
|
556
|
+
if (!this.#authority)
|
|
557
|
+
return new ManagedSessionDescendantStore(this.#root, resolved, undefined, this.#policy, this.#profileAgentDir);
|
|
527
558
|
const retainedChild = this.#authority.retainManagedDirectory(
|
|
528
559
|
this.#relative(resolved),
|
|
529
560
|
child.dev.toString(),
|
|
@@ -537,6 +568,7 @@ export class ManagedSessionDescendantStore {
|
|
|
537
568
|
authorityBaseDir: resolved,
|
|
538
569
|
},
|
|
539
570
|
this.#policy,
|
|
571
|
+
this.#profileAgentDir,
|
|
540
572
|
);
|
|
541
573
|
}
|
|
542
574
|
|
|
@@ -549,6 +581,16 @@ export class ManagedSessionDescendantStore {
|
|
|
549
581
|
);
|
|
550
582
|
}
|
|
551
583
|
|
|
584
|
+
/**
|
|
585
|
+
* Release an authority this store opened itself. Retained authorities are owned by
|
|
586
|
+
* the security context that supplied them and are never closed here. Idempotent.
|
|
587
|
+
*/
|
|
588
|
+
close(): void {
|
|
589
|
+
if (this.#closed || !this.#ownsAuthority || !this.#authority) return;
|
|
590
|
+
this.#closed = true;
|
|
591
|
+
this.#authority.close();
|
|
592
|
+
}
|
|
593
|
+
|
|
552
594
|
assertBound(): void {
|
|
553
595
|
this.#assertBound();
|
|
554
596
|
}
|