@dharma-ai-labs/agent-fabric 0.2.152 → 0.2.154
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bootstrapGitScope.test.d.ts +2 -0
- package/dist/bootstrapGitScope.test.d.ts.map +1 -0
- package/dist/bootstrapGitScope.test.js +115 -0
- package/dist/bootstrapGitScope.test.js.map +1 -0
- package/dist/bootstrapHostFiles.d.ts +5 -0
- package/dist/bootstrapHostFiles.d.ts.map +1 -0
- package/dist/bootstrapHostFiles.js +150 -0
- package/dist/bootstrapHostFiles.js.map +1 -0
- package/dist/bootstrapHostFiles.test.d.ts +2 -0
- package/dist/bootstrapHostFiles.test.d.ts.map +1 -0
- package/dist/bootstrapHostFiles.test.js +127 -0
- package/dist/bootstrapHostFiles.test.js.map +1 -0
- package/dist/bootstrapHostScope.d.ts +42 -0
- package/dist/bootstrapHostScope.d.ts.map +1 -0
- package/dist/bootstrapHostScope.js +224 -0
- package/dist/bootstrapHostScope.js.map +1 -0
- package/dist/bootstrapHostScope.test.d.ts +2 -0
- package/dist/bootstrapHostScope.test.d.ts.map +1 -0
- package/dist/bootstrapHostScope.test.js +577 -0
- package/dist/bootstrapHostScope.test.js.map +1 -0
- package/dist/bootstrapInstallationScope.test.d.ts +2 -0
- package/dist/bootstrapInstallationScope.test.d.ts.map +1 -0
- package/dist/bootstrapInstallationScope.test.js +68 -0
- package/dist/bootstrapInstallationScope.test.js.map +1 -0
- package/dist/bootstrapLauncherCaller.test.d.ts +2 -0
- package/dist/bootstrapLauncherCaller.test.d.ts.map +1 -0
- package/dist/bootstrapLauncherCaller.test.js +91 -0
- package/dist/bootstrapLauncherCaller.test.js.map +1 -0
- package/dist/bootstrapOwnedChildren.test.d.ts +2 -0
- package/dist/bootstrapOwnedChildren.test.d.ts.map +1 -0
- package/dist/bootstrapOwnedChildren.test.js +93 -0
- package/dist/bootstrapOwnedChildren.test.js.map +1 -0
- package/dist/bootstrapPolicyScope.test.d.ts +2 -0
- package/dist/bootstrapPolicyScope.test.d.ts.map +1 -0
- package/dist/bootstrapPolicyScope.test.js +261 -0
- package/dist/bootstrapPolicyScope.test.js.map +1 -0
- package/dist/bootstrapProcessCaller.test.d.ts +2 -0
- package/dist/bootstrapProcessCaller.test.d.ts.map +1 -0
- package/dist/bootstrapProcessCaller.test.js +262 -0
- package/dist/bootstrapProcessCaller.test.js.map +1 -0
- package/dist/bootstrapRegistryCaller.test.d.ts +2 -0
- package/dist/bootstrapRegistryCaller.test.d.ts.map +1 -0
- package/dist/bootstrapRegistryCaller.test.js +128 -0
- package/dist/bootstrapRegistryCaller.test.js.map +1 -0
- package/dist/bootstrapVaultScope.test.d.ts +2 -0
- package/dist/bootstrapVaultScope.test.d.ts.map +1 -0
- package/dist/bootstrapVaultScope.test.js +105 -0
- package/dist/bootstrapVaultScope.test.js.map +1 -0
- package/dist/codexBootstrapCompletion.test.d.ts +2 -0
- package/dist/codexBootstrapCompletion.test.d.ts.map +1 -0
- package/dist/codexBootstrapCompletion.test.js +630 -0
- package/dist/codexBootstrapCompletion.test.js.map +1 -0
- package/dist/codexBoundSession.d.ts +2 -2
- package/dist/codexBoundSession.d.ts.map +1 -1
- package/dist/codexBoundSession.js +23 -17
- package/dist/codexBoundSession.js.map +1 -1
- package/dist/codexBoundSession.test.js +3 -0
- package/dist/codexBoundSession.test.js.map +1 -1
- package/dist/codexInboxSession.d.ts.map +1 -1
- package/dist/codexInboxSession.js +3 -3
- package/dist/codexInboxSession.js.map +1 -1
- package/dist/codexScopedDispatch.test.d.ts +2 -0
- package/dist/codexScopedDispatch.test.d.ts.map +1 -0
- package/dist/codexScopedDispatch.test.js +56 -0
- package/dist/codexScopedDispatch.test.js.map +1 -0
- package/dist/codexSetupAdmission.d.ts +108 -0
- package/dist/codexSetupAdmission.d.ts.map +1 -0
- package/dist/codexSetupAdmission.js +214 -0
- package/dist/codexSetupAdmission.js.map +1 -0
- package/dist/codexSetupAdmission.test.d.ts +2 -0
- package/dist/codexSetupAdmission.test.d.ts.map +1 -0
- package/dist/codexSetupAdmission.test.js +578 -0
- package/dist/codexSetupAdmission.test.js.map +1 -0
- package/dist/codexSetupChildProvider.test.d.ts +2 -0
- package/dist/codexSetupChildProvider.test.d.ts.map +1 -0
- package/dist/codexSetupChildProvider.test.js +210 -0
- package/dist/codexSetupChildProvider.test.js.map +1 -0
- package/dist/codexSetupChildStartup.d.ts +38 -0
- package/dist/codexSetupChildStartup.d.ts.map +1 -0
- package/dist/codexSetupChildStartup.js +115 -0
- package/dist/codexSetupChildStartup.js.map +1 -0
- package/dist/codexSetupChildStartup.test.d.ts +2 -0
- package/dist/codexSetupChildStartup.test.d.ts.map +1 -0
- package/dist/codexSetupChildStartup.test.js +141 -0
- package/dist/codexSetupChildStartup.test.js.map +1 -0
- package/dist/codexSetupCliDispatch.test.d.ts +2 -0
- package/dist/codexSetupCliDispatch.test.d.ts.map +1 -0
- package/dist/codexSetupCliDispatch.test.js +138 -0
- package/dist/codexSetupCliDispatch.test.js.map +1 -0
- package/dist/codexSetupJournalOpen.test.d.ts +2 -0
- package/dist/codexSetupJournalOpen.test.d.ts.map +1 -0
- package/dist/codexSetupJournalOpen.test.js +101 -0
- package/dist/codexSetupJournalOpen.test.js.map +1 -0
- package/dist/codexSetupNativeHost.d.ts +31 -0
- package/dist/codexSetupNativeHost.d.ts.map +1 -0
- package/dist/codexSetupNativeHost.js +208 -0
- package/dist/codexSetupNativeHost.js.map +1 -0
- package/dist/codexSetupNativeHost.test.d.ts +2 -0
- package/dist/codexSetupNativeHost.test.d.ts.map +1 -0
- package/dist/codexSetupNativeHost.test.js +456 -0
- package/dist/codexSetupNativeHost.test.js.map +1 -0
- package/dist/codexSetupNativeWire.test.d.ts +2 -0
- package/dist/codexSetupNativeWire.test.d.ts.map +1 -0
- package/dist/codexSetupNativeWire.test.js +243 -0
- package/dist/codexSetupNativeWire.test.js.map +1 -0
- package/dist/codexSetupOwnedConnection.d.ts +14 -0
- package/dist/codexSetupOwnedConnection.d.ts.map +1 -0
- package/dist/codexSetupOwnedConnection.js +64 -0
- package/dist/codexSetupOwnedConnection.js.map +1 -0
- package/dist/codexSetupOwnedConnection.test.d.ts +2 -0
- package/dist/codexSetupOwnedConnection.test.d.ts.map +1 -0
- package/dist/codexSetupOwnedConnection.test.js +192 -0
- package/dist/codexSetupOwnedConnection.test.js.map +1 -0
- package/dist/codexSetupPortalCommand.test.d.ts +2 -0
- package/dist/codexSetupPortalCommand.test.d.ts.map +1 -0
- package/dist/codexSetupPortalCommand.test.js +146 -0
- package/dist/codexSetupPortalCommand.test.js.map +1 -0
- package/dist/codexSetupReadiness.d.ts +23 -0
- package/dist/codexSetupReadiness.d.ts.map +1 -0
- package/dist/codexSetupReadiness.js +74 -0
- package/dist/codexSetupReadiness.js.map +1 -0
- package/dist/codexSetupReadiness.test.d.ts +2 -0
- package/dist/codexSetupReadiness.test.d.ts.map +1 -0
- package/dist/codexSetupReadiness.test.js +145 -0
- package/dist/codexSetupReadiness.test.js.map +1 -0
- package/dist/codexSetupSessionCaller.test.d.ts +2 -0
- package/dist/codexSetupSessionCaller.test.d.ts.map +1 -0
- package/dist/codexSetupSessionCaller.test.js +352 -0
- package/dist/codexSetupSessionCaller.test.js.map +1 -0
- package/dist/codexSetupSessionHandoff.d.ts +48 -0
- package/dist/codexSetupSessionHandoff.d.ts.map +1 -0
- package/dist/codexSetupSessionHandoff.js +146 -0
- package/dist/codexSetupSessionHandoff.js.map +1 -0
- package/dist/codexSetupSessionHandoff.test.d.ts +2 -0
- package/dist/codexSetupSessionHandoff.test.d.ts.map +1 -0
- package/dist/codexSetupSessionHandoff.test.js +289 -0
- package/dist/codexSetupSessionHandoff.test.js.map +1 -0
- package/dist/codexSetupTransport.test.d.ts +2 -0
- package/dist/codexSetupTransport.test.d.ts.map +1 -0
- package/dist/codexSetupTransport.test.js +206 -0
- package/dist/codexSetupTransport.test.js.map +1 -0
- package/dist/codexSetupVaultJournal.d.ts +13 -0
- package/dist/codexSetupVaultJournal.d.ts.map +1 -0
- package/dist/codexSetupVaultJournal.js +28 -0
- package/dist/codexSetupVaultJournal.js.map +1 -0
- package/dist/codexSetupVaultJournal.test.d.ts +2 -0
- package/dist/codexSetupVaultJournal.test.d.ts.map +1 -0
- package/dist/codexSetupVaultJournal.test.js +104 -0
- package/dist/codexSetupVaultJournal.test.js.map +1 -0
- package/dist/containerChildCleanup.test.d.ts +2 -0
- package/dist/containerChildCleanup.test.d.ts.map +1 -0
- package/dist/containerChildCleanup.test.js +145 -0
- package/dist/containerChildCleanup.test.js.map +1 -0
- package/dist/containerRelayLifecycle.d.ts +1 -1
- package/dist/containerRelayLifecycle.d.ts.map +1 -1
- package/dist/containerRelayLifecycle.js +29 -37
- package/dist/containerRelayLifecycle.js.map +1 -1
- package/dist/containerRelayLifecycle.test.js +13 -0
- package/dist/containerRelayLifecycle.test.js.map +1 -1
- package/dist/cooperativeInboxSession.d.ts +2 -2
- package/dist/cooperativeInboxSession.d.ts.map +1 -1
- package/dist/cooperativeInboxSession.js +21 -13
- package/dist/cooperativeInboxSession.js.map +1 -1
- package/dist/cooperativeInboxSession.test.js +65 -0
- package/dist/cooperativeInboxSession.test.js.map +1 -1
- package/dist/demoWatchControl.d.ts +3 -3
- package/dist/index.d.ts +55 -14
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1650 -557
- package/dist/index.js.map +1 -1
- package/dist/namedCodexSkillDiscovery.d.ts +15 -0
- package/dist/namedCodexSkillDiscovery.d.ts.map +1 -0
- package/dist/namedCodexSkillDiscovery.js +90 -0
- package/dist/namedCodexSkillDiscovery.js.map +1 -0
- package/dist/namedCodexSkillDiscovery.test.d.ts +2 -0
- package/dist/namedCodexSkillDiscovery.test.d.ts.map +1 -0
- package/dist/namedCodexSkillDiscovery.test.js +37 -0
- package/dist/namedCodexSkillDiscovery.test.js.map +1 -0
- package/dist/namedCodexThread.d.ts +2 -0
- package/dist/namedCodexThread.d.ts.map +1 -1
- package/dist/namedCodexThread.js +13 -4
- package/dist/namedCodexThread.js.map +1 -1
- package/dist/namedSessionChildOwner.d.ts +17 -0
- package/dist/namedSessionChildOwner.d.ts.map +1 -0
- package/dist/namedSessionChildOwner.js +122 -0
- package/dist/namedSessionChildOwner.js.map +1 -0
- package/dist/namedSessionChildOwner.test.d.ts +2 -0
- package/dist/namedSessionChildOwner.test.d.ts.map +1 -0
- package/dist/namedSessionChildOwner.test.js +203 -0
- package/dist/namedSessionChildOwner.test.js.map +1 -0
- package/dist/namedSessionEvidence.d.ts +2 -2
- package/dist/namedSessionEvidence.d.ts.map +1 -1
- package/dist/namedSessionEvidence.js +2 -2
- package/dist/namedSessionEvidence.js.map +1 -1
- package/dist/namedSessionEvidence.test.js +24 -1
- package/dist/namedSessionEvidence.test.js.map +1 -1
- package/dist/namedSessionRepositoryState.d.ts +2 -2
- package/dist/namedSessionRepositoryState.d.ts.map +1 -1
- package/dist/namedSessionService.d.ts +4 -2
- package/dist/namedSessionService.d.ts.map +1 -1
- package/dist/namedSessionService.js +18 -1
- package/dist/namedSessionService.js.map +1 -1
- package/dist/namedSessionService.test.js +31 -2
- package/dist/namedSessionService.test.js.map +1 -1
- package/dist/namedSessionTaskExportSync.d.ts +3 -3
- package/dist/namedSessionTaskExportSync.d.ts.map +1 -1
- package/dist/namedSessionTaskExportSync.js +6 -6
- package/dist/namedSessionTaskExportSync.js.map +1 -1
- package/dist/namedSessionTrust.d.ts +2 -2
- package/dist/namedSessionTrust.d.ts.map +1 -1
- package/dist/namedSessionTrust.js +3 -2
- package/dist/namedSessionTrust.js.map +1 -1
- package/dist/namedSessionTrust.test.js +2 -1
- package/dist/namedSessionTrust.test.js.map +1 -1
- package/dist/ownedChildLifecycle.d.ts +13 -0
- package/dist/ownedChildLifecycle.d.ts.map +1 -0
- package/dist/ownedChildLifecycle.js +87 -0
- package/dist/ownedChildLifecycle.js.map +1 -0
- package/dist/ownedChildLifecycle.test.d.ts +2 -0
- package/dist/ownedChildLifecycle.test.d.ts.map +1 -0
- package/dist/ownedChildLifecycle.test.js +133 -0
- package/dist/ownedChildLifecycle.test.js.map +1 -0
- package/dist/pidLock.test.js +242 -9
- package/dist/pidLock.test.js.map +1 -1
- package/dist/providerSessionChannel.d.ts +1 -1
- package/dist/providerSessionChannel.d.ts.map +1 -1
- package/dist/providerSessionChannel.js +7 -3
- package/dist/providerSessionChannel.js.map +1 -1
- package/dist/providerSessionChannel.test.js +20 -0
- package/dist/providerSessionChannel.test.js.map +1 -1
- package/dist/providerSessionReplyRecovery.d.ts +2 -2
- package/dist/providerSessionReplyRecovery.d.ts.map +1 -1
- package/dist/providerSessionReplyRecovery.js +3 -3
- package/dist/providerSessionReplyRecovery.js.map +1 -1
- package/dist/relayAutostart.d.ts.map +1 -1
- package/dist/relayAutostart.js +12 -9
- package/dist/relayAutostart.js.map +1 -1
- package/dist/relayRuntimeUpgrade.d.ts +1 -1
- package/dist/relayRuntimeUpgrade.d.ts.map +1 -1
- package/dist/relayRuntimeUpgrade.js +3 -1
- package/dist/relayRuntimeUpgrade.js.map +1 -1
- package/dist/relayRuntimeUpgrade.test.js +113 -0
- package/dist/relayRuntimeUpgrade.test.js.map +1 -1
- package/dist/relayRuntimeUpgradeCaller.test.js +12 -1
- package/dist/relayRuntimeUpgradeCaller.test.js.map +1 -1
- package/dist/relaySupervisor.d.ts.map +1 -1
- package/dist/relaySupervisor.js +19 -14
- package/dist/relaySupervisor.js.map +1 -1
- package/dist/relaySupervisor.test.js +26 -0
- package/dist/relaySupervisor.test.js.map +1 -1
- package/dist/relaySupervisorCleanup.test.d.ts +2 -0
- package/dist/relaySupervisorCleanup.test.d.ts.map +1 -0
- package/dist/relaySupervisorCleanup.test.js +69 -0
- package/dist/relaySupervisorCleanup.test.js.map +1 -0
- package/dist/repositoryInstallerFiles.d.ts +19 -1
- package/dist/repositoryInstallerFiles.d.ts.map +1 -1
- package/dist/repositoryInstallerFiles.js +205 -29
- package/dist/repositoryInstallerFiles.js.map +1 -1
- package/dist/repositoryInstallerScope.test.d.ts +2 -0
- package/dist/repositoryInstallerScope.test.d.ts.map +1 -0
- package/dist/repositoryInstallerScope.test.js +513 -0
- package/dist/repositoryInstallerScope.test.js.map +1 -0
- package/dist/repositoryKnowledge.d.ts.map +1 -1
- package/dist/repositoryKnowledge.js +177 -37
- package/dist/repositoryKnowledge.js.map +1 -1
- package/dist/repositoryKnowledgeScope.test.d.ts +2 -0
- package/dist/repositoryKnowledgeScope.test.d.ts.map +1 -0
- package/dist/repositoryKnowledgeScope.test.js +316 -0
- package/dist/repositoryKnowledgeScope.test.js.map +1 -0
- package/dist/repositoryOnboardingCaller.test.js +61 -4
- package/dist/repositoryOnboardingCaller.test.js.map +1 -1
- package/dist/repositoryPackage.d.ts.map +1 -1
- package/dist/repositoryPackage.js +340 -59
- package/dist/repositoryPackage.js.map +1 -1
- package/dist/repositoryPackageDelivery.test.js +65 -0
- package/dist/repositoryPackageDelivery.test.js.map +1 -1
- package/dist/repositoryPackageScope.test.d.ts +2 -0
- package/dist/repositoryPackageScope.test.d.ts.map +1 -0
- package/dist/repositoryPackageScope.test.js +578 -0
- package/dist/repositoryPackageScope.test.js.map +1 -0
- package/dist/schemas/codex-setup-child-start.schema.json +12 -0
- package/dist/schemas/codex-setup-intent.schema.json +27 -0
- package/dist/schemas/local-codex-setup-session.schema.json +39 -0
- package/dist/schemas/setup-claim-failure.schema.json +15 -0
- package/dist/skillInstallationScope.test.d.ts +2 -0
- package/dist/skillInstallationScope.test.d.ts.map +1 -0
- package/dist/skillInstallationScope.test.js +64 -0
- package/dist/skillInstallationScope.test.js.map +1 -0
- package/dist/skillPreparationCache.test.js +12 -4
- package/dist/skillPreparationCache.test.js.map +1 -1
- package/dist/skillPreparationCaller.test.js +31 -1
- package/dist/skillPreparationCaller.test.js.map +1 -1
- package/dist/startupCommitScope.test.d.ts +2 -0
- package/dist/startupCommitScope.test.d.ts.map +1 -0
- package/dist/startupCommitScope.test.js +172 -0
- package/dist/startupCommitScope.test.js.map +1 -0
- package/dist/workspaceRegistry.d.ts.map +1 -1
- package/dist/workspaceRegistry.js +7 -3
- package/dist/workspaceRegistry.js.map +1 -1
- package/dist/workspaceRegistry.test.js +51 -0
- package/dist/workspaceRegistry.test.js.map +1 -1
- package/dist/workspaceRegistryRecovery.d.ts.map +1 -1
- package/dist/workspaceRegistryRecovery.js +171 -64
- package/dist/workspaceRegistryRecovery.js.map +1 -1
- package/dist/workspaceRegistryRecoveryScope.test.d.ts +2 -0
- package/dist/workspaceRegistryRecoveryScope.test.d.ts.map +1 -0
- package/dist/workspaceRegistryRecoveryScope.test.js +416 -0
- package/dist/workspaceRegistryRecoveryScope.test.js.map +1 -0
- package/package.json +7 -7
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { CodexStdioTransport } from '@dharma-ai-labs/agent-fabric-provider-adapters/experimental/codex-transport';
|
|
2
|
+
import { readNamedSessionPackageContent, type NamedSessionPackageContent } from './namedSessionPackageGate.js';
|
|
3
|
+
export type NamedCodexSkillObservation = Readonly<NamedSessionPackageContent & {
|
|
4
|
+
schema: 'dharma.named-codex-skill-observation/v1';
|
|
5
|
+
nativeDiscovered: true;
|
|
6
|
+
observedAt: string;
|
|
7
|
+
}>;
|
|
8
|
+
/** Only the current owner's non-secret content observation crosses local IPC. */
|
|
9
|
+
export declare function parseNamedCodexSkillObservation(raw: unknown): NamedCodexSkillObservation;
|
|
10
|
+
export declare function observeNamedCodexSkill(transport: Pick<CodexStdioTransport, 'request' | 'signal'>, input: {
|
|
11
|
+
workspace: string;
|
|
12
|
+
installation: Parameters<typeof readNamedSessionPackageContent>[0];
|
|
13
|
+
sharedRepositoryReady: boolean;
|
|
14
|
+
}): Promise<NamedCodexSkillObservation>;
|
|
15
|
+
//# sourceMappingURL=namedCodexSkillDiscovery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"namedCodexSkillDiscovery.d.ts","sourceRoot":"","sources":["../src/namedCodexSkillDiscovery.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAC,mBAAmB,EAAC,MAAM,6EAA6E,CAAC;AACrH,OAAO,EAAC,8BAA8B,EAAE,KAAK,0BAA0B,EAAC,MAAM,8BAA8B,CAAC;AAE7G,MAAM,MAAM,0BAA0B,GAAG,QAAQ,CAAC,0BAA0B,GAAG;IAC7E,MAAM,EAAE,yCAAyC,CAAC;IAClD,gBAAgB,EAAE,IAAI,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC,CAAC;AAEH,iFAAiF;AACjF,wBAAgB,+BAA+B,CAAC,GAAG,EAAE,OAAO,GAAG,0BAA0B,CAaxF;AA0BD,wBAAsB,sBAAsB,CAAC,SAAS,EAAE,IAAI,CAAC,mBAAmB,EAAE,SAAS,GAAG,QAAQ,CAAC,EAAE,KAAK,EAAE;IAC9G,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,UAAU,CAAC,OAAO,8BAA8B,CAAC,CAAC,CAAC,CAAC,CAAC;IACnE,qBAAqB,EAAE,OAAO,CAAC;CAChC,GAAG,OAAO,CAAC,0BAA0B,CAAC,CA+BtC"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { isAbsolute, resolve } from 'node:path';
|
|
2
|
+
import { types } from 'node:util';
|
|
3
|
+
import { readNamedSessionPackageContent } from './namedSessionPackageGate.js';
|
|
4
|
+
/** Only the current owner's non-secret content observation crosses local IPC. */
|
|
5
|
+
export function parseNamedCodexSkillObservation(raw) {
|
|
6
|
+
const value = data(raw);
|
|
7
|
+
if (Object.keys(value).sort().join(',') !== 'bundleHash,bundleId,catalogHash,manifestHash,nativeDiscovered,observedAt,schema,skillsHash'
|
|
8
|
+
|| value.schema !== 'dharma.named-codex-skill-observation/v1' || value.nativeDiscovered !== true
|
|
9
|
+
|| typeof value.bundleId !== 'string' || !/^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$(?![\s\S])/i.test(value.bundleId)
|
|
10
|
+
|| ['bundleHash', 'catalogHash', 'manifestHash', 'skillsHash'].some(key => typeof value[key] !== 'string'
|
|
11
|
+
|| !/^sha256:[a-f0-9]{64}$(?![\s\S])/.test(value[key]))
|
|
12
|
+
|| typeof value.observedAt !== 'string')
|
|
13
|
+
throw new Error('named_session_native_skill_invalid');
|
|
14
|
+
const at = Date.parse(value.observedAt), now = Date.now();
|
|
15
|
+
if (!Number.isFinite(at) || new Date(at).toISOString() !== value.observedAt || at > now || now - at > 60_000) {
|
|
16
|
+
throw new Error('named_session_native_skill_invalid');
|
|
17
|
+
}
|
|
18
|
+
return Object.freeze(value);
|
|
19
|
+
}
|
|
20
|
+
function data(value) {
|
|
21
|
+
if (!value || typeof value !== 'object' || Array.isArray(value) || types.isProxy(value))
|
|
22
|
+
throw new Error('named_session_native_skill_invalid');
|
|
23
|
+
const prototype = Object.getPrototypeOf(value);
|
|
24
|
+
if (prototype !== Object.prototype && prototype !== null)
|
|
25
|
+
throw new Error('named_session_native_skill_invalid');
|
|
26
|
+
const fields = Object.getOwnPropertyDescriptors(value);
|
|
27
|
+
if (Reflect.ownKeys(fields).length > 32 || Reflect.ownKeys(fields).some(key => typeof key !== 'string'
|
|
28
|
+
|| !fields[key]?.enumerable || !Object.hasOwn(fields[key], 'value')))
|
|
29
|
+
throw new Error('named_session_native_skill_invalid');
|
|
30
|
+
return Object.fromEntries(Object.entries(fields).map(([key, field]) => [key, field.value]));
|
|
31
|
+
}
|
|
32
|
+
function list(value, maximum) {
|
|
33
|
+
if (!Array.isArray(value) || types.isProxy(value) || Object.getPrototypeOf(value) !== Array.prototype
|
|
34
|
+
|| value.length > maximum)
|
|
35
|
+
throw new Error('named_session_native_skill_invalid');
|
|
36
|
+
const fields = Object.getOwnPropertyDescriptors(value);
|
|
37
|
+
if (Reflect.ownKeys(fields).length !== value.length + 1)
|
|
38
|
+
throw new Error('named_session_native_skill_invalid');
|
|
39
|
+
return Array.from({ length: value.length }, (_, index) => {
|
|
40
|
+
const field = fields[String(index)];
|
|
41
|
+
if (!field?.enumerable || !Object.hasOwn(field, 'value'))
|
|
42
|
+
throw new Error('named_session_native_skill_invalid');
|
|
43
|
+
return field.value;
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
// The owner calls this only inside its existing activation/lifetime boundary.
|
|
47
|
+
// Native discovery is not evidence that a later coding turn used the skill.
|
|
48
|
+
export async function observeNamedCodexSkill(transport, input) {
|
|
49
|
+
const captured = data(input);
|
|
50
|
+
if (Object.keys(captured).sort().join(',') !== 'installation,sharedRepositoryReady,workspace'
|
|
51
|
+
|| typeof captured.sharedRepositoryReady !== 'boolean')
|
|
52
|
+
throw new Error('named_session_native_skill_invalid');
|
|
53
|
+
const workspace = captured.workspace;
|
|
54
|
+
const installation = Object.freeze({ ...data(captured.installation) });
|
|
55
|
+
const sharedRepositoryReady = captured.sharedRepositoryReady;
|
|
56
|
+
if (typeof workspace !== 'string' || !isAbsolute(workspace) || resolve(workspace) !== workspace
|
|
57
|
+
|| workspace.length > 4096 || /[\r\n\0]/.test(workspace) || transport.signal.aborted) {
|
|
58
|
+
throw new Error('named_session_native_skill_unavailable');
|
|
59
|
+
}
|
|
60
|
+
try {
|
|
61
|
+
const before = await readNamedSessionPackageContent(installation, sharedRepositoryReady);
|
|
62
|
+
if (transport.signal.aborted)
|
|
63
|
+
throw new Error();
|
|
64
|
+
// Official app-server read; no thread/turn, shell, account or configuration action.
|
|
65
|
+
const response = data(await transport.request('skills/list', { cwds: [workspace], forceReload: true }));
|
|
66
|
+
if (transport.signal.aborted)
|
|
67
|
+
throw new Error();
|
|
68
|
+
const entries = list(response.data, 1);
|
|
69
|
+
if (entries.length !== 1)
|
|
70
|
+
throw new Error();
|
|
71
|
+
const entry = data(entries[0]);
|
|
72
|
+
if (entry.cwd !== workspace || list(entry.errors, 256).length !== 0)
|
|
73
|
+
throw new Error();
|
|
74
|
+
const skills = list(entry.skills, 1024).map(data);
|
|
75
|
+
const matches = skills.filter(skill => skill.name === 'dharma-agent-fabric');
|
|
76
|
+
if (matches.length !== 1 || matches[0].enabled !== true
|
|
77
|
+
|| matches[0].path !== installation.nativeSkillPath)
|
|
78
|
+
throw new Error();
|
|
79
|
+
const after = await readNamedSessionPackageContent(installation, sharedRepositoryReady);
|
|
80
|
+
if (transport.signal.aborted || Object.keys(before)
|
|
81
|
+
.some(key => before[key] !== after[key]))
|
|
82
|
+
throw new Error();
|
|
83
|
+
return parseNamedCodexSkillObservation({ ...after, schema: 'dharma.named-codex-skill-observation/v1',
|
|
84
|
+
nativeDiscovered: true, observedAt: new Date().toISOString() });
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
throw new Error('named_session_native_skill_unavailable');
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=namedCodexSkillDiscovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"namedCodexSkillDiscovery.js","sourceRoot":"","sources":["../src/namedCodexSkillDiscovery.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"namedCodexSkillDiscovery.test.d.ts","sourceRoot":"","sources":["../src/namedCodexSkillDiscovery.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import assert from 'node:assert/strict';
|
|
2
|
+
import { randomUUID } from 'node:crypto';
|
|
3
|
+
import test from 'node:test';
|
|
4
|
+
import { parseNamedCodexSkillObservation } from './namedCodexSkillDiscovery.js';
|
|
5
|
+
const good = () => ({ schema: 'dharma.named-codex-skill-observation/v1', nativeDiscovered: true,
|
|
6
|
+
bundleId: randomUUID(), bundleHash: `sha256:${'a'.repeat(64)}`, catalogHash: `sha256:${'b'.repeat(64)}`,
|
|
7
|
+
manifestHash: `sha256:${'c'.repeat(64)}`, skillsHash: `sha256:${'d'.repeat(64)}`, observedAt: new Date().toISOString() });
|
|
8
|
+
test('native skill IPC observation snapshots only the exact current non-secret content identity', () => {
|
|
9
|
+
const input = good(), result = parseNamedCodexSkillObservation(input);
|
|
10
|
+
assert.deepEqual(result, input);
|
|
11
|
+
assert.equal(Object.isFrozen(result), true);
|
|
12
|
+
input.bundleHash = `sha256:${'e'.repeat(64)}`;
|
|
13
|
+
assert.notEqual(result.bundleHash, input.bundleHash);
|
|
14
|
+
});
|
|
15
|
+
test('native skill IPC observation rejects malformed, stale, future and private fields', () => {
|
|
16
|
+
const fixture = good();
|
|
17
|
+
const { catalogHash: _catalog, ...partial } = fixture;
|
|
18
|
+
for (const value of [partial, { ...fixture, path: '/private/native/SKILL.md' }, { ...fixture, schema: 'foreign' },
|
|
19
|
+
{ ...fixture, nativeDiscovered: false }, { ...fixture, bundleId: `${fixture.bundleId}\n` },
|
|
20
|
+
{ ...fixture, manifestHash: `${fixture.manifestHash}\n` }, { ...fixture, skillsHash: 'not-a-hash' },
|
|
21
|
+
{ ...fixture, observedAt: new Date(Date.now() - 60_001).toISOString() },
|
|
22
|
+
{ ...fixture, observedAt: new Date(Date.now() + 60_000).toISOString() }, { ...fixture, observedAt: 'invalid' },
|
|
23
|
+
{ ...fixture, observedAt: fixture.observedAt.replace('Z', '+00:00') }, []]) {
|
|
24
|
+
assert.throws(() => parseNamedCodexSkillObservation(value), { message: 'named_session_native_skill_invalid' });
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
test('native skill IPC observation never invokes accessors or proxy traps', () => {
|
|
28
|
+
let invoked = 0;
|
|
29
|
+
const getter = { ...good() };
|
|
30
|
+
Object.defineProperty(getter, 'bundleHash', { enumerable: true, get() { invoked++; return 'private'; } });
|
|
31
|
+
const proxy = new Proxy(good(), { ownKeys() { invoked++; return []; } });
|
|
32
|
+
for (const value of [getter, proxy, Object.assign(Object.create({ private: true }), good())]) {
|
|
33
|
+
assert.throws(() => parseNamedCodexSkillObservation(value), { message: 'named_session_native_skill_invalid' });
|
|
34
|
+
}
|
|
35
|
+
assert.equal(invoked, 0);
|
|
36
|
+
});
|
|
37
|
+
//# sourceMappingURL=namedCodexSkillDiscovery.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"namedCodexSkillDiscovery.test.js","sourceRoot":"","sources":["../src/namedCodexSkillDiscovery.test.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAC,UAAU,EAAC,MAAM,aAAa,CAAC;AACvC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAC,+BAA+B,EAAC,MAAM,+BAA+B,CAAC;AAE9E,MAAM,IAAI,GAAG,GAAG,EAAE,CAAC,CAAC,EAAC,MAAM,EAAE,yCAAyC,EAAE,gBAAgB,EAAE,IAAI;IAC5F,QAAQ,EAAE,UAAU,EAAE,EAAE,UAAU,EAAE,UAAU,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,WAAW,EAAE,UAAU,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE;IACvG,YAAY,EAAE,UAAU,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,UAAU,EAAE,UAAU,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAC,CAAC,CAAC;AAE3H,IAAI,CAAC,2FAA2F,EAAE,GAAG,EAAE;IACrG,MAAM,KAAK,GAAG,IAAI,EAAE,EAAE,MAAM,GAAG,+BAA+B,CAAC,KAAK,CAAC,CAAC;IACtE,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC;IAC7E,KAAK,CAAC,UAAU,GAAG,UAAU,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;IAC9C,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,UAAU,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;AACvD,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,kFAAkF,EAAE,GAAG,EAAE;IAC5F,MAAM,OAAO,GAAG,IAAI,EAAE,CAAC;IACvB,MAAM,EAAC,WAAW,EAAE,QAAQ,EAAE,GAAG,OAAO,EAAC,GAAG,OAAO,CAAC;IACpD,KAAK,MAAM,KAAK,IAAI,CAAC,OAAO,EAAE,EAAC,GAAG,OAAO,EAAE,IAAI,EAAE,0BAA0B,EAAC,EAAE,EAAC,GAAG,OAAO,EAAE,MAAM,EAAE,SAAS,EAAC;QAC3G,EAAC,GAAG,OAAO,EAAE,gBAAgB,EAAE,KAAK,EAAC,EAAE,EAAC,GAAG,OAAO,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,QAAQ,IAAI,EAAC;QACtF,EAAC,GAAG,OAAO,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,YAAY,IAAI,EAAC,EAAE,EAAC,GAAG,OAAO,EAAE,UAAU,EAAE,YAAY,EAAC;QAC/F,EAAC,GAAG,OAAO,EAAE,UAAU,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,CAAC,WAAW,EAAE,EAAC;QACrE,EAAC,GAAG,OAAO,EAAE,UAAU,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,CAAC,WAAW,EAAE,EAAC,EAAE,EAAC,GAAG,OAAO,EAAE,UAAU,EAAE,SAAS,EAAC;QAC1G,EAAC,GAAG,OAAO,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,EAAE,QAAQ,CAAC,EAAC,EAAE,EAAE,CAAC,EAAE,CAAC;QAC3E,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,+BAA+B,CAAC,KAAK,CAAC,EAAE,EAAC,OAAO,EAAE,oCAAoC,EAAC,CAAC,CAAC;IAC/G,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,qEAAqE,EAAE,GAAG,EAAE;IAC/E,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,MAAM,MAAM,GAAG,EAAC,GAAG,IAAI,EAAE,EAAC,CAAC;IAC3B,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,YAAY,EAAE,EAAC,UAAU,EAAE,IAAI,EAAE,GAAG,KAAI,OAAO,EAAE,CAAC,CAAC,OAAO,SAAS,CAAC,CAAA,CAAC,EAAC,CAAC,CAAC;IACtG,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,IAAI,EAAE,EAAE,EAAC,OAAO,KAAI,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAA,CAAC,EAAC,CAAC,CAAC;IACrE,KAAK,MAAM,KAAK,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAC,OAAO,EAAE,IAAI,EAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;QAC3F,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,+BAA+B,CAAC,KAAK,CAAC,EAAE,EAAC,OAAO,EAAE,oCAAoC,EAAC,CAAC,CAAC;IAC/G,CAAC;IACD,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;AAC3B,CAAC,CAAC,CAAC"}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
1
|
import type { CodexAppServerTransport } from '@dharma-ai-labs/agent-fabric-provider-adapters/experimental/codex-session';
|
|
2
|
+
import type { BootstrapHostScope } from './bootstrapHostScope.js';
|
|
2
3
|
export declare function startNamedCodexThread(transport: CodexAppServerTransport, workspaceRoot: string, name: string): Promise<string>;
|
|
4
|
+
export declare function startNamedCodexSetupThread(transport: CodexAppServerTransport, workspaceRoot: string, name: string, scope: BootstrapHostScope): Promise<string>;
|
|
3
5
|
//# sourceMappingURL=namedCodexThread.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"namedCodexThread.d.ts","sourceRoot":"","sources":["../src/namedCodexThread.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,2EAA2E,CAAC;AAGzH,wBAAsB,qBAAqB,CAAC,SAAS,EAAE,uBAAuB,EAAE,aAAa,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"namedCodexThread.d.ts","sourceRoot":"","sources":["../src/namedCodexThread.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,2EAA2E,CAAC;AAGzH,OAAO,KAAK,EAAC,kBAAkB,EAAC,MAAM,yBAAyB,CAAC;AAEhE,wBAAsB,qBAAqB,CAAC,SAAS,EAAE,uBAAuB,EAAE,aAAa,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,mBAElH;AAED,wBAAsB,0BAA0B,CAAC,SAAS,EAAE,uBAAuB,EACjF,aAAa,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,kBAAkB,mBAE/D"}
|
package/dist/namedCodexThread.js
CHANGED
|
@@ -1,19 +1,28 @@
|
|
|
1
1
|
import { isAbsolute, resolve } from 'node:path';
|
|
2
2
|
import { CODEX_PEER_TOOLS } from './codexPeerTools.js';
|
|
3
|
+
import { CODEX_SETUP_TOOL } from './codexSetupAdmission.js';
|
|
3
4
|
export async function startNamedCodexThread(transport, workspaceRoot, name) {
|
|
5
|
+
return startThread(transport, workspaceRoot, name);
|
|
6
|
+
}
|
|
7
|
+
export async function startNamedCodexSetupThread(transport, workspaceRoot, name, scope) {
|
|
8
|
+
return startThread(transport, workspaceRoot, name, scope);
|
|
9
|
+
}
|
|
10
|
+
async function startThread(transport, workspaceRoot, name, setupScope) {
|
|
11
|
+
const request = (method, params) => setupScope
|
|
12
|
+
? setupScope.step(() => transport.request(method, params)) : transport.request(method, params);
|
|
4
13
|
if (!/^[a-z][a-z0-9-]{0,47}$/.test(name) || !isAbsolute(workspaceRoot) || resolve(workspaceRoot) !== workspaceRoot) {
|
|
5
14
|
throw new Error('named_session_thread_invalid');
|
|
6
15
|
}
|
|
7
|
-
const created = await
|
|
16
|
+
const created = await request('thread/start', { cwd: workspaceRoot,
|
|
8
17
|
approvalPolicy: 'never', permissions: 'dharma_bridge', ephemeral: false,
|
|
9
|
-
dynamicTools: CODEX_PEER_TOOLS });
|
|
18
|
+
dynamicTools: setupScope ? structuredClone([...CODEX_PEER_TOOLS, CODEX_SETUP_TOOL]) : CODEX_PEER_TOOLS });
|
|
10
19
|
const thread = created?.thread;
|
|
11
20
|
if (!thread || typeof thread.id !== 'string' || !/^[A-Za-z0-9_-]{1,128}$/.test(thread.id)
|
|
12
21
|
|| thread.cwd !== workspaceRoot || thread.status?.type !== 'idle')
|
|
13
22
|
throw new Error('named_session_thread_invalid');
|
|
14
23
|
// Codex lazily persists an empty rollout; its supported naming call flushes it before remote registration.
|
|
15
|
-
await
|
|
16
|
-
const read = await
|
|
24
|
+
await request('thread/name/set', { threadId: thread.id, name });
|
|
25
|
+
const read = await request('thread/read', { threadId: thread.id, includeTurns: false });
|
|
17
26
|
if (read?.thread?.id !== thread.id || read.thread.cwd !== workspaceRoot || read.thread.name !== name
|
|
18
27
|
|| read.thread.status?.type !== 'idle')
|
|
19
28
|
throw new Error('named_session_thread_invalid');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"namedCodexThread.js","sourceRoot":"","sources":["../src/namedCodexThread.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEhD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"namedCodexThread.js","sourceRoot":"","sources":["../src/namedCodexThread.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEhD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAG5D,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,SAAkC,EAAE,aAAqB,EAAE,IAAY;IACjH,OAAO,WAAW,CAAC,SAAS,EAAE,aAAa,EAAE,IAAI,CAAC,CAAC;AACrD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAAC,SAAkC,EACjF,aAAqB,EAAE,IAAY,EAAE,KAAyB;IAC9D,OAAO,WAAW,CAAC,SAAS,EAAE,aAAa,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;AAC5D,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,SAAkC,EAAE,aAAqB,EAClF,IAAY,EAAE,UAA+B;IAC7C,MAAM,OAAO,GAAG,CAAC,MAAc,EAAE,MAA+B,EAAE,EAAE,CAAC,UAAU;QAC7E,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjG,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,IAAI,OAAO,CAAC,aAAa,CAAC,KAAK,aAAa,EAAE,CAAC;QACnH,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAClD,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,cAAc,EAAE,EAAE,GAAG,EAAE,aAAa;QAChE,cAAc,EAAE,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,SAAS,EAAE,KAAK;QACvE,YAAY,EAAE,UAAU,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,GAAG,gBAAgB,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,gBAAgB,EAAE,CAA2E,CAAC;IACtL,MAAM,MAAM,GAAG,OAAO,EAAE,MAAM,CAAC;IAC/B,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,CAAC,EAAE,KAAK,QAAQ,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;WACpF,MAAM,CAAC,GAAG,KAAK,aAAa,IAAI,MAAM,CAAC,MAAM,EAAE,IAAI,KAAK,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;IACrH,2GAA2G;IAC3G,MAAM,OAAO,CAAC,iBAAiB,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;IAChE,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,aAAa,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,CAErF,CAAC;IACF,IAAI,IAAI,EAAE,MAAM,EAAE,EAAE,KAAK,MAAM,CAAC,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,KAAK,aAAa,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,IAAI;WAC/F,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,KAAK,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAC1F,OAAO,MAAM,CAAC,EAAE,CAAC;AACnB,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { ChildProcess } from 'node:child_process';
|
|
2
|
+
export interface NamedSessionChildOwner {
|
|
3
|
+
run<T>(operation: () => Promise<T>): Promise<T>;
|
|
4
|
+
assert(): void;
|
|
5
|
+
assertCaptured(name: string, child: ChildProcess): void;
|
|
6
|
+
ownedPid(name: string): number | null;
|
|
7
|
+
checkpoint(name: string): Readonly<{
|
|
8
|
+
stopFresh(): Promise<void>;
|
|
9
|
+
}>;
|
|
10
|
+
spawn(name: string, operation: () => ChildProcess): Promise<ChildProcess>;
|
|
11
|
+
close(): Promise<void>;
|
|
12
|
+
}
|
|
13
|
+
/** Standing supervisor owns only handles returned by its own fresh spawns. */
|
|
14
|
+
export declare function createNamedSessionChildOwner(signal: AbortSignal): NamedSessionChildOwner;
|
|
15
|
+
/** Internal caller composition; no adoption from PID files or inventories. */
|
|
16
|
+
export declare function currentNamedSessionChildOwner(): NamedSessionChildOwner | undefined;
|
|
17
|
+
//# sourceMappingURL=namedSessionChildOwner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"namedSessionChildOwner.d.ts","sourceRoot":"","sources":["../src/namedSessionChildOwner.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,oBAAoB,CAAC;AAOrD,MAAM,WAAW,sBAAsB;IACrC,GAAG,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAChD,MAAM,IAAI,IAAI,CAAC;IACf,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,GAAG,IAAI,CAAC;IACxD,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IACtC,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,CAAC;QAAC,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;KAAC,CAAC,CAAC;IACjE,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAC1E,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,8EAA8E;AAC9E,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,WAAW,GAAG,sBAAsB,CAyFxF;AAED,8EAA8E;AAC9E,wBAAgB,6BAA6B,uCAA+B"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { AsyncLocalStorage } from 'node:async_hooks';
|
|
2
|
+
import { watchOwnedChild } from './ownedChildLifecycle.js';
|
|
3
|
+
const context = new AsyncLocalStorage();
|
|
4
|
+
const owners = new WeakMap();
|
|
5
|
+
/** Standing supervisor owns only handles returned by its own fresh spawns. */
|
|
6
|
+
export function createNamedSessionChildOwner(signal) {
|
|
7
|
+
const children = new Map();
|
|
8
|
+
const pending = new Set(), acquisitions = new Set();
|
|
9
|
+
let active = true, borrowed = false, closing;
|
|
10
|
+
const stop = (entry) => entry.lifecycle.stopped ? Promise.resolve() : entry.stopping ??= entry.lifecycle.stop();
|
|
11
|
+
const abort = () => {
|
|
12
|
+
active = false;
|
|
13
|
+
for (const entry of children.values())
|
|
14
|
+
void stop(entry).catch(() => { });
|
|
15
|
+
};
|
|
16
|
+
const assertDispatch = () => {
|
|
17
|
+
if (context.getStore() !== owner || !borrowed || !active || signal.aborted) {
|
|
18
|
+
throw new Error('named_session_child_owner_unavailable');
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
const owner = {
|
|
22
|
+
assert: assertDispatch,
|
|
23
|
+
assertCaptured(name, child) {
|
|
24
|
+
assertDispatch();
|
|
25
|
+
const entry = children.get(name);
|
|
26
|
+
if (!entry || entry.child !== child || owners.get(child) !== owner || entry.lifecycle.stopped
|
|
27
|
+
|| entry.lifecycle.failed || entry.stopping)
|
|
28
|
+
throw new Error('named_session_child_owner_unavailable');
|
|
29
|
+
},
|
|
30
|
+
checkpoint(name) {
|
|
31
|
+
assertDispatch();
|
|
32
|
+
if (!/^[a-z][a-z0-9-]{0,47}$/.test(name))
|
|
33
|
+
throw new Error('named_session_child_owner_conflict');
|
|
34
|
+
const previous = children.get(name);
|
|
35
|
+
return Object.freeze({ async stopFresh() {
|
|
36
|
+
const entry = children.get(name);
|
|
37
|
+
// Limited cooperative cleanup uses captured handles, never PID lookup.
|
|
38
|
+
// Preserve any child that preceded this request and all sibling names.
|
|
39
|
+
if (entry && entry !== previous)
|
|
40
|
+
await stop(entry);
|
|
41
|
+
} });
|
|
42
|
+
},
|
|
43
|
+
ownedPid(name) {
|
|
44
|
+
assertDispatch();
|
|
45
|
+
const entry = children.get(name);
|
|
46
|
+
return entry && !entry.lifecycle.stopped && !entry.lifecycle.failed && !entry.stopping
|
|
47
|
+
&& Number.isSafeInteger(entry.child.pid) ? entry.child.pid : null;
|
|
48
|
+
},
|
|
49
|
+
async run(operation) {
|
|
50
|
+
if (context.getStore() || borrowed || !active || signal.aborted)
|
|
51
|
+
throw new Error('named_session_child_owner_unavailable');
|
|
52
|
+
borrowed = true;
|
|
53
|
+
try {
|
|
54
|
+
return await context.run(owner, operation);
|
|
55
|
+
}
|
|
56
|
+
finally {
|
|
57
|
+
borrowed = false;
|
|
58
|
+
await owner.close();
|
|
59
|
+
}
|
|
60
|
+
},
|
|
61
|
+
spawn(name, operation) {
|
|
62
|
+
const acquisition = (async () => {
|
|
63
|
+
assertDispatch();
|
|
64
|
+
if (!/^[a-z][a-z0-9-]{0,47}$/.test(name) || pending.has(name))
|
|
65
|
+
throw new Error('named_session_child_owner_conflict');
|
|
66
|
+
pending.add(name);
|
|
67
|
+
try {
|
|
68
|
+
for (const [key, entry] of children)
|
|
69
|
+
if (entry.lifecycle.stopped)
|
|
70
|
+
children.delete(key);
|
|
71
|
+
const prior = children.get(name);
|
|
72
|
+
if (prior) {
|
|
73
|
+
if (prior.lifecycle.failed || prior.stopping)
|
|
74
|
+
await stop(prior);
|
|
75
|
+
if (!prior.lifecycle.stopped)
|
|
76
|
+
throw new Error('named_session_owned_child_still_running');
|
|
77
|
+
children.delete(name);
|
|
78
|
+
}
|
|
79
|
+
if (children.size >= 50)
|
|
80
|
+
throw new Error('named_session_child_owner_capacity');
|
|
81
|
+
assertDispatch();
|
|
82
|
+
const child = operation();
|
|
83
|
+
// Capture before post-dispatch refusal, including synchronous abort.
|
|
84
|
+
if (owners.has(child))
|
|
85
|
+
throw new Error('named_session_child_owner_conflict');
|
|
86
|
+
const entry = { child, lifecycle: watchOwnedChild(child) };
|
|
87
|
+
owners.set(child, owner);
|
|
88
|
+
children.set(name, entry);
|
|
89
|
+
if (!active || signal.aborted)
|
|
90
|
+
void stop(entry).catch(() => { });
|
|
91
|
+
assertDispatch();
|
|
92
|
+
return child;
|
|
93
|
+
}
|
|
94
|
+
finally {
|
|
95
|
+
pending.delete(name);
|
|
96
|
+
}
|
|
97
|
+
})();
|
|
98
|
+
acquisitions.add(acquisition);
|
|
99
|
+
void acquisition.then(() => acquisitions.delete(acquisition), () => acquisitions.delete(acquisition));
|
|
100
|
+
return acquisition;
|
|
101
|
+
},
|
|
102
|
+
close() {
|
|
103
|
+
active = false;
|
|
104
|
+
signal.removeEventListener('abort', abort);
|
|
105
|
+
return closing ??= (async () => {
|
|
106
|
+
// Include a handle acquired while close was called inside its spawn.
|
|
107
|
+
await Promise.allSettled([...acquisitions]);
|
|
108
|
+
const results = await Promise.allSettled([...children.values()].map(stop));
|
|
109
|
+
if (results.some(result => result.status === 'rejected'))
|
|
110
|
+
throw new Error('owned_child_stop_unconfirmed');
|
|
111
|
+
})();
|
|
112
|
+
},
|
|
113
|
+
};
|
|
114
|
+
Object.freeze(owner);
|
|
115
|
+
signal.addEventListener('abort', abort, { once: true });
|
|
116
|
+
if (signal.aborted)
|
|
117
|
+
abort();
|
|
118
|
+
return owner;
|
|
119
|
+
}
|
|
120
|
+
/** Internal caller composition; no adoption from PID files or inventories. */
|
|
121
|
+
export function currentNamedSessionChildOwner() { return context.getStore(); }
|
|
122
|
+
//# sourceMappingURL=namedSessionChildOwner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"namedSessionChildOwner.js","sourceRoot":"","sources":["../src/namedSessionChildOwner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"namedSessionChildOwner.test.d.ts","sourceRoot":"","sources":["../src/namedSessionChildOwner.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
import assert from 'node:assert/strict';
|
|
2
|
+
import { AsyncResource } from 'node:async_hooks';
|
|
3
|
+
import { execFileSync, spawn } from 'node:child_process';
|
|
4
|
+
import { EventEmitter } from 'node:events';
|
|
5
|
+
import { mkdtemp, readFile, realpath, rm } from 'node:fs/promises';
|
|
6
|
+
import { tmpdir } from 'node:os';
|
|
7
|
+
import { resolve } from 'node:path';
|
|
8
|
+
import { compileFunction } from 'node:vm';
|
|
9
|
+
import test from 'node:test';
|
|
10
|
+
import ts from 'typescript';
|
|
11
|
+
import { createNamedSessionChildOwner, currentNamedSessionChildOwner } from './namedSessionChildOwner.js';
|
|
12
|
+
import { watchOwnedChild } from './ownedChildLifecycle.js';
|
|
13
|
+
class FakeChild extends EventEmitter {
|
|
14
|
+
pid = 101;
|
|
15
|
+
exitCode = null;
|
|
16
|
+
signalCode = null;
|
|
17
|
+
signals = [];
|
|
18
|
+
finishOnKill = true;
|
|
19
|
+
kill(signal) {
|
|
20
|
+
this.signals.push(signal);
|
|
21
|
+
if (this.finishOnKill)
|
|
22
|
+
queueMicrotask(() => this.finish());
|
|
23
|
+
return true;
|
|
24
|
+
}
|
|
25
|
+
finish() { this.exitCode = 0; this.emit('exit', 0); this.emit('close', 0); }
|
|
26
|
+
get handle() { return this; }
|
|
27
|
+
}
|
|
28
|
+
test('standing owner serializes each name and refuses replacement of a still-live child', async () => {
|
|
29
|
+
const owner = createNamedSessionChildOwner(new AbortController().signal), child = new FakeChild();
|
|
30
|
+
let replacements = 0;
|
|
31
|
+
await owner.run(async () => {
|
|
32
|
+
assert.equal(currentNamedSessionChildOwner(), owner);
|
|
33
|
+
await owner.spawn('reviewer', () => child.handle);
|
|
34
|
+
await assert.rejects(owner.spawn('reviewer', () => { replacements++; return new FakeChild().handle; }), /still_running/);
|
|
35
|
+
});
|
|
36
|
+
assert.equal(replacements, 0);
|
|
37
|
+
assert.deepEqual(child.signals, ['SIGTERM']);
|
|
38
|
+
assert.equal(currentNamedSessionChildOwner(), undefined);
|
|
39
|
+
});
|
|
40
|
+
test('standing owner waits for confirmed errored-child exit before admitting its replacement', async () => {
|
|
41
|
+
const owner = createNamedSessionChildOwner(new AbortController().signal), first = new FakeChild(), second = new FakeChild();
|
|
42
|
+
first.finishOnKill = false;
|
|
43
|
+
let replacements = 0;
|
|
44
|
+
await owner.run(async () => {
|
|
45
|
+
await owner.spawn('reviewer', () => first.handle);
|
|
46
|
+
first.emit('error', new Error('synthetic send failure'));
|
|
47
|
+
const replacing = owner.spawn('reviewer', () => { replacements++; return second.handle; });
|
|
48
|
+
await Promise.resolve();
|
|
49
|
+
assert.equal(replacements, 0);
|
|
50
|
+
assert.deepEqual(first.signals, ['SIGTERM']);
|
|
51
|
+
first.finish();
|
|
52
|
+
await replacing;
|
|
53
|
+
});
|
|
54
|
+
assert.equal(replacements, 1);
|
|
55
|
+
assert.deepEqual(second.signals, ['SIGTERM']);
|
|
56
|
+
});
|
|
57
|
+
test('standing owner rejects duplicate concurrent admission while prior stop is pending', async () => {
|
|
58
|
+
const owner = createNamedSessionChildOwner(new AbortController().signal), first = new FakeChild();
|
|
59
|
+
first.finishOnKill = false;
|
|
60
|
+
let spawns = 0;
|
|
61
|
+
await owner.run(async () => {
|
|
62
|
+
await owner.spawn('reviewer', () => first.handle);
|
|
63
|
+
first.emit('error', new Error('synthetic failure'));
|
|
64
|
+
const replacing = owner.spawn('reviewer', () => { spawns++; return new FakeChild().handle; });
|
|
65
|
+
await assert.rejects(owner.spawn('reviewer', () => { spawns++; return new FakeChild().handle; }), /owner_conflict/);
|
|
66
|
+
first.finish();
|
|
67
|
+
await replacing;
|
|
68
|
+
});
|
|
69
|
+
assert.equal(spawns, 1);
|
|
70
|
+
});
|
|
71
|
+
for (const action of ['abort', 'close']) {
|
|
72
|
+
test(`standing owner captures and drains a child when ${action} occurs inside synchronous spawn`, async () => {
|
|
73
|
+
const signal = new AbortController(), owner = createNamedSessionChildOwner(signal.signal), child = new FakeChild();
|
|
74
|
+
await assert.rejects(owner.run(() => owner.spawn('reviewer', () => {
|
|
75
|
+
if (action === 'abort')
|
|
76
|
+
signal.abort();
|
|
77
|
+
else
|
|
78
|
+
void owner.close();
|
|
79
|
+
return child.handle;
|
|
80
|
+
})), /owner_unavailable/);
|
|
81
|
+
assert.equal(child.exitCode, 0);
|
|
82
|
+
assert.deepEqual(child.signals, ['SIGTERM']);
|
|
83
|
+
await owner.close();
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
test('standing owner does not adopt another owner child, and does not signal an unrelated handle', async () => {
|
|
87
|
+
const first = createNamedSessionChildOwner(new AbortController().signal), child = new FakeChild(), unrelated = new FakeChild();
|
|
88
|
+
const second = createNamedSessionChildOwner(new AbortController().signal);
|
|
89
|
+
const outside = new AsyncResource('synthetic-unscoped-owner');
|
|
90
|
+
await first.run(async () => {
|
|
91
|
+
await first.spawn('reviewer', () => child.handle);
|
|
92
|
+
await assert.rejects(outside.runInAsyncScope(() => second.run(() => second.spawn('reviewer', () => child.handle))), /owner_conflict/);
|
|
93
|
+
assert.equal(child.signals.length, 0);
|
|
94
|
+
});
|
|
95
|
+
outside.emitDestroy();
|
|
96
|
+
assert.deepEqual(unrelated.signals, []);
|
|
97
|
+
});
|
|
98
|
+
test('standing owner refuses late detached spawn after its operation has settled', async () => {
|
|
99
|
+
const owner = createNamedSessionChildOwner(new AbortController().signal);
|
|
100
|
+
let late, effects = 0;
|
|
101
|
+
await owner.run(async () => { late = () => owner.spawn('reviewer', () => { effects++; return new FakeChild().handle; }); });
|
|
102
|
+
await assert.rejects(late(), /owner_unavailable/);
|
|
103
|
+
assert.equal(effects, 0);
|
|
104
|
+
});
|
|
105
|
+
test('standing owner releases admission after synchronous spawn failure without hiding uncertainty', async () => {
|
|
106
|
+
const owner = createNamedSessionChildOwner(new AbortController().signal), child = new FakeChild();
|
|
107
|
+
await owner.run(async () => {
|
|
108
|
+
await assert.rejects(owner.spawn('reviewer', () => { throw new Error('synthetic spawn failure'); }), /spawn failure/);
|
|
109
|
+
await owner.spawn('reviewer', () => child.handle);
|
|
110
|
+
});
|
|
111
|
+
assert.equal(child.exitCode, 0);
|
|
112
|
+
});
|
|
113
|
+
test('standing owner reports unconfirmed exit instead of settling successfully', async (t) => {
|
|
114
|
+
t.mock.timers.enable({ apis: ['setTimeout'] });
|
|
115
|
+
const signal = new AbortController(), owner = createNamedSessionChildOwner(signal.signal), child = new FakeChild();
|
|
116
|
+
child.finishOnKill = false;
|
|
117
|
+
const running = owner.run(async () => { await owner.spawn('reviewer', () => child.handle); signal.abort(); });
|
|
118
|
+
const outcome = assert.rejects(running, /owned_child_stop_unconfirmed/);
|
|
119
|
+
for (let i = 0; i < 12; i++)
|
|
120
|
+
await Promise.resolve();
|
|
121
|
+
t.mock.timers.tick(10_000);
|
|
122
|
+
for (let i = 0; i < 12; i++)
|
|
123
|
+
await Promise.resolve();
|
|
124
|
+
t.mock.timers.tick(10_000);
|
|
125
|
+
await outcome;
|
|
126
|
+
assert.deepEqual(child.signals, ['SIGTERM', 'SIGKILL']);
|
|
127
|
+
child.finish();
|
|
128
|
+
});
|
|
129
|
+
test('standing owner can recover an earlier stop failure only after actual exit is observed', async (t) => {
|
|
130
|
+
t.mock.timers.enable({ apis: ['setTimeout'] });
|
|
131
|
+
const owner = createNamedSessionChildOwner(new AbortController().signal), first = new FakeChild(), second = new FakeChild();
|
|
132
|
+
first.finishOnKill = false;
|
|
133
|
+
await owner.run(async () => {
|
|
134
|
+
await owner.spawn('reviewer', () => first.handle);
|
|
135
|
+
first.emit('error', new Error('synthetic error'));
|
|
136
|
+
const replacement = owner.spawn('reviewer', () => second.handle);
|
|
137
|
+
const failure = assert.rejects(replacement, /owned_child_stop_unconfirmed/);
|
|
138
|
+
for (let i = 0; i < 12; i++)
|
|
139
|
+
await Promise.resolve();
|
|
140
|
+
t.mock.timers.tick(10_000);
|
|
141
|
+
for (let i = 0; i < 12; i++)
|
|
142
|
+
await Promise.resolve();
|
|
143
|
+
t.mock.timers.tick(10_000);
|
|
144
|
+
await failure;
|
|
145
|
+
assert.deepEqual(second.signals, []);
|
|
146
|
+
first.finish();
|
|
147
|
+
await owner.spawn('reviewer', () => second.handle);
|
|
148
|
+
});
|
|
149
|
+
assert.equal(second.exitCode, 0);
|
|
150
|
+
});
|
|
151
|
+
test('standing owner enforces the bounded live-child capacity without spawning a fifty-first child', async () => {
|
|
152
|
+
const owner = createNamedSessionChildOwner(new AbortController().signal), children = [];
|
|
153
|
+
let extra = 0;
|
|
154
|
+
await owner.run(async () => {
|
|
155
|
+
for (let i = 0; i < 50; i++) {
|
|
156
|
+
const child = new FakeChild();
|
|
157
|
+
children.push(child);
|
|
158
|
+
await owner.spawn(`session-${i}`, () => child.handle);
|
|
159
|
+
}
|
|
160
|
+
await assert.rejects(owner.spawn('session-overflow', () => { extra++; return new FakeChild().handle; }), /owner_capacity/);
|
|
161
|
+
});
|
|
162
|
+
assert.equal(extra, 0);
|
|
163
|
+
assert.equal(children.filter(child => child.exitCode === 0).length, 50);
|
|
164
|
+
});
|
|
165
|
+
test('actual supervisor declaration drains its fresh C-only session child before returning', async (t) => {
|
|
166
|
+
const root = await realpath(await mkdtemp(resolve(tmpdir(), 'dharma-standing-session-'))), signal = new AbortController();
|
|
167
|
+
let child;
|
|
168
|
+
t.after(async () => { signal.abort(); if (child)
|
|
169
|
+
await watchOwnedChild(child).stop({ graceMs: 1000 }); await rm(root, { recursive: true, force: true }); });
|
|
170
|
+
const baseline = process.env.DHARMA_SUPERVISOR_BASELINE_SHA;
|
|
171
|
+
if (baseline && !/^[a-f0-9]{40}$/.test(baseline))
|
|
172
|
+
throw new Error('fixture_baseline_invalid');
|
|
173
|
+
const source = baseline ? execFileSync('git', ['show', `${baseline}:packages/cli/src/index.ts`], { encoding: 'utf8' })
|
|
174
|
+
: await readFile(new URL('../src/index.ts', import.meta.url), 'utf8');
|
|
175
|
+
const ast = ts.createSourceFile('index.ts', source, ts.ScriptTarget.Latest, true);
|
|
176
|
+
const functions = ast.statements.filter(node => ts.isFunctionDeclaration(node) && node.name?.text === 'superviseNamedSessions');
|
|
177
|
+
assert.equal(functions.length, 1);
|
|
178
|
+
const output = ts.transpileModule(functions[0].getText(ast), { compilerOptions: {
|
|
179
|
+
target: ts.ScriptTarget.ES2023, module: ts.ModuleKind.CommonJS
|
|
180
|
+
}, reportDiagnostics: true });
|
|
181
|
+
assert.equal(output.diagnostics?.filter(d => d.category === ts.DiagnosticCategory.Error).length, 0);
|
|
182
|
+
const dependencies = { process: { platform: 'linux', stderr: { write: () => { } } }, createNamedSessionChildOwner,
|
|
183
|
+
resolve, dharmaHome: () => root, setTimeout, clearTimeout,
|
|
184
|
+
access: async () => { throw Object.assign(new Error('synthetic vault absent'), { code: 'ENOENT' }); },
|
|
185
|
+
readdir: async () => [{ name: 'reviewer', isDirectory: () => true }],
|
|
186
|
+
readNamedSession: async () => ({ enabled: true, name: 'reviewer', identity: { workspaceId: 'synthetic_workspace' } }),
|
|
187
|
+
namedSessionCommand: async (action, flags) => {
|
|
188
|
+
assert.equal(action, 'start');
|
|
189
|
+
assert.equal(flags.get('name'), 'reviewer');
|
|
190
|
+
assert.equal(flags.get('workspace-id'), 'synthetic_workspace');
|
|
191
|
+
assert.equal(flags.get('apply'), true);
|
|
192
|
+
const owner = currentNamedSessionChildOwner();
|
|
193
|
+
const start = () => spawn(process.execPath, ['-e', 'setInterval(() => {}, 1000)'], { cwd: root, stdio: 'ignore' });
|
|
194
|
+
child = owner ? await owner.spawn('reviewer', start) : start();
|
|
195
|
+
signal.abort();
|
|
196
|
+
return { ok: true };
|
|
197
|
+
} };
|
|
198
|
+
const supervise = compileFunction(output.outputText + '\nreturn superviseNamedSessions;', ['exports', ...Object.keys(dependencies)])({}, ...Object.values(dependencies));
|
|
199
|
+
await supervise(signal.signal);
|
|
200
|
+
assert.ok(child);
|
|
201
|
+
assert.ok(child.exitCode !== null || child.signalCode !== null);
|
|
202
|
+
});
|
|
203
|
+
//# sourceMappingURL=namedSessionChildOwner.test.js.map
|