@braidhq/server 0.0.1 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +164 -0
- package/dist/app.d.ts +12 -3
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +154 -9
- package/dist/app.js.map +1 -1
- package/dist/authMode.d.ts +39 -0
- package/dist/authMode.d.ts.map +1 -0
- package/dist/authMode.js +50 -0
- package/dist/authMode.js.map +1 -0
- package/dist/composeApp.d.ts +79 -0
- package/dist/composeApp.d.ts.map +1 -0
- package/dist/composeApp.js +136 -0
- package/dist/composeApp.js.map +1 -0
- package/dist/composeFsApp.d.ts +27 -0
- package/dist/composeFsApp.d.ts.map +1 -0
- package/dist/composeFsApp.js +309 -0
- package/dist/composeFsApp.js.map +1 -0
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/dist/infrastructure/_shared/env.d.ts +10 -0
- package/dist/infrastructure/_shared/env.d.ts.map +1 -0
- package/dist/infrastructure/_shared/env.js +19 -0
- package/dist/infrastructure/_shared/env.js.map +1 -0
- package/dist/infrastructure/_shared/frontmatter.d.ts +13 -0
- package/dist/infrastructure/_shared/frontmatter.d.ts.map +1 -0
- package/dist/infrastructure/{fs → _shared}/frontmatter.js +5 -5
- package/dist/infrastructure/_shared/frontmatter.js.map +1 -0
- package/dist/infrastructure/_shared/jsonFileStore.d.ts.map +1 -0
- package/dist/infrastructure/_shared/jsonFileStore.js.map +1 -0
- package/dist/infrastructure/_shared/paths.d.ts +43 -0
- package/dist/infrastructure/_shared/paths.d.ts.map +1 -0
- package/dist/infrastructure/_shared/paths.js +96 -0
- package/dist/infrastructure/_shared/paths.js.map +1 -0
- package/dist/infrastructure/auth/AccessPolicy.d.ts +87 -0
- package/dist/infrastructure/auth/AccessPolicy.d.ts.map +1 -0
- package/dist/infrastructure/auth/AccessPolicy.js +177 -0
- package/dist/infrastructure/auth/AccessPolicy.js.map +1 -0
- package/dist/infrastructure/auth/SessionStore.d.ts +50 -0
- package/dist/infrastructure/auth/SessionStore.d.ts.map +1 -0
- package/dist/infrastructure/auth/SessionStore.js +104 -0
- package/dist/infrastructure/auth/SessionStore.js.map +1 -0
- package/dist/infrastructure/batch/FsBatchPlanRepository.d.ts +79 -0
- package/dist/infrastructure/batch/FsBatchPlanRepository.d.ts.map +1 -0
- package/dist/infrastructure/batch/FsBatchPlanRepository.js +42 -0
- package/dist/infrastructure/batch/FsBatchPlanRepository.js.map +1 -0
- package/dist/infrastructure/history/GitWorkspaceHistory.d.ts +18 -0
- package/dist/infrastructure/history/GitWorkspaceHistory.d.ts.map +1 -0
- package/dist/infrastructure/history/GitWorkspaceHistory.js +310 -0
- package/dist/infrastructure/history/GitWorkspaceHistory.js.map +1 -0
- package/dist/infrastructure/history/commitMessage.d.ts +4 -0
- package/dist/infrastructure/history/commitMessage.d.ts.map +1 -0
- package/dist/infrastructure/history/commitMessage.js +90 -0
- package/dist/infrastructure/history/commitMessage.js.map +1 -0
- package/dist/infrastructure/hitl/FsClarificationRepository.d.ts +13 -0
- package/dist/infrastructure/hitl/FsClarificationRepository.d.ts.map +1 -0
- package/dist/infrastructure/hitl/FsClarificationRepository.js +39 -0
- package/dist/infrastructure/hitl/FsClarificationRepository.js.map +1 -0
- package/dist/infrastructure/hitl/FsProposalRepository.d.ts.map +1 -0
- package/dist/infrastructure/{fs → hitl}/FsProposalRepository.js +10 -3
- package/dist/infrastructure/hitl/FsProposalRepository.js.map +1 -0
- package/dist/infrastructure/hitl/StatusedJsonStore.d.ts +30 -0
- package/dist/infrastructure/hitl/StatusedJsonStore.d.ts.map +1 -0
- package/dist/infrastructure/{fs/FsStatusedJsonRepository.js → hitl/StatusedJsonStore.js} +3 -3
- package/dist/infrastructure/hitl/StatusedJsonStore.js.map +1 -0
- package/dist/infrastructure/model/FsModelSerializer.d.ts +96 -0
- package/dist/infrastructure/model/FsModelSerializer.d.ts.map +1 -0
- package/dist/infrastructure/model/FsModelSerializer.js +60 -0
- package/dist/infrastructure/model/FsModelSerializer.js.map +1 -0
- package/dist/infrastructure/oauth/GoogleOAuth.d.ts +43 -14
- package/dist/infrastructure/oauth/GoogleOAuth.d.ts.map +1 -1
- package/dist/infrastructure/oauth/GoogleOAuth.js +78 -11
- package/dist/infrastructure/oauth/GoogleOAuth.js.map +1 -1
- package/dist/infrastructure/reactor/FsReactorCycleRepository.d.ts +29 -0
- package/dist/infrastructure/reactor/FsReactorCycleRepository.d.ts.map +1 -0
- package/dist/infrastructure/reactor/FsReactorCycleRepository.js +94 -0
- package/dist/infrastructure/reactor/FsReactorCycleRepository.js.map +1 -0
- package/dist/infrastructure/secrets/SecretStore.d.ts +11 -14
- package/dist/infrastructure/secrets/SecretStore.d.ts.map +1 -1
- package/dist/infrastructure/secrets/SecretStore.js +4 -4
- package/dist/infrastructure/secrets/SecretStore.js.map +1 -1
- package/dist/infrastructure/{fs → skill}/FsRunRepository.d.ts +9 -4
- package/dist/infrastructure/skill/FsRunRepository.d.ts.map +1 -0
- package/dist/infrastructure/skill/FsRunRepository.js +162 -0
- package/dist/infrastructure/skill/FsRunRepository.js.map +1 -0
- package/dist/infrastructure/{fs → skill}/FsSkillRegistry.d.ts +4 -13
- package/dist/infrastructure/skill/FsSkillRegistry.d.ts.map +1 -0
- package/dist/infrastructure/{fs → skill}/FsSkillRegistry.js +38 -18
- package/dist/infrastructure/skill/FsSkillRegistry.js.map +1 -0
- package/dist/infrastructure/{agent → skill}/SubprocessSkillRunner.d.ts +13 -15
- package/dist/infrastructure/skill/SubprocessSkillRunner.d.ts.map +1 -0
- package/dist/infrastructure/{agent → skill}/SubprocessSkillRunner.js +124 -40
- package/dist/infrastructure/skill/SubprocessSkillRunner.js.map +1 -0
- package/dist/infrastructure/skill/asyncQueue.d.ts +20 -0
- package/dist/infrastructure/skill/asyncQueue.d.ts.map +1 -0
- package/dist/infrastructure/{agent → skill}/asyncQueue.js +2 -3
- package/dist/infrastructure/{agent → skill}/asyncQueue.js.map +1 -1
- package/dist/infrastructure/skill/lineBuffer.d.ts +15 -0
- package/dist/infrastructure/skill/lineBuffer.d.ts.map +1 -0
- package/dist/infrastructure/{agent/streamJsonParser.js → skill/lineBuffer.js} +5 -17
- package/dist/infrastructure/skill/lineBuffer.js.map +1 -0
- package/dist/infrastructure/skill/orphanReaper.d.ts +20 -0
- package/dist/infrastructure/skill/orphanReaper.d.ts.map +1 -0
- package/dist/infrastructure/{orphanReaper.js → skill/orphanReaper.js} +7 -5
- package/dist/infrastructure/skill/orphanReaper.js.map +1 -0
- package/dist/infrastructure/skill/subprocessEventStream.d.ts +16 -0
- package/dist/infrastructure/skill/subprocessEventStream.d.ts.map +1 -0
- package/dist/infrastructure/skill/subprocessEventStream.js +29 -0
- package/dist/infrastructure/skill/subprocessEventStream.js.map +1 -0
- package/dist/infrastructure/source/FsSourceUnitDigest.d.ts +19 -0
- package/dist/infrastructure/source/FsSourceUnitDigest.d.ts.map +1 -0
- package/dist/infrastructure/source/FsSourceUnitDigest.js +58 -0
- package/dist/infrastructure/source/FsSourceUnitDigest.js.map +1 -0
- package/dist/infrastructure/source/FsSourceUnitObservationRepository.d.ts +31 -0
- package/dist/infrastructure/source/FsSourceUnitObservationRepository.d.ts.map +1 -0
- package/dist/infrastructure/source/FsSourceUnitObservationRepository.js +88 -0
- package/dist/infrastructure/source/FsSourceUnitObservationRepository.js.map +1 -0
- package/dist/infrastructure/source/intentScan.d.ts +13 -0
- package/dist/infrastructure/source/intentScan.d.ts.map +1 -0
- package/dist/infrastructure/source/intentScan.js +137 -0
- package/dist/infrastructure/source/intentScan.js.map +1 -0
- package/dist/infrastructure/users/UserDirectoryFromRegistry.d.ts +14 -0
- package/dist/infrastructure/users/UserDirectoryFromRegistry.d.ts.map +1 -0
- package/dist/infrastructure/users/UserDirectoryFromRegistry.js +21 -0
- package/dist/infrastructure/users/UserDirectoryFromRegistry.js.map +1 -0
- package/dist/infrastructure/users/UserRegistryFile.d.ts +22 -0
- package/dist/infrastructure/users/UserRegistryFile.d.ts.map +1 -0
- package/dist/infrastructure/users/UserRegistryFile.js +89 -0
- package/dist/infrastructure/users/UserRegistryFile.js.map +1 -0
- package/dist/infrastructure/users/ensureWorkspaceOwners.d.ts +12 -0
- package/dist/infrastructure/users/ensureWorkspaceOwners.d.ts.map +1 -0
- package/dist/infrastructure/users/ensureWorkspaceOwners.js +25 -0
- package/dist/infrastructure/users/ensureWorkspaceOwners.js.map +1 -0
- package/dist/infrastructure/workspace/FsWorkspaceRepository.d.ts.map +1 -0
- package/dist/infrastructure/{fs → workspace}/FsWorkspaceRepository.js +15 -5
- package/dist/infrastructure/workspace/FsWorkspaceRepository.js.map +1 -0
- package/dist/infrastructure/workspace/WorkspaceDiscovery.d.ts +18 -0
- package/dist/infrastructure/workspace/WorkspaceDiscovery.d.ts.map +1 -0
- package/dist/infrastructure/workspace/WorkspaceDiscovery.js +50 -0
- package/dist/infrastructure/workspace/WorkspaceDiscovery.js.map +1 -0
- package/dist/infrastructure/workspace/WorkspaceRegistryFile.d.ts +42 -0
- package/dist/infrastructure/workspace/WorkspaceRegistryFile.d.ts.map +1 -0
- package/dist/infrastructure/workspace/WorkspaceRegistryFile.js +160 -0
- package/dist/infrastructure/workspace/WorkspaceRegistryFile.js.map +1 -0
- package/dist/infrastructure/workspace/productManifestWriter.d.ts +24 -0
- package/dist/infrastructure/workspace/productManifestWriter.d.ts.map +1 -0
- package/dist/infrastructure/{fs → workspace}/productManifestWriter.js +14 -28
- package/dist/infrastructure/workspace/productManifestWriter.js.map +1 -0
- package/dist/middleware/auth.d.ts +39 -0
- package/dist/middleware/auth.d.ts.map +1 -0
- package/dist/middleware/auth.js +87 -0
- package/dist/middleware/auth.js.map +1 -0
- package/dist/middleware/cors.d.ts.map +1 -1
- package/dist/middleware/cors.js +5 -2
- package/dist/middleware/cors.js.map +1 -1
- package/dist/middleware/error.d.ts.map +1 -1
- package/dist/middleware/error.js +15 -13
- package/dist/middleware/error.js.map +1 -1
- package/dist/middleware/workspaceAccess.d.ts +51 -0
- package/dist/middleware/workspaceAccess.d.ts.map +1 -0
- package/dist/middleware/workspaceAccess.js +91 -0
- package/dist/middleware/workspaceAccess.js.map +1 -0
- package/dist/policy/CapabilityCheck.d.ts +14 -0
- package/dist/policy/CapabilityCheck.d.ts.map +1 -0
- package/dist/policy/CapabilityCheck.js +2 -0
- package/dist/policy/CapabilityCheck.js.map +1 -0
- package/dist/policy/PermissionRegistry.d.ts +25 -0
- package/dist/policy/PermissionRegistry.d.ts.map +1 -0
- package/dist/policy/PermissionRegistry.js +29 -0
- package/dist/policy/PermissionRegistry.js.map +1 -0
- package/dist/policy/ViewerContext.d.ts +29 -0
- package/dist/policy/ViewerContext.d.ts.map +1 -0
- package/dist/policy/ViewerContext.js +2 -0
- package/dist/policy/ViewerContext.js.map +1 -0
- package/dist/policy/checks.d.ts +15 -0
- package/dist/policy/checks.d.ts.map +1 -0
- package/dist/policy/checks.js +55 -0
- package/dist/policy/checks.js.map +1 -0
- package/dist/policy/defaultRegistry.d.ts +9 -0
- package/dist/policy/defaultRegistry.d.ts.map +1 -0
- package/dist/policy/defaultRegistry.js +15 -0
- package/dist/policy/defaultRegistry.js.map +1 -0
- package/dist/policy/index.d.ts +8 -0
- package/dist/policy/index.d.ts.map +1 -0
- package/dist/policy/index.js +5 -0
- package/dist/policy/index.js.map +1 -0
- package/dist/policy/resolveViewer.d.ts +16 -0
- package/dist/policy/resolveViewer.d.ts.map +1 -0
- package/dist/policy/resolveViewer.js +37 -0
- package/dist/policy/resolveViewer.js.map +1 -0
- package/dist/routes/_shared.d.ts +138 -0
- package/dist/routes/_shared.d.ts.map +1 -0
- package/dist/routes/_shared.js +33 -0
- package/dist/routes/_shared.js.map +1 -0
- package/dist/routes/admin.d.ts +13 -0
- package/dist/routes/admin.d.ts.map +1 -0
- package/dist/routes/admin.js +228 -0
- package/dist/routes/admin.js.map +1 -0
- package/dist/routes/auth.d.ts +35 -0
- package/dist/routes/auth.d.ts.map +1 -0
- package/dist/routes/auth.js +168 -0
- package/dist/routes/auth.js.map +1 -0
- package/dist/routes/batch.d.ts +7 -0
- package/dist/routes/batch.d.ts.map +1 -0
- package/dist/routes/batch.js +47 -0
- package/dist/routes/batch.js.map +1 -0
- package/dist/routes/clarifications.d.ts +8 -0
- package/dist/routes/clarifications.d.ts.map +1 -0
- package/dist/routes/clarifications.js +243 -0
- package/dist/routes/clarifications.js.map +1 -0
- package/dist/routes/edges.d.ts +2 -2
- package/dist/routes/edges.d.ts.map +1 -1
- package/dist/routes/edges.js +34 -16
- package/dist/routes/edges.js.map +1 -1
- package/dist/routes/health.d.ts +2 -2
- package/dist/routes/health.d.ts.map +1 -1
- package/dist/routes/health.js +21 -3
- package/dist/routes/health.js.map +1 -1
- package/dist/routes/history.d.ts +7 -0
- package/dist/routes/history.d.ts.map +1 -0
- package/dist/routes/history.js +90 -0
- package/dist/routes/history.js.map +1 -0
- package/dist/routes/model.d.ts +2 -2
- package/dist/routes/model.d.ts.map +1 -1
- package/dist/routes/model.js +20 -4
- package/dist/routes/model.js.map +1 -1
- package/dist/routes/nodes.d.ts +2 -2
- package/dist/routes/nodes.d.ts.map +1 -1
- package/dist/routes/nodes.js +77 -25
- package/dist/routes/nodes.js.map +1 -1
- package/dist/routes/oauth.d.ts +6 -7
- package/dist/routes/oauth.d.ts.map +1 -1
- package/dist/routes/oauth.js +6 -7
- package/dist/routes/oauth.js.map +1 -1
- package/dist/routes/ontology.d.ts +2 -2
- package/dist/routes/ontology.d.ts.map +1 -1
- package/dist/routes/ontology.js +22 -5
- package/dist/routes/ontology.js.map +1 -1
- package/dist/routes/proposals.d.ts +5 -4
- package/dist/routes/proposals.d.ts.map +1 -1
- package/dist/routes/proposals.js +176 -45
- package/dist/routes/proposals.js.map +1 -1
- package/dist/routes/reactorCycles.d.ts +7 -0
- package/dist/routes/reactorCycles.d.ts.map +1 -0
- package/dist/routes/reactorCycles.js +60 -0
- package/dist/routes/reactorCycles.js.map +1 -0
- package/dist/routes/runs.d.ts.map +1 -1
- package/dist/routes/runs.js +66 -12
- package/dist/routes/runs.js.map +1 -1
- package/dist/routes/skillInputOptions.d.ts +10 -0
- package/dist/routes/skillInputOptions.d.ts.map +1 -0
- package/dist/routes/skillInputOptions.js +159 -0
- package/dist/routes/skillInputOptions.js.map +1 -0
- package/dist/routes/skills.d.ts +21 -3
- package/dist/routes/skills.d.ts.map +1 -1
- package/dist/routes/skills.js +223 -21
- package/dist/routes/skills.js.map +1 -1
- package/dist/routes/sourceLoaders.d.ts +7 -0
- package/dist/routes/sourceLoaders.d.ts.map +1 -0
- package/dist/routes/sourceLoaders.js +30 -0
- package/dist/routes/sourceLoaders.js.map +1 -0
- package/dist/routes/sourceUnitObservations.d.ts +20 -0
- package/dist/routes/sourceUnitObservations.d.ts.map +1 -0
- package/dist/routes/sourceUnitObservations.js +80 -0
- package/dist/routes/sourceUnitObservations.js.map +1 -0
- package/dist/routes/sourceWebhooks.d.ts +26 -0
- package/dist/routes/sourceWebhooks.d.ts.map +1 -0
- package/dist/routes/sourceWebhooks.js +301 -0
- package/dist/routes/sourceWebhooks.js.map +1 -0
- package/dist/routes/users.d.ts +7 -0
- package/dist/routes/users.d.ts.map +1 -0
- package/dist/routes/users.js +109 -0
- package/dist/routes/users.js.map +1 -0
- package/dist/routes/workspaceEvents.d.ts +5 -4
- package/dist/routes/workspaceEvents.d.ts.map +1 -1
- package/dist/routes/workspaceEvents.js +7 -6
- package/dist/routes/workspaceEvents.js.map +1 -1
- package/dist/routes/workspaceMembers.d.ts +11 -0
- package/dist/routes/workspaceMembers.d.ts.map +1 -0
- package/dist/routes/workspaceMembers.js +81 -0
- package/dist/routes/workspaceMembers.js.map +1 -0
- package/dist/routes/workspaces.d.ts +30 -1
- package/dist/routes/workspaces.d.ts.map +1 -1
- package/dist/routes/workspaces.js +207 -63
- package/dist/routes/workspaces.js.map +1 -1
- package/dist/server.js +9 -29
- package/dist/server.js.map +1 -1
- package/dist/startServer.d.ts +17 -0
- package/dist/startServer.d.ts.map +1 -0
- package/dist/startServer.js +81 -0
- package/dist/startServer.js.map +1 -0
- package/dist/startup.d.ts +28 -0
- package/dist/startup.d.ts.map +1 -0
- package/dist/startup.js +94 -0
- package/dist/startup.js.map +1 -0
- package/package.json +49 -32
- package/LICENSE +0 -21
- package/dist/composeFs.d.ts +0 -20
- package/dist/composeFs.d.ts.map +0 -1
- package/dist/composeFs.js +0 -134
- package/dist/composeFs.js.map +0 -1
- package/dist/composition.d.ts +0 -49
- package/dist/composition.d.ts.map +0 -1
- package/dist/composition.js +0 -43
- package/dist/composition.js.map +0 -1
- package/dist/infrastructure/agent/ClaudeCodeAgentBinding.d.ts +0 -8
- package/dist/infrastructure/agent/ClaudeCodeAgentBinding.d.ts.map +0 -1
- package/dist/infrastructure/agent/ClaudeCodeAgentBinding.js +0 -62
- package/dist/infrastructure/agent/ClaudeCodeAgentBinding.js.map +0 -1
- package/dist/infrastructure/agent/SubprocessSkillRunner.d.ts.map +0 -1
- package/dist/infrastructure/agent/SubprocessSkillRunner.js.map +0 -1
- package/dist/infrastructure/agent/asyncQueue.d.ts +0 -22
- package/dist/infrastructure/agent/asyncQueue.d.ts.map +0 -1
- package/dist/infrastructure/agent/mcpConfig.d.ts +0 -18
- package/dist/infrastructure/agent/mcpConfig.d.ts.map +0 -1
- package/dist/infrastructure/agent/mcpConfig.js +0 -47
- package/dist/infrastructure/agent/mcpConfig.js.map +0 -1
- package/dist/infrastructure/agent/streamJsonParser.d.ts +0 -20
- package/dist/infrastructure/agent/streamJsonParser.d.ts.map +0 -1
- package/dist/infrastructure/agent/streamJsonParser.js.map +0 -1
- package/dist/infrastructure/agent/subprocessEventStream.d.ts +0 -26
- package/dist/infrastructure/agent/subprocessEventStream.d.ts.map +0 -1
- package/dist/infrastructure/agent/subprocessEventStream.js +0 -112
- package/dist/infrastructure/agent/subprocessEventStream.js.map +0 -1
- package/dist/infrastructure/fs/FsClarifyTicketRepository.d.ts +0 -13
- package/dist/infrastructure/fs/FsClarifyTicketRepository.d.ts.map +0 -1
- package/dist/infrastructure/fs/FsClarifyTicketRepository.js +0 -33
- package/dist/infrastructure/fs/FsClarifyTicketRepository.js.map +0 -1
- package/dist/infrastructure/fs/FsDecisionRepository.d.ts +0 -13
- package/dist/infrastructure/fs/FsDecisionRepository.d.ts.map +0 -1
- package/dist/infrastructure/fs/FsDecisionRepository.js +0 -56
- package/dist/infrastructure/fs/FsDecisionRepository.js.map +0 -1
- package/dist/infrastructure/fs/FsProposalRepository.d.ts.map +0 -1
- package/dist/infrastructure/fs/FsProposalRepository.js.map +0 -1
- package/dist/infrastructure/fs/FsRunRepository.d.ts.map +0 -1
- package/dist/infrastructure/fs/FsRunRepository.js +0 -88
- package/dist/infrastructure/fs/FsRunRepository.js.map +0 -1
- package/dist/infrastructure/fs/FsSkillRegistry.d.ts.map +0 -1
- package/dist/infrastructure/fs/FsSkillRegistry.js.map +0 -1
- package/dist/infrastructure/fs/FsStatusedJsonRepository.d.ts +0 -35
- package/dist/infrastructure/fs/FsStatusedJsonRepository.d.ts.map +0 -1
- package/dist/infrastructure/fs/FsStatusedJsonRepository.js.map +0 -1
- package/dist/infrastructure/fs/FsWorkspaceRepository.d.ts.map +0 -1
- package/dist/infrastructure/fs/FsWorkspaceRepository.js.map +0 -1
- package/dist/infrastructure/fs/WorkspaceRegistryFile.d.ts +0 -17
- package/dist/infrastructure/fs/WorkspaceRegistryFile.d.ts.map +0 -1
- package/dist/infrastructure/fs/WorkspaceRegistryFile.js +0 -58
- package/dist/infrastructure/fs/WorkspaceRegistryFile.js.map +0 -1
- package/dist/infrastructure/fs/frontmatter.d.ts +0 -13
- package/dist/infrastructure/fs/frontmatter.d.ts.map +0 -1
- package/dist/infrastructure/fs/frontmatter.js.map +0 -1
- package/dist/infrastructure/fs/jsonFileStore.d.ts.map +0 -1
- package/dist/infrastructure/fs/jsonFileStore.js.map +0 -1
- package/dist/infrastructure/fs/paths.d.ts +0 -22
- package/dist/infrastructure/fs/paths.d.ts.map +0 -1
- package/dist/infrastructure/fs/paths.js +0 -46
- package/dist/infrastructure/fs/paths.js.map +0 -1
- package/dist/infrastructure/fs/productManifestWriter.d.ts +0 -22
- package/dist/infrastructure/fs/productManifestWriter.d.ts.map +0 -1
- package/dist/infrastructure/fs/productManifestWriter.js.map +0 -1
- package/dist/infrastructure/orphanReaper.d.ts +0 -18
- package/dist/infrastructure/orphanReaper.d.ts.map +0 -1
- package/dist/infrastructure/orphanReaper.js.map +0 -1
- package/dist/routes/clarify.d.ts +0 -8
- package/dist/routes/clarify.d.ts.map +0 -1
- package/dist/routes/clarify.js +0 -84
- package/dist/routes/clarify.js.map +0 -1
- package/dist/routes/decisions.d.ts +0 -7
- package/dist/routes/decisions.d.ts.map +0 -1
- package/dist/routes/decisions.js +0 -30
- package/dist/routes/decisions.js.map +0 -1
- /package/dist/infrastructure/{fs → _shared}/jsonFileStore.d.ts +0 -0
- /package/dist/infrastructure/{fs → _shared}/jsonFileStore.js +0 -0
- /package/dist/infrastructure/{fs → hitl}/FsProposalRepository.d.ts +0 -0
- /package/dist/infrastructure/{fs → workspace}/FsWorkspaceRepository.d.ts +0 -0
|
@@ -1,18 +1,17 @@
|
|
|
1
|
-
import { mkdir, rm, symlink } from 'node:fs/promises';
|
|
1
|
+
import { mkdir, rm, symlink, writeFile } from 'node:fs/promises';
|
|
2
2
|
import { dirname, join } from 'node:path';
|
|
3
3
|
import { newSkillRunId, NotFoundError } from '@braidhq/core';
|
|
4
|
-
import { AbsolutePath as AbsolutePathSchema, SkillEvent as SkillEventSchema, SkillRunId as SkillRunIdSchema, } from '@braidhq/schema';
|
|
5
|
-
import { sessionDirPath } from '../
|
|
4
|
+
import { AbsolutePath as AbsolutePathSchema, McpServerId, SkillEvent as SkillEventSchema, SkillRunId as SkillRunIdSchema, splitSkillId } from '@braidhq/schema';
|
|
5
|
+
import { sessionDirPath } from '../_shared/paths.js';
|
|
6
6
|
import { createAsyncQueue } from './asyncQueue.js';
|
|
7
|
-
import { writeMcpConfigFile } from './mcpConfig.js';
|
|
8
7
|
import { attachOutputBuffers } from './subprocessEventStream.js';
|
|
9
8
|
export class SubprocessSkillRunner {
|
|
10
9
|
deps;
|
|
11
10
|
running = new Map();
|
|
12
|
-
|
|
11
|
+
// Maps sessionId to cwd for resuming. claude needs the same cwd per turn.
|
|
13
12
|
sessionDirs = new Map();
|
|
14
13
|
subscribers = new Map();
|
|
15
|
-
|
|
14
|
+
// How many events have been emitted (and persisted) per run so far.
|
|
16
15
|
positions = new Map();
|
|
17
16
|
constructor(deps) {
|
|
18
17
|
this.deps = deps;
|
|
@@ -21,28 +20,63 @@ export class SubprocessSkillRunner {
|
|
|
21
20
|
const manifest = await this.deps.skillRegistry.get(workspace, skillId);
|
|
22
21
|
const runId = newSkillRunId();
|
|
23
22
|
const sessionDir = await this.resolveSessionDir(workspace, runId, options?.resumeSessionId);
|
|
24
|
-
const
|
|
25
|
-
const
|
|
23
|
+
const skillBundleDirs = await this.skillBundleDirsFor(workspace, sessionDir);
|
|
24
|
+
const gatewayArgs = [
|
|
25
|
+
'openapi-mcp-gateway',
|
|
26
|
+
'--spec',
|
|
27
|
+
this.deps.coreGateway?.specUrl ?? '',
|
|
28
|
+
'--transport',
|
|
29
|
+
'stdio',
|
|
30
|
+
'--name',
|
|
31
|
+
'braid-core',
|
|
32
|
+
// Forward the caller's Bearer token so the gateway authenticates its outgoing API calls.
|
|
33
|
+
// The gateway resolves `${BRAID_TOKEN}` against its process env at startup.
|
|
34
|
+
// Without this the server's auth middleware rejects every callback with 401.
|
|
35
|
+
// eslint-disable-next-line no-template-curly-in-string
|
|
36
|
+
...(options?.callerToken ? ['--auth-type', 'bearer', '--auth-token', '${BRAID_TOKEN}'] : []),
|
|
37
|
+
];
|
|
38
|
+
// Compose the MCP server list, the built-in gateway plus any the workspace
|
|
39
|
+
// declares. The binding writes whatever config its CLI needs from this.
|
|
40
|
+
const gatewayServers = this.deps.coreGateway
|
|
41
|
+
? [{
|
|
42
|
+
id: McpServerId.parse('braid-core'),
|
|
43
|
+
transport: 'stdio',
|
|
44
|
+
command: this.deps.coreGateway.uvxBin ?? 'uvx',
|
|
45
|
+
args: gatewayArgs,
|
|
46
|
+
}]
|
|
47
|
+
: [];
|
|
48
|
+
const binding = this.bindingFor(manifest.frontmatter.braid.agent);
|
|
49
|
+
const invocation = await binding.resolveSpawn({
|
|
26
50
|
skillId,
|
|
27
51
|
args,
|
|
28
52
|
workspace,
|
|
29
53
|
manifest,
|
|
30
54
|
apiUrl: this.deps.apiUrl,
|
|
31
|
-
|
|
55
|
+
mcpServers: [...gatewayServers, ...workspace.mcpServers],
|
|
56
|
+
sessionDir: AbsolutePathSchema.parse(sessionDir),
|
|
57
|
+
skillBundleDirs,
|
|
32
58
|
...(options?.resumeSessionId ? { resumeSessionId: options.resumeSessionId } : {}),
|
|
33
59
|
});
|
|
34
60
|
const spawnFn = this.deps.spawn ?? (await defaultSpawn());
|
|
35
|
-
// BRAID_SESSION_DIR resolves ambiguity in SKILL.md paths
|
|
36
|
-
// both `BRAID_WORKSPACE` and a cwd
|
|
37
|
-
// otherwise guess
|
|
61
|
+
// BRAID_SESSION_DIR resolves ambiguity in SKILL.md paths.
|
|
62
|
+
// claude sees both `BRAID_WORKSPACE` and a cwd inside it,
|
|
63
|
+
// and would otherwise guess which one `.claude/skills/...` is rooted in.
|
|
38
64
|
const child = spawnFn(invocation.bin, [...invocation.args], {
|
|
39
65
|
cwd: sessionDir,
|
|
40
|
-
env: {
|
|
66
|
+
env: {
|
|
67
|
+
...invocation.env,
|
|
68
|
+
BRAID_SESSION_DIR: sessionDir,
|
|
69
|
+
// BRAID_TOKEN is read by the braid-core MCP gateway,
|
|
70
|
+
// and by any shell-level callback (curl in a SKILL.md),
|
|
71
|
+
// so the subprocess can authenticate against the running server.
|
|
72
|
+
...(options?.callerToken ? { BRAID_TOKEN: options.callerToken } : {}),
|
|
73
|
+
...(options?.extraEnv ?? {}),
|
|
74
|
+
},
|
|
41
75
|
stdio: ['ignore', 'pipe', 'pipe'],
|
|
42
76
|
});
|
|
43
77
|
this.running.set(runId, { workspace, child });
|
|
44
|
-
// Persist the started record up front
|
|
45
|
-
// immediately,
|
|
78
|
+
// Persist the started record up front,
|
|
79
|
+
// so listing endpoints see the run immediately, before any output.
|
|
46
80
|
const startedAt = this.now();
|
|
47
81
|
const initialRecord = {
|
|
48
82
|
runId,
|
|
@@ -61,12 +95,13 @@ export class SubprocessSkillRunner {
|
|
|
61
95
|
skillId,
|
|
62
96
|
at: startedAt,
|
|
63
97
|
});
|
|
64
|
-
// Fire-and-forget the drain
|
|
65
|
-
// can return immediately.
|
|
98
|
+
// Fire-and-forget the drain,
|
|
99
|
+
// so the HTTP request that called start() can return immediately.
|
|
66
100
|
void this.drain({
|
|
67
101
|
workspace,
|
|
68
102
|
runId,
|
|
69
103
|
child,
|
|
104
|
+
parseLine: binding.parseLine,
|
|
70
105
|
skillId,
|
|
71
106
|
args,
|
|
72
107
|
sessionDir,
|
|
@@ -122,13 +157,18 @@ export class SubprocessSkillRunner {
|
|
|
122
157
|
at: input.startedAt,
|
|
123
158
|
}));
|
|
124
159
|
const queue = createAsyncQueue();
|
|
125
|
-
const buffers = attachOutputBuffers(input.child, queue.push, () => this.now());
|
|
126
|
-
input.child.on('close', (code) => {
|
|
160
|
+
const buffers = attachOutputBuffers(input.child, input.parseLine, queue.push, () => this.now());
|
|
161
|
+
input.child.on('close', (code, signal) => {
|
|
127
162
|
buffers.flush();
|
|
128
163
|
queue.push(SkillEventSchema.parse({
|
|
129
164
|
type: 'completed',
|
|
130
165
|
runId: input.runId,
|
|
131
|
-
|
|
166
|
+
// A signal-killed run must be reported as non-zero,
|
|
167
|
+
// e.g. cancel via SIGTERM, or OS-level SIGKILL.
|
|
168
|
+
// Downstream consumers then distinguish it from a clean exit.
|
|
169
|
+
// Without this, `code ?? 0` collapses every signal kill to 0,
|
|
170
|
+
// and cancellation looks identical to a clean run.
|
|
171
|
+
exitCode: code ?? (signal ? 128 : 0),
|
|
132
172
|
at: this.now(),
|
|
133
173
|
}));
|
|
134
174
|
queue.end();
|
|
@@ -161,17 +201,16 @@ export class SubprocessSkillRunner {
|
|
|
161
201
|
at: this.now(),
|
|
162
202
|
});
|
|
163
203
|
this.subscribers.delete(input.runId);
|
|
164
|
-
// Keep the session dir on disk if a session id was captured
|
|
165
|
-
// stores conversation state per-cwd, so the dir must survive between
|
|
166
|
-
//
|
|
204
|
+
// Keep the session dir on disk if a session id was captured.
|
|
205
|
+
// claude stores conversation state per-cwd, so the dir must survive between turns.
|
|
206
|
+
// GC happens via forgetSession(sessionId).
|
|
167
207
|
const keepForResume = capturedSessionId !== null;
|
|
168
208
|
if (this.deps.cleanupSession !== false && !keepForResume)
|
|
169
209
|
await rm(input.sessionDir, { recursive: true, force: true }).catch(() => { });
|
|
170
210
|
}
|
|
171
211
|
}
|
|
172
|
-
// Persist first, then broadcast.
|
|
173
|
-
//
|
|
174
|
-
// positionAtSubscribe.
|
|
212
|
+
// Persist first, then broadcast.
|
|
213
|
+
// This guarantees a just-subscribed listener receives every event strictly past its positionAtSubscribe.
|
|
175
214
|
async emit(workspace, runId, event) {
|
|
176
215
|
await this.deps.runRepository.appendEvent(workspace, runId, event);
|
|
177
216
|
const next = (this.positions.get(runId) ?? 0) + 1;
|
|
@@ -210,25 +249,70 @@ export class SubprocessSkillRunner {
|
|
|
210
249
|
}
|
|
211
250
|
async buildSessionDir(workspace, runId) {
|
|
212
251
|
const sessionDir = sessionDirPath(workspace.rootPath, runId);
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
const
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
const slashName = manifest.frontmatter.name;
|
|
219
|
-
if (linked.has(slashName))
|
|
220
|
-
continue;
|
|
221
|
-
linked.add(slashName);
|
|
222
|
-
await symlink(dirname(manifest.path), join(skillsDir, slashName), 'dir');
|
|
223
|
-
}
|
|
252
|
+
// Companion reference docs stay under `.claude/skills/<name>/`,
|
|
253
|
+
// so SKILL.md bodies keep reading `<cwd>/.claude/skills/shared/...`.
|
|
254
|
+
const docsDir = join(sessionDir, '.claude', 'skills');
|
|
255
|
+
await mkdir(docsDir, { recursive: true });
|
|
256
|
+
const linkedRefs = new Set();
|
|
224
257
|
for (const reference of this.deps.referenceDirs ?? []) {
|
|
225
|
-
if (
|
|
258
|
+
if (linkedRefs.has(reference.name))
|
|
226
259
|
continue;
|
|
227
|
-
|
|
228
|
-
await symlink(reference.path, join(
|
|
260
|
+
linkedRefs.add(reference.name);
|
|
261
|
+
await symlink(reference.path, join(docsDir, reference.name), 'dir');
|
|
262
|
+
}
|
|
263
|
+
// Invokable skills stage as one claude plugin per namespace, so a skill
|
|
264
|
+
// invokes as `/namespace:verb`. The colon lives only in the invocation
|
|
265
|
+
// token claude synthesises, never in a path, so the layout is portable.
|
|
266
|
+
const byNamespace = new Map();
|
|
267
|
+
for (const manifest of await this.deps.skillRegistry.list(workspace)) {
|
|
268
|
+
const { namespace } = splitSkillId(manifest.id);
|
|
269
|
+
const bucket = byNamespace.get(namespace) ?? [];
|
|
270
|
+
bucket.push(manifest);
|
|
271
|
+
byNamespace.set(namespace, bucket);
|
|
272
|
+
}
|
|
273
|
+
for (const [namespace, skills] of byNamespace) {
|
|
274
|
+
const pluginDir = this.skillBundleDir(sessionDir, namespace);
|
|
275
|
+
await mkdir(join(pluginDir, '.claude-plugin'), { recursive: true });
|
|
276
|
+
const manifest = { name: namespace, version: '0.0.0', description: `Braid ${namespace} skills` };
|
|
277
|
+
await writeFile(join(pluginDir, '.claude-plugin', 'plugin.json'), `${JSON.stringify(manifest, null, 2)}\n`, 'utf-8');
|
|
278
|
+
const skillsDir = join(pluginDir, 'skills');
|
|
279
|
+
await mkdir(skillsDir, { recursive: true });
|
|
280
|
+
const linked = new Set();
|
|
281
|
+
for (const skill of skills) {
|
|
282
|
+
const { verb } = splitSkillId(skill.id);
|
|
283
|
+
if (linked.has(verb))
|
|
284
|
+
continue;
|
|
285
|
+
linked.add(verb);
|
|
286
|
+
await symlink(dirname(skill.path), join(skillsDir, verb), 'dir');
|
|
287
|
+
}
|
|
229
288
|
}
|
|
230
289
|
return sessionDir;
|
|
231
290
|
}
|
|
291
|
+
skillBundleDir(sessionDir, namespace) {
|
|
292
|
+
return join(sessionDir, '.braid-plugins', namespace);
|
|
293
|
+
}
|
|
294
|
+
// The plugin bundle dir for every namespace present in the workspace.
|
|
295
|
+
// Deterministic from the session dir, so it works on a resumed session,
|
|
296
|
+
// whose bundles were staged on the first run, without restaging.
|
|
297
|
+
async skillBundleDirsFor(workspace, sessionDir) {
|
|
298
|
+
const manifests = await this.deps.skillRegistry.list(workspace);
|
|
299
|
+
const namespaces = [...new Set(manifests.map(manifest => splitSkillId(manifest.id).namespace))];
|
|
300
|
+
return namespaces.map(namespace => this.skillBundleDir(sessionDir, namespace));
|
|
301
|
+
}
|
|
302
|
+
// Merge a skill's agent override onto the server default, then build the binding.
|
|
303
|
+
// Unset override fields inherit the default.
|
|
304
|
+
bindingFor(override) {
|
|
305
|
+
const base = this.deps.defaultAgent;
|
|
306
|
+
const effort = override?.effort ?? base.effort;
|
|
307
|
+
return this.deps.buildAgentBinding({
|
|
308
|
+
id: base.id,
|
|
309
|
+
kind: override?.kind ?? base.kind,
|
|
310
|
+
model: override?.model ?? base.model,
|
|
311
|
+
...(effort ? { effort } : {}),
|
|
312
|
+
extraArgs: base.extraArgs,
|
|
313
|
+
env: base.env,
|
|
314
|
+
});
|
|
315
|
+
}
|
|
232
316
|
now() {
|
|
233
317
|
return (this.deps.clock ?? (() => new Date().toISOString()))();
|
|
234
318
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SubprocessSkillRunner.js","sourceRoot":"","sources":["../../../src/infrastructure/skill/SubprocessSkillRunner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Single-producer, single-consumer async queue backing an `AsyncIterable`.
|
|
3
|
+
* Bridges node `EventEmitter`-style callbacks,
|
|
4
|
+
* which fire whenever subprocess stdout, stderr, or close events arrive,
|
|
5
|
+
* into `for await of` consumers (Hono's SSE writer, vitest assertions),
|
|
6
|
+
* without buffering every event until the producer is done.
|
|
7
|
+
*
|
|
8
|
+
* `push(item)` enqueues an item and wakes a pending consumer.
|
|
9
|
+
* `end()` signals that no more items are coming,
|
|
10
|
+
* the iterator finishes once it has drained the queue.
|
|
11
|
+
* `iterate()` returns a single-use async generator,
|
|
12
|
+
* calling it more than once is undefined.
|
|
13
|
+
*/
|
|
14
|
+
export interface AsyncQueue<T> {
|
|
15
|
+
push: (item: T) => void;
|
|
16
|
+
end: () => void;
|
|
17
|
+
iterate: () => AsyncGenerator<T>;
|
|
18
|
+
}
|
|
19
|
+
export declare function createAsyncQueue<T>(): AsyncQueue<T>;
|
|
20
|
+
//# sourceMappingURL=asyncQueue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"asyncQueue.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/skill/asyncQueue.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,UAAU,CAAC,CAAC;IAC3B,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,CAAA;IACvB,GAAG,EAAE,MAAM,IAAI,CAAA;IACf,OAAO,EAAE,MAAM,cAAc,CAAC,CAAC,CAAC,CAAA;CACjC;AAED,wBAAgB,gBAAgB,CAAC,CAAC,KAAK,UAAU,CAAC,CAAC,CAAC,CA0CnD"}
|
|
@@ -26,9 +26,8 @@ export function createAsyncQueue() {
|
|
|
26
26
|
}
|
|
27
27
|
if (finished)
|
|
28
28
|
return;
|
|
29
|
-
//
|
|
30
|
-
// where `push` or `end`
|
|
31
|
-
// and the resolver assignment.
|
|
29
|
+
// Re-check inside the Promise constructor to avoid a race,
|
|
30
|
+
// where `push` or `end` fires between the queue-length check and the resolver assignment.
|
|
32
31
|
await new Promise((r) => {
|
|
33
32
|
if (buffer.length > 0 || finished) {
|
|
34
33
|
r();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"asyncQueue.js","sourceRoot":"","sources":["../../../src/infrastructure/
|
|
1
|
+
{"version":3,"file":"asyncQueue.js","sourceRoot":"","sources":["../../../src/infrastructure/skill/asyncQueue.ts"],"names":[],"mappings":"AAmBA,MAAM,UAAU,gBAAgB;IAC9B,MAAM,MAAM,GAAQ,EAAE,CAAA;IACtB,IAAI,QAAQ,GAAwB,IAAI,CAAA;IACxC,IAAI,QAAQ,GAAG,KAAK,CAAA;IAEpB,MAAM,IAAI,GAAG,GAAS,EAAE;QACtB,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,CAAC,GAAG,QAAQ,CAAA;YAClB,QAAQ,GAAG,IAAI,CAAA;YACf,CAAC,EAAE,CAAA;QACL,CAAC;IACH,CAAC,CAAA;IAED,OAAO;QACL,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE;YACb,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YACjB,IAAI,EAAE,CAAA;QACR,CAAC;QACD,GAAG,EAAE,GAAG,EAAE;YACR,QAAQ,GAAG,IAAI,CAAA;YACf,IAAI,EAAE,CAAA;QACR,CAAC;QACD,OAAO,EAAE,KAAK,SAAS,CAAC,CAAC,OAAO;YAC9B,OAAO,IAAI,EAAE,CAAC;gBACZ,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACtB,MAAM,MAAM,CAAC,KAAK,EAAG,CAAA;oBACrB,SAAQ;gBACV,CAAC;gBACD,IAAI,QAAQ;oBACV,OAAM;gBACR,2DAA2D;gBAC3D,0FAA0F;gBAC1F,MAAM,IAAI,OAAO,CAAO,CAAC,CAAC,EAAE,EAAE;oBAC5B,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,QAAQ,EAAE,CAAC;wBAClC,CAAC,EAAE,CAAA;wBACH,OAAM;oBACR,CAAC;oBACD,QAAQ,GAAG,CAAC,CAAA;gBACd,CAAC,CAAC,CAAA;YACJ,CAAC;QACH,CAAC;KACF,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export type LineHandler = (line: string) => void;
|
|
2
|
+
/**
|
|
3
|
+
* Splits a chunked text stream into newline-delimited lines,
|
|
4
|
+
* invoking the handler once per complete line.
|
|
5
|
+
* Partial lines are buffered until the next chunk completes them.
|
|
6
|
+
* Call `flush()` after the source closes to release any trailing line without a terminator.
|
|
7
|
+
*/
|
|
8
|
+
export declare class LineBuffer {
|
|
9
|
+
private readonly onLine;
|
|
10
|
+
private buffer;
|
|
11
|
+
constructor(onLine: LineHandler);
|
|
12
|
+
append(chunk: string): void;
|
|
13
|
+
flush(): void;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=lineBuffer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lineBuffer.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/skill/lineBuffer.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;AAEhD;;;;;GAKG;AACH,qBAAa,UAAU;IAGT,OAAO,CAAC,QAAQ,CAAC,MAAM;IAFnC,OAAO,CAAC,MAAM,CAAK;gBAEU,MAAM,EAAE,WAAW;IAEhD,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAY3B,KAAK,IAAI,IAAI;CAOd"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Splits a chunked text stream into newline-delimited lines,
|
|
3
|
-
* handler
|
|
4
|
-
* the next chunk completes them.
|
|
5
|
-
* release any trailing line without a terminator.
|
|
2
|
+
* Splits a chunked text stream into newline-delimited lines,
|
|
3
|
+
* invoking the handler once per complete line.
|
|
4
|
+
* Partial lines are buffered until the next chunk completes them.
|
|
5
|
+
* Call `flush()` after the source closes to release any trailing line without a terminator.
|
|
6
6
|
*/
|
|
7
7
|
export class LineBuffer {
|
|
8
8
|
onLine;
|
|
@@ -29,16 +29,4 @@ export class LineBuffer {
|
|
|
29
29
|
this.onLine(remainder);
|
|
30
30
|
}
|
|
31
31
|
}
|
|
32
|
-
|
|
33
|
-
const trimmed = line.trim();
|
|
34
|
-
if (trimmed.length === 0)
|
|
35
|
-
return undefined;
|
|
36
|
-
try {
|
|
37
|
-
const parsed = JSON.parse(trimmed);
|
|
38
|
-
return parsed;
|
|
39
|
-
}
|
|
40
|
-
catch {
|
|
41
|
-
return undefined;
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
//# sourceMappingURL=streamJsonParser.js.map
|
|
32
|
+
//# sourceMappingURL=lineBuffer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lineBuffer.js","sourceRoot":"","sources":["../../../src/infrastructure/skill/lineBuffer.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,MAAM,OAAO,UAAU;IAGQ;IAFrB,MAAM,GAAG,EAAE,CAAA;IAEnB,YAA6B,MAAmB;QAAnB,WAAM,GAAN,MAAM,CAAa;IAAG,CAAC;IAEpD,MAAM,CAAC,KAAa;QAClB,IAAI,CAAC,MAAM,IAAI,KAAK,CAAA;QACpB,IAAI,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;QAC5C,OAAO,YAAY,IAAI,CAAC,EAAE,CAAC;YACzB,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,YAAY,CAAC,CAAA;YAC/C,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,GAAG,CAAC,CAAC,CAAA;YACjD,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;gBACjB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;YACnB,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;QAC1C,CAAC;IACH,CAAC;IAED,KAAK;QACH,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC;YAC1B,OAAM;QACR,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAA;QAC7B,IAAI,CAAC,MAAM,GAAG,EAAE,CAAA;QAChB,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;IACxB,CAAC;CACF"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { Clock, RunRepository, WorkspaceRepository } from '@braidhq/core';
|
|
2
|
+
/**
|
|
3
|
+
* Run records survive across server restarts,
|
|
4
|
+
* but the subprocess that was driving each run does not.
|
|
5
|
+
* On startup any run without a `completedAt` timestamp is an orphan,
|
|
6
|
+
* nobody is going to drain its events.
|
|
7
|
+
* We tag those with a synthetic `error` event,
|
|
8
|
+
* so the UI can show why the transcript is truncated.
|
|
9
|
+
* A `completed` event then makes the run leave the active list.
|
|
10
|
+
*
|
|
11
|
+
* Idempotent: runs that are already marked completed are skipped.
|
|
12
|
+
*/
|
|
13
|
+
export declare function reapOrphanRuns(deps: {
|
|
14
|
+
workspaceRepository: WorkspaceRepository;
|
|
15
|
+
runRepository: RunRepository;
|
|
16
|
+
clock: Clock;
|
|
17
|
+
}): Promise<{
|
|
18
|
+
reaped: number;
|
|
19
|
+
}>;
|
|
20
|
+
//# sourceMappingURL=orphanReaper.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orphanReaper.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/skill/orphanReaper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAA;AAG9E;;;;;;;;;;GAUG;AACH,wBAAsB,cAAc,CAAC,IAAI,EAAE;IACzC,mBAAmB,EAAE,mBAAmB,CAAA;IACxC,aAAa,EAAE,aAAa,CAAA;IAC5B,KAAK,EAAE,KAAK,CAAA;CACb,GAAG,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CA+B9B"}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Run records survive across server restarts,
|
|
3
|
-
* driving each run does not.
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
2
|
+
* Run records survive across server restarts,
|
|
3
|
+
* but the subprocess that was driving each run does not.
|
|
4
|
+
* On startup any run without a `completedAt` timestamp is an orphan,
|
|
5
|
+
* nobody is going to drain its events.
|
|
6
|
+
* We tag those with a synthetic `error` event,
|
|
7
|
+
* so the UI can show why the transcript is truncated.
|
|
8
|
+
* A `completed` event then makes the run leave the active list.
|
|
7
9
|
*
|
|
8
10
|
* Idempotent: runs that are already marked completed are skipped.
|
|
9
11
|
*/
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orphanReaper.js","sourceRoot":"","sources":["../../../src/infrastructure/skill/orphanReaper.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAIpC;IACC,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,IAAI,EAAE,CAAA;IACxD,IAAI,MAAM,GAAG,CAAC,CAAA;IACd,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,SAAS,CAAC,CAAA;QAC/D,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,IAAI,MAAM,CAAC,WAAW,KAAK,SAAS;gBAClC,SAAQ;YACV,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAA;YAC3B,MAAM,KAAK,GAAe;gBACxB,IAAI,EAAE,OAAO;gBACb,OAAO,EAAE,+DAA+D;gBACxE,EAAE;aACH,CAAA;YACD,MAAM,SAAS,GAAe;gBAC5B,IAAI,EAAE,WAAW;gBACjB,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,QAAQ,EAAE,CAAC,CAAC;gBACZ,EAAE;aACH,CAAA;YACD,MAAM,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,SAAS,EAAE,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CAAA;YACpE,MAAM,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,SAAS,EAAE,MAAM,CAAC,KAAK,EAAE,SAAS,CAAC,CAAA;YACxE,MAAM,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,SAAS,EAAE;gBAC7C,GAAG,MAAM;gBACT,WAAW,EAAE,EAAE;gBACf,QAAQ,EAAE,CAAC,CAAC;aACb,CAAC,CAAA;YACF,MAAM,EAAE,CAAA;QACV,CAAC;IACH,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,CAAA;AACnB,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { SkillEvent } from '@braidhq/schema';
|
|
2
|
+
import type { ChildProcess } from 'node:child_process';
|
|
3
|
+
/**
|
|
4
|
+
* Maps one stdout line to zero or more SkillEvents.
|
|
5
|
+
* The agent binding owns this, since the line format is the agent's own.
|
|
6
|
+
*/
|
|
7
|
+
export type LineParser = (line: string, now: string) => SkillEvent[];
|
|
8
|
+
/**
|
|
9
|
+
* Wires a child's stdout and stderr to a single SkillEvent callback.
|
|
10
|
+
* `parseLine` comes from the agent binding, so this stays format-agnostic.
|
|
11
|
+
* Returns `flush` so callers can drain the final un-terminated line on `close`.
|
|
12
|
+
*/
|
|
13
|
+
export declare function attachOutputBuffers(child: ChildProcess, parseLine: LineParser, onEvent: (event: SkillEvent) => void, now: () => string): {
|
|
14
|
+
flush: () => void;
|
|
15
|
+
};
|
|
16
|
+
//# sourceMappingURL=subprocessEventStream.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subprocessEventStream.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/skill/subprocessEventStream.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AACjD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAItD;;;GAGG;AACH,MAAM,MAAM,UAAU,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,UAAU,EAAE,CAAA;AAEpE;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,YAAY,EACnB,SAAS,EAAE,UAAU,EACrB,OAAO,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,EACpC,GAAG,EAAE,MAAM,MAAM,GAChB;IAAE,KAAK,EAAE,MAAM,IAAI,CAAA;CAAE,CAsBvB"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { SkillEvent as SkillEventSchema } from '@braidhq/schema';
|
|
2
|
+
import { LineBuffer } from './lineBuffer.js';
|
|
3
|
+
/**
|
|
4
|
+
* Wires a child's stdout and stderr to a single SkillEvent callback.
|
|
5
|
+
* `parseLine` comes from the agent binding, so this stays format-agnostic.
|
|
6
|
+
* Returns `flush` so callers can drain the final un-terminated line on `close`.
|
|
7
|
+
*/
|
|
8
|
+
export function attachOutputBuffers(child, parseLine, onEvent, now) {
|
|
9
|
+
const stdout = new LineBuffer((line) => {
|
|
10
|
+
for (const event of parseLine(line, now()))
|
|
11
|
+
onEvent(event);
|
|
12
|
+
});
|
|
13
|
+
// stderr is wrapped verbatim into a `[stderr]` message event,
|
|
14
|
+
// so it shows up in the transcript alongside model output.
|
|
15
|
+
const stderr = new LineBuffer((line) => {
|
|
16
|
+
onEvent(SkillEventSchema.parse({ type: 'message', text: `[stderr] ${line}` }));
|
|
17
|
+
});
|
|
18
|
+
child.stdout?.setEncoding('utf-8');
|
|
19
|
+
child.stdout?.on('data', (chunk) => stdout.append(chunk));
|
|
20
|
+
child.stderr?.setEncoding('utf-8');
|
|
21
|
+
child.stderr?.on('data', (chunk) => stderr.append(chunk));
|
|
22
|
+
return {
|
|
23
|
+
flush: () => {
|
|
24
|
+
stdout.flush();
|
|
25
|
+
stderr.flush();
|
|
26
|
+
},
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=subprocessEventStream.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subprocessEventStream.js","sourceRoot":"","sources":["../../../src/infrastructure/skill/subprocessEventStream.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,IAAI,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAChE,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAQ5C;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CACjC,KAAmB,EACnB,SAAqB,EACrB,OAAoC,EACpC,GAAiB;IAEjB,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,CAAC,IAAI,EAAE,EAAE;QACrC,KAAK,MAAM,KAAK,IAAI,SAAS,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC;YACxC,OAAO,CAAC,KAAK,CAAC,CAAA;IAClB,CAAC,CAAC,CAAA;IACF,8DAA8D;IAC9D,2DAA2D;IAC3D,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,CAAC,IAAI,EAAE,EAAE;QACrC,OAAO,CAAC,gBAAgB,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,YAAY,IAAI,EAAE,EAAE,CAAC,CAAC,CAAA;IAChF,CAAC,CAAC,CAAA;IAEF,KAAK,CAAC,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,CAAA;IAClC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA;IACjE,KAAK,CAAC,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,CAAA;IAClC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA;IAEjE,OAAO;QACL,KAAK,EAAE,GAAG,EAAE;YACV,MAAM,CAAC,KAAK,EAAE,CAAA;YACd,MAAM,CAAC,KAAK,EAAE,CAAA;QAChB,CAAC;KACF,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { SourceUnitDigest, Workspace } from '@braidhq/core';
|
|
2
|
+
import type { SourceId, SourceUnitSha } from '@braidhq/schema';
|
|
3
|
+
/**
|
|
4
|
+
* Filesystem-backed `SourceUnitDigest`. Resolves the unit's relative path,
|
|
5
|
+
* under its filesystem source root, then hashes.
|
|
6
|
+
*
|
|
7
|
+
* - regular file: the sha256 of the file bytes.
|
|
8
|
+
* - directory: a recursive walk hashes each file by content,
|
|
9
|
+
* assembles a deterministic `<relpath>:<filehash>\n` manifest,
|
|
10
|
+
* sorted by relpath, then returns the sha256 of that manifest.
|
|
11
|
+
* Dot-prefixed entries are skipped, per the intent scanner's convention.
|
|
12
|
+
*
|
|
13
|
+
* The intent scanner's trailing-slash convention is accepted,
|
|
14
|
+
* so a file reads as `foo.md` and a folder as `foo/`.
|
|
15
|
+
*/
|
|
16
|
+
export declare class FsSourceUnitDigest implements SourceUnitDigest {
|
|
17
|
+
computeSha(workspace: Workspace, sourceId: SourceId, path: string): Promise<SourceUnitSha>;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=FsSourceUnitDigest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FsSourceUnitDigest.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/source/FsSourceUnitDigest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAChE,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAK9D;;;;;;;;;;;;GAYG;AACH,qBAAa,kBAAmB,YAAW,gBAAgB;IACnD,UAAU,CAAC,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;CAejG"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { readdir, readFile, stat } from 'node:fs/promises';
|
|
3
|
+
import { isAbsolute, join, relative } from 'node:path';
|
|
4
|
+
/**
|
|
5
|
+
* Filesystem-backed `SourceUnitDigest`. Resolves the unit's relative path,
|
|
6
|
+
* under its filesystem source root, then hashes.
|
|
7
|
+
*
|
|
8
|
+
* - regular file: the sha256 of the file bytes.
|
|
9
|
+
* - directory: a recursive walk hashes each file by content,
|
|
10
|
+
* assembles a deterministic `<relpath>:<filehash>\n` manifest,
|
|
11
|
+
* sorted by relpath, then returns the sha256 of that manifest.
|
|
12
|
+
* Dot-prefixed entries are skipped, per the intent scanner's convention.
|
|
13
|
+
*
|
|
14
|
+
* The intent scanner's trailing-slash convention is accepted,
|
|
15
|
+
* so a file reads as `foo.md` and a folder as `foo/`.
|
|
16
|
+
*/
|
|
17
|
+
export class FsSourceUnitDigest {
|
|
18
|
+
async computeSha(workspace, sourceId, path) {
|
|
19
|
+
const source = workspace.sources.find(s => s.id === sourceId);
|
|
20
|
+
if (!source || source.kind !== 'filesystem') {
|
|
21
|
+
throw new Error(`Cannot compute digest for non-filesystem source "${sourceId}" on workspace "${workspace.id}"`);
|
|
22
|
+
}
|
|
23
|
+
const sourceRoot = isAbsolute(source.path) ? source.path : join(workspace.rootPath, source.path);
|
|
24
|
+
const stripped = path.endsWith('/') ? path.slice(0, -1) : path;
|
|
25
|
+
const target = join(sourceRoot, stripped);
|
|
26
|
+
const info = await stat(target);
|
|
27
|
+
if (info.isDirectory())
|
|
28
|
+
return hashDirectory(target);
|
|
29
|
+
return hashFile(target);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
async function hashFile(filePath) {
|
|
33
|
+
const buf = await readFile(filePath);
|
|
34
|
+
return createHash('sha256').update(buf).digest('hex');
|
|
35
|
+
}
|
|
36
|
+
async function hashDirectory(dirPath) {
|
|
37
|
+
const files = [];
|
|
38
|
+
await walk(dirPath, dirPath, files);
|
|
39
|
+
files.sort((a, b) => (a.rel < b.rel ? -1 : a.rel > b.rel ? 1 : 0));
|
|
40
|
+
const manifest = files.map(f => `${f.rel}:${f.hash}`).join('\n');
|
|
41
|
+
return createHash('sha256').update(manifest).digest('hex');
|
|
42
|
+
}
|
|
43
|
+
async function walk(root, dir, out) {
|
|
44
|
+
const entries = await readdir(dir, { withFileTypes: true });
|
|
45
|
+
for (const entry of entries) {
|
|
46
|
+
if (entry.name.startsWith('.'))
|
|
47
|
+
continue;
|
|
48
|
+
const abs = join(dir, entry.name);
|
|
49
|
+
if (entry.isDirectory()) {
|
|
50
|
+
await walk(root, abs, out);
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
if (!entry.isFile())
|
|
54
|
+
continue;
|
|
55
|
+
out.push({ rel: relative(root, abs), hash: await hashFile(abs) });
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=FsSourceUnitDigest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FsSourceUnitDigest.js","sourceRoot":"","sources":["../../../src/infrastructure/source/FsSourceUnitDigest.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { SourceUnitObservationRepository } from '@braidhq/core';
|
|
2
|
+
import type { AbsolutePath, SourceId, SourceUnitObservation, WorkspaceId } from '@braidhq/schema';
|
|
3
|
+
export interface FsSourceUnitObservationRepositoryOptions {
|
|
4
|
+
/**
|
|
5
|
+
* Lookup of `workspaceId` to `workspaceRoot`, shared by the repos,
|
|
6
|
+
* so this one takes no `WorkspaceService` dependency of its own.
|
|
7
|
+
* `composeFs.ts` builds the closure once, then hands the same one,
|
|
8
|
+
* to every fs repo.
|
|
9
|
+
*/
|
|
10
|
+
readonly workspaceRoots: () => Promise<ReadonlyMap<WorkspaceId, AbsolutePath>>;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Filesystem-backed `SourceUnitObservationRepository`. Each entity maps to,
|
|
14
|
+
* `artifacts/source-unit-state/<sourceId>/<encoded-path>.json`, one file each,
|
|
15
|
+
* matching the file-per-entity pattern used by proposals / clarifications.
|
|
16
|
+
*
|
|
17
|
+
* The file body is exactly the `SourceUnitObservation` shape,
|
|
18
|
+
* with no wrapper or envelope.
|
|
19
|
+
* In a future SQLite or Postgres store,
|
|
20
|
+
* each file becomes one row keyed by `(workspaceId, sourceId, path)`.
|
|
21
|
+
*/
|
|
22
|
+
export declare class FsSourceUnitObservationRepository implements SourceUnitObservationRepository {
|
|
23
|
+
private readonly options;
|
|
24
|
+
constructor(options: FsSourceUnitObservationRepositoryOptions);
|
|
25
|
+
find(workspaceId: WorkspaceId, sourceId: SourceId, path: string): Promise<SourceUnitObservation | null>;
|
|
26
|
+
save(state: SourceUnitObservation): Promise<void>;
|
|
27
|
+
listByWorkspace(workspaceId: WorkspaceId): Promise<readonly SourceUnitObservation[]>;
|
|
28
|
+
listBySource(workspaceId: WorkspaceId, sourceId: SourceId): Promise<readonly SourceUnitObservation[]>;
|
|
29
|
+
private resolveRoot;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=FsSourceUnitObservationRepository.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FsSourceUnitObservationRepository.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/source/FsSourceUnitObservationRepository.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,+BAA+B,EAAE,MAAM,eAAe,CAAA;AACpE,OAAO,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,qBAAqB,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AASjG,MAAM,WAAW,wCAAwC;IACvD;;;;;OAKG;IACH,QAAQ,CAAC,cAAc,EAAE,MAAM,OAAO,CAAC,WAAW,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC,CAAA;CAC/E;AAED;;;;;;;;;GASG;AACH,qBAAa,iCAAkC,YAAW,+BAA+B;IAC3E,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,wCAAwC;IAExE,IAAI,CAAC,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,GAAG,IAAI,CAAC;IAcvG,IAAI,CAAC,KAAK,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC;IASjD,eAAe,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,SAAS,qBAAqB,EAAE,CAAC;IAapF,YAAY,CAAC,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,SAAS,qBAAqB,EAAE,CAAC;YAK7F,WAAW;CAO1B"}
|