@plurnk/plurnk-service 1.18.0 → 1.19.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/.env.defaults +76 -13
- package/README.md +5 -3
- package/SPEC.md +924 -689
- package/dist/Paths.js +3 -3
- package/dist/build-info.json +1 -1
- package/dist/content/body-preview.d.ts +1 -0
- package/dist/content/body-preview.d.ts.map +1 -1
- package/dist/content/body-preview.js +8 -10
- package/dist/content/body-preview.js.map +1 -1
- package/dist/content/edit-receipt.d.ts.map +1 -1
- package/dist/content/edit-receipt.js +30 -29
- package/dist/content/edit-receipt.js.map +1 -1
- package/dist/content/line-anchors.d.ts.map +1 -1
- package/dist/content/line-anchors.js +17 -5
- package/dist/content/line-anchors.js.map +1 -1
- package/dist/content/read-projector.d.ts +2 -2
- package/dist/content/read-projector.d.ts.map +1 -1
- package/dist/content/read-projector.js +79 -37
- package/dist/content/read-projector.js.map +1 -1
- package/dist/content/scope-format.d.ts +9 -0
- package/dist/content/scope-format.d.ts.map +1 -0
- package/dist/content/scope-format.js +28 -0
- package/dist/content/scope-format.js.map +1 -0
- package/dist/core/AdministrativeLoop.d.ts +8 -0
- package/dist/core/AdministrativeLoop.d.ts.map +1 -0
- package/dist/core/AdministrativeLoop.js +16 -0
- package/dist/core/AdministrativeLoop.js.map +1 -0
- package/dist/core/AdmittedTurnExecutor.d.ts +2 -1
- package/dist/core/AdmittedTurnExecutor.d.ts.map +1 -1
- package/dist/core/AdmittedTurnExecutor.js +19 -19
- package/dist/core/AdmittedTurnExecutor.js.map +1 -1
- package/dist/core/BareBatchRunner.d.ts +1 -2
- package/dist/core/BareBatchRunner.d.ts.map +1 -1
- package/dist/core/BareBatchRunner.js +7 -12
- package/dist/core/BareBatchRunner.js.map +1 -1
- package/dist/core/BudgetReadout.d.ts.map +1 -1
- package/dist/core/BudgetReadout.js +3 -4
- package/dist/core/BudgetReadout.js.map +1 -1
- package/dist/core/CapabilityPolicies.d.ts +4 -2
- package/dist/core/CapabilityPolicies.d.ts.map +1 -1
- package/dist/core/CapabilityPolicies.js +23 -2
- package/dist/core/CapabilityPolicies.js.map +1 -1
- package/dist/core/CapabilityResolver.d.ts +2 -2
- package/dist/core/CapabilityResolver.d.ts.map +1 -1
- package/dist/core/CapabilityResolver.js +6 -3
- package/dist/core/CapabilityResolver.js.map +1 -1
- package/dist/core/ChannelWrite.d.ts +3 -6
- package/dist/core/ChannelWrite.d.ts.map +1 -1
- package/dist/core/ChannelWrite.js +8 -8
- package/dist/core/ChannelWrite.js.map +1 -1
- package/dist/core/ChannelWrite.sql +17 -11
- package/dist/core/ClientInteractions.d.ts +11 -1
- package/dist/core/ClientInteractions.d.ts.map +1 -1
- package/dist/core/ClientInteractions.js +26 -2
- package/dist/core/ClientInteractions.js.map +1 -1
- package/dist/core/CoreSchemeServices.d.ts.map +1 -1
- package/dist/core/CoreSchemeServices.js +1 -0
- package/dist/core/CoreSchemeServices.js.map +1 -1
- package/dist/core/DataStatementRunner.js +6 -6
- package/dist/core/DataStatementRunner.js.map +1 -1
- package/dist/core/Dispatcher.d.ts +12 -4
- package/dist/core/Dispatcher.d.ts.map +1 -1
- package/dist/core/Dispatcher.js +112 -90
- package/dist/core/Dispatcher.js.map +1 -1
- package/dist/core/Dispatcher.sql +11 -26
- package/dist/core/DurableStatement.d.ts +4 -1
- package/dist/core/DurableStatement.d.ts.map +1 -1
- package/dist/core/DurableStatement.js +4 -4
- package/dist/core/DurableStatement.js.map +1 -1
- package/dist/core/EditMutations.d.ts.map +1 -1
- package/dist/core/EditMutations.js +5 -2
- package/dist/core/EditMutations.js.map +1 -1
- package/dist/core/Engine.d.ts +11 -9
- package/dist/core/Engine.d.ts.map +1 -1
- package/dist/core/Engine.js +27 -65
- package/dist/core/Engine.js.map +1 -1
- package/dist/core/Engine.sql +2 -22
- package/dist/core/EnvFlags.d.ts.map +1 -1
- package/dist/core/EnvFlags.js +4 -2
- package/dist/core/EnvFlags.js.map +1 -1
- package/dist/core/ExecutorRegistry.d.ts.map +1 -1
- package/dist/core/ExecutorRegistry.js +2 -1
- package/dist/core/ExecutorRegistry.js.map +1 -1
- package/dist/core/KillHandler.d.ts.map +1 -1
- package/dist/core/KillHandler.js +7 -12
- package/dist/core/KillHandler.js.map +1 -1
- package/dist/core/Knob.d.ts +9 -0
- package/dist/core/Knob.d.ts.map +1 -0
- package/dist/core/Knob.js +50 -0
- package/dist/core/Knob.js.map +1 -0
- package/dist/core/LogBody.d.ts.map +1 -1
- package/dist/core/LogBody.js +6 -35
- package/dist/core/LogBody.js.map +1 -1
- package/dist/core/LogEntryProjection.d.ts.map +1 -1
- package/dist/core/LogEntryProjection.js +4 -0
- package/dist/core/LogEntryProjection.js.map +1 -1
- package/dist/core/LogVisibility.d.ts.map +1 -1
- package/dist/core/LogVisibility.js +2 -1
- package/dist/core/LogVisibility.js.map +1 -1
- package/dist/core/LogWriter.js +2 -2
- package/dist/core/LogWriter.js.map +1 -1
- package/dist/core/LoopDriver.d.ts +1 -1
- package/dist/core/LoopDriver.d.ts.map +1 -1
- package/dist/core/LoopDriver.js +23 -29
- package/dist/core/LoopDriver.js.map +1 -1
- package/dist/core/LoopLifecycle.d.ts +4 -17
- package/dist/core/LoopLifecycle.d.ts.map +1 -1
- package/dist/core/LoopLifecycle.js +20 -22
- package/dist/core/LoopLifecycle.js.map +1 -1
- package/dist/core/LoopLifecycle.sql +36 -49
- package/dist/core/LoopOutcome.d.ts +10 -0
- package/dist/core/LoopOutcome.d.ts.map +1 -0
- package/dist/core/LoopOutcome.js +28 -0
- package/dist/core/LoopOutcome.js.map +1 -0
- package/dist/core/LoopPolicies.d.ts +7 -0
- package/dist/core/LoopPolicies.d.ts.map +1 -0
- package/dist/core/LoopPolicies.js +37 -0
- package/dist/core/LoopPolicies.js.map +1 -0
- package/dist/core/MessageResources.d.ts +15 -0
- package/dist/core/MessageResources.d.ts.map +1 -0
- package/dist/core/MessageResources.js +46 -0
- package/dist/core/MessageResources.js.map +1 -0
- package/dist/core/MessageResources.sql +36 -0
- package/dist/core/OperatorConfig.d.ts +2 -1
- package/dist/core/OperatorConfig.d.ts.map +1 -1
- package/dist/core/OperatorConfig.js +14 -6
- package/dist/core/OperatorConfig.js.map +1 -1
- package/dist/core/PacketBuilder.d.ts.map +1 -1
- package/dist/core/PacketBuilder.js +20 -35
- package/dist/core/PacketBuilder.js.map +1 -1
- package/dist/core/PacketBuilder.sql +24 -6
- package/dist/core/PatternSelection.d.ts +1 -1
- package/dist/core/PatternSelection.d.ts.map +1 -1
- package/dist/core/ProposalLifecycle.d.ts +3 -1
- package/dist/core/ProposalLifecycle.d.ts.map +1 -1
- package/dist/core/ProposalLifecycle.js +85 -22
- package/dist/core/ProposalLifecycle.js.map +1 -1
- package/dist/core/ProviderInstantiate.d.ts +1 -0
- package/dist/core/ProviderInstantiate.d.ts.map +1 -1
- package/dist/core/ProviderInstantiate.js +12 -7
- package/dist/core/ProviderInstantiate.js.map +1 -1
- package/dist/core/ReasoningView.d.ts +1 -2
- package/dist/core/ReasoningView.d.ts.map +1 -1
- package/dist/core/ReasoningView.js +9 -20
- package/dist/core/ReasoningView.js.map +1 -1
- package/dist/core/ResourceBindings.d.ts.map +1 -1
- package/dist/core/ResourceBindings.js +5 -4
- package/dist/core/ResourceBindings.js.map +1 -1
- package/dist/core/ResourceMutations.d.ts +4 -4
- package/dist/core/ResourceMutations.d.ts.map +1 -1
- package/dist/core/ResourceMutations.js +2 -3
- package/dist/core/ResourceMutations.js.map +1 -1
- package/dist/core/ResourceSelector.d.ts +10 -3
- package/dist/core/ResourceSelector.d.ts.map +1 -1
- package/dist/core/ResourceSelector.js +52 -13
- package/dist/core/ResourceSelector.js.map +1 -1
- package/dist/core/ResourceTransfers.d.ts.map +1 -1
- package/dist/core/ResourceTransfers.js +4 -2
- package/dist/core/ResourceTransfers.js.map +1 -1
- package/dist/core/SchemeRegistry.d.ts +2 -0
- package/dist/core/SchemeRegistry.d.ts.map +1 -1
- package/dist/core/SchemeRegistry.js +11 -5
- package/dist/core/SchemeRegistry.js.map +1 -1
- package/dist/core/StoredPacket.d.ts +3 -1
- package/dist/core/StoredPacket.d.ts.map +1 -1
- package/dist/core/StoredPacket.js +7 -3
- package/dist/core/StoredPacket.js.map +1 -1
- package/dist/core/StrikeRail.d.ts.map +1 -1
- package/dist/core/StrikeRail.js +9 -3
- package/dist/core/StrikeRail.js.map +1 -1
- package/dist/core/TerminalResult.d.ts +2 -2
- package/dist/core/TerminalResult.d.ts.map +1 -1
- package/dist/core/TerminalResult.js +15 -8
- package/dist/core/TerminalResult.js.map +1 -1
- package/dist/core/ToolInputSchema.d.ts.map +1 -1
- package/dist/core/ToolInputSchema.js +24 -8
- package/dist/core/ToolInputSchema.js.map +1 -1
- package/dist/core/ToolResources.d.ts +1 -0
- package/dist/core/ToolResources.d.ts.map +1 -1
- package/dist/core/ToolResources.js +45 -23
- package/dist/core/ToolResources.js.map +1 -1
- package/dist/core/Turn.d.ts +3 -1
- package/dist/core/Turn.d.ts.map +1 -1
- package/dist/core/Turn.js +4 -1
- package/dist/core/Turn.js.map +1 -1
- package/dist/core/Turn.sql +14 -2
- package/dist/core/TurnDispositionHandler.d.ts +13 -21
- package/dist/core/TurnDispositionHandler.d.ts.map +1 -1
- package/dist/core/TurnDispositionHandler.js +32 -190
- package/dist/core/TurnDispositionHandler.js.map +1 -1
- package/dist/core/TurnMaterialization.d.ts +9 -7
- package/dist/core/TurnMaterialization.d.ts.map +1 -1
- package/dist/core/TurnMaterialization.js +63 -41
- package/dist/core/TurnMaterialization.js.map +1 -1
- package/dist/core/TurnMaterialization.sql +23 -6
- package/dist/core/TurnOps.js +1 -1
- package/dist/core/TurnRunner.d.ts +1 -3
- package/dist/core/TurnRunner.d.ts.map +1 -1
- package/dist/core/TurnRunner.js +148 -189
- package/dist/core/TurnRunner.js.map +1 -1
- package/dist/core/TurnRunner.sql +1 -24
- package/dist/core/TurnSources.sql +42 -11
- package/dist/core/WorkerName.d.ts +1 -1
- package/dist/core/WorkerName.d.ts.map +1 -1
- package/dist/core/WorkerName.js +3 -3
- package/dist/core/WorkerName.js.map +1 -1
- package/dist/core/ambient.sql +45 -19
- package/dist/core/attachments.d.ts +3 -1
- package/dist/core/attachments.d.ts.map +1 -1
- package/dist/core/attachments.js +4 -0
- package/dist/core/attachments.js.map +1 -1
- package/dist/core/caps/CoreInteractionCaps.d.ts +1 -1
- package/dist/core/caps/CoreInteractionCaps.d.ts.map +1 -1
- package/dist/core/caps/CoreInteractionCaps.js +4 -2
- package/dist/core/caps/CoreInteractionCaps.js.map +1 -1
- package/dist/core/caps/DbChannelCaps.js +6 -6
- package/dist/core/caps/DbChannelCaps.js.map +1 -1
- package/dist/core/caps/DbEntryCaps.js +1 -1
- package/dist/core/caps/DbEntryCaps.js.map +1 -1
- package/dist/core/caps/DbMessageCaps.d.ts +10 -0
- package/dist/core/caps/DbMessageCaps.d.ts.map +1 -0
- package/dist/core/caps/DbMessageCaps.js +39 -0
- package/dist/core/caps/DbMessageCaps.js.map +1 -0
- package/dist/core/caps/DbProjectionCaps.d.ts +2 -2
- package/dist/core/caps/DbProjectionCaps.d.ts.map +1 -1
- package/dist/core/caps/DbProjectionCaps.js +10 -4
- package/dist/core/caps/DbProjectionCaps.js.map +1 -1
- package/dist/core/caps/SchemeCtxImpl.d.ts +3 -1
- package/dist/core/caps/SchemeCtxImpl.d.ts.map +1 -1
- package/dist/core/caps/SchemeCtxImpl.js +11 -0
- package/dist/core/caps/SchemeCtxImpl.js.map +1 -1
- package/dist/core/fork.sql +7 -6
- package/dist/core/git-state.d.ts +3 -2
- package/dist/core/git-state.d.ts.map +1 -1
- package/dist/core/git-state.js +37 -20
- package/dist/core/git-state.js.map +1 -1
- package/dist/core/packet-inject.js +1 -1
- package/dist/core/packet-wire.d.ts +11 -0
- package/dist/core/packet-wire.d.ts.map +1 -1
- package/dist/core/packet-wire.js +112 -88
- package/dist/core/packet-wire.js.map +1 -1
- package/dist/core/plurnk-uri.d.ts +4 -5
- package/dist/core/plurnk-uri.d.ts.map +1 -1
- package/dist/core/plurnk-uri.js +10 -31
- package/dist/core/plurnk-uri.js.map +1 -1
- package/dist/core/scheme-types.d.ts +3 -1
- package/dist/core/scheme-types.d.ts.map +1 -1
- package/dist/core/scheme-types.js +1 -1
- package/dist/core/scheme-types.js.map +1 -1
- package/dist/core/teaching.d.ts.map +1 -1
- package/dist/core/teaching.js +2 -1
- package/dist/core/teaching.js.map +1 -1
- package/dist/core/types.d.ts +1 -2
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js +1 -1
- package/dist/core/types.js.map +1 -1
- package/dist/core/worker-ops.sql +3 -8
- package/dist/digest/Digest.d.ts.map +1 -1
- package/dist/digest/Digest.js +35 -30
- package/dist/digest/Digest.js.map +1 -1
- package/dist/digest/DigestRender.d.ts +1 -0
- package/dist/digest/DigestRender.d.ts.map +1 -1
- package/dist/digest/DigestRender.js +53 -1
- package/dist/digest/DigestRender.js.map +1 -1
- package/dist/digest/DigestRequiem.d.ts.map +1 -1
- package/dist/digest/DigestRequiem.js +13 -15
- package/dist/digest/DigestRequiem.js.map +1 -1
- package/dist/digest/digest-db.d.ts +3 -0
- package/dist/digest/digest-db.d.ts.map +1 -0
- package/dist/digest/digest-db.js +68 -0
- package/dist/digest/digest-db.js.map +1 -0
- package/dist/digest/digest-paths.d.ts +6 -0
- package/dist/digest/digest-paths.d.ts.map +1 -0
- package/dist/digest/digest-paths.js +23 -0
- package/dist/digest/digest-paths.js.map +1 -0
- package/dist/digest/digest-rows.d.ts +15 -0
- package/dist/digest/digest-rows.d.ts.map +1 -1
- package/dist/digest/digest.sql +13 -3
- package/dist/index.d.ts +0 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -1
- package/dist/index.js.map +1 -1
- package/dist/observe/genai.d.ts +2 -2
- package/dist/observe/genai.d.ts.map +1 -1
- package/dist/observe/genai.js +15 -5
- package/dist/observe/genai.js.map +1 -1
- package/dist/schemes/EffectPolicy.d.ts +0 -2
- package/dist/schemes/EffectPolicy.d.ts.map +1 -1
- package/dist/schemes/EffectPolicy.js +25 -36
- package/dist/schemes/EffectPolicy.js.map +1 -1
- package/dist/schemes/Exec.d.ts +4 -5
- package/dist/schemes/Exec.d.ts.map +1 -1
- package/dist/schemes/Exec.js +74 -62
- package/dist/schemes/Exec.js.map +1 -1
- package/dist/schemes/ExecOutputScheme.d.ts +6 -5
- package/dist/schemes/ExecOutputScheme.d.ts.map +1 -1
- package/dist/schemes/ExecOutputScheme.js +49 -16
- package/dist/schemes/ExecOutputScheme.js.map +1 -1
- package/dist/schemes/File.d.ts.map +1 -1
- package/dist/schemes/File.js +28 -20
- package/dist/schemes/File.js.map +1 -1
- package/dist/schemes/Log.d.ts +4 -4
- package/dist/schemes/Log.d.ts.map +1 -1
- package/dist/schemes/Log.js +29 -9
- package/dist/schemes/Log.js.map +1 -1
- package/dist/schemes/QuestionTool.d.ts.map +1 -1
- package/dist/schemes/QuestionTool.js +14 -1
- package/dist/schemes/QuestionTool.js.map +1 -1
- package/dist/schemes/TurnSource.d.ts +3 -2
- package/dist/schemes/TurnSource.d.ts.map +1 -1
- package/dist/schemes/TurnSource.js +80 -35
- package/dist/schemes/TurnSource.js.map +1 -1
- package/dist/schemes/Worker.d.ts.map +1 -1
- package/dist/schemes/Worker.js +22 -56
- package/dist/schemes/Worker.js.map +1 -1
- package/dist/schemes/_entry-crud.js +6 -6
- package/dist/schemes/_entry-crud.js.map +1 -1
- package/dist/schemes/_entry-crud.sql +19 -17
- package/dist/schemes/_entry-find.d.ts.map +1 -1
- package/dist/schemes/_entry-find.js +6 -5
- package/dist/schemes/_entry-find.js.map +1 -1
- package/dist/schemes/_entry-fts.d.ts.map +1 -1
- package/dist/schemes/_entry-fts.js +6 -3
- package/dist/schemes/_entry-fts.js.map +1 -1
- package/dist/schemes/_entry-fts.sql +25 -6
- package/dist/schemes/_entry-manifest.d.ts +1 -1
- package/dist/schemes/_entry-manifest.d.ts.map +1 -1
- package/dist/schemes/_entry-manifest.js +5 -3
- package/dist/schemes/_entry-manifest.js.map +1 -1
- package/dist/schemes/_entry-ops.js +4 -4
- package/dist/schemes/_entry-ops.js.map +1 -1
- package/dist/schemes/_entry-ops.sql +2 -2
- package/dist/schemes/_entry-readable.d.ts.map +1 -1
- package/dist/schemes/_entry-readable.js +5 -4
- package/dist/schemes/_entry-readable.js.map +1 -1
- package/dist/schemes/_entry-send.js +2 -2
- package/dist/schemes/_entry-send.js.map +1 -1
- package/dist/schemes/_search-exclusion.d.ts +1 -0
- package/dist/schemes/_search-exclusion.d.ts.map +1 -1
- package/dist/schemes/_search-exclusion.js +12 -0
- package/dist/schemes/_search-exclusion.js.map +1 -1
- package/dist/schemes/_search-index.js +4 -4
- package/dist/schemes/_search-index.js.map +1 -1
- package/dist/schemes/exec-abort.d.ts.map +1 -1
- package/dist/schemes/exec-abort.js +4 -3
- package/dist/schemes/exec-abort.js.map +1 -1
- package/dist/schemes/exec-lifetime.d.ts +11 -0
- package/dist/schemes/exec-lifetime.d.ts.map +1 -0
- package/dist/schemes/exec-lifetime.js +29 -0
- package/dist/schemes/exec-lifetime.js.map +1 -0
- package/dist/server/ClientReads.d.ts.map +1 -1
- package/dist/server/ClientReads.js +3 -1
- package/dist/server/ClientReads.js.map +1 -1
- package/dist/server/Daemon.d.ts +30 -7
- package/dist/server/Daemon.d.ts.map +1 -1
- package/dist/server/Daemon.js +107 -48
- package/dist/server/Daemon.js.map +1 -1
- package/dist/server/DaemonModule.d.ts +19 -5
- package/dist/server/DaemonModule.d.ts.map +1 -1
- package/dist/server/DrainSupervisor.d.ts +13 -11
- package/dist/server/DrainSupervisor.d.ts.map +1 -1
- package/dist/server/DrainSupervisor.js +87 -98
- package/dist/server/DrainSupervisor.js.map +1 -1
- package/dist/server/EnvFunctionality.d.ts +12 -3
- package/dist/server/EnvFunctionality.d.ts.map +1 -1
- package/dist/server/EnvFunctionality.js +19 -14
- package/dist/server/EnvFunctionality.js.map +1 -1
- package/dist/server/Functionality.d.ts +2 -2
- package/dist/server/Functionality.d.ts.map +1 -1
- package/dist/server/Functionality.js +97 -62
- package/dist/server/Functionality.js.map +1 -1
- package/dist/server/FunctionalityManager.d.ts +3 -1
- package/dist/server/FunctionalityManager.d.ts.map +1 -1
- package/dist/server/FunctionalityManager.js +11 -5
- package/dist/server/FunctionalityManager.js.map +1 -1
- package/dist/server/HttpListener.d.ts +16 -0
- package/dist/server/HttpListener.d.ts.map +1 -0
- package/dist/server/HttpListener.js +81 -0
- package/dist/server/HttpListener.js.map +1 -0
- package/dist/server/MembersFunctionality.d.ts.map +1 -1
- package/dist/server/MembersFunctionality.js +12 -16
- package/dist/server/MembersFunctionality.js.map +1 -1
- package/dist/server/PlurnkSkill.d.ts.map +1 -1
- package/dist/server/PlurnkSkill.js +1 -0
- package/dist/server/PlurnkSkill.js.map +1 -1
- package/dist/server/Retention.d.ts +11 -0
- package/dist/server/Retention.d.ts.map +1 -1
- package/dist/server/Retention.js +47 -2
- package/dist/server/Retention.js.map +1 -1
- package/dist/server/Retention.sql +32 -1
- package/dist/server/ServiceModules.d.ts.map +1 -1
- package/dist/server/ServiceModules.js +2 -0
- package/dist/server/ServiceModules.js.map +1 -1
- package/dist/server/SkillsFunctionality.d.ts +2 -0
- package/dist/server/SkillsFunctionality.d.ts.map +1 -1
- package/dist/server/SkillsFunctionality.js +22 -15
- package/dist/server/SkillsFunctionality.js.map +1 -1
- package/dist/server/WorkspaceCapabilities.d.ts.map +1 -1
- package/dist/server/WorkspaceCapabilities.js +1 -0
- package/dist/server/WorkspaceCapabilities.js.map +1 -1
- package/dist/server/WorkspaceStorage.d.ts +8 -0
- package/dist/server/WorkspaceStorage.d.ts.map +1 -0
- package/dist/server/WorkspaceStorage.js +26 -0
- package/dist/server/WorkspaceStorage.js.map +1 -0
- package/dist/server/client-input.d.ts +4 -3
- package/dist/server/client-input.d.ts.map +1 -1
- package/dist/server/client-input.js +24 -26
- package/dist/server/client-input.js.map +1 -1
- package/dist/server/dispatch-as-plurnk.js +2 -2
- package/dist/server/dispatch-as-plurnk.js.map +1 -1
- package/dist/server/drain.sql +69 -132
- package/dist/server/envelope.d.ts +2 -2
- package/dist/server/envelope.d.ts.map +1 -1
- package/dist/server/envelope.js +7 -9
- package/dist/server/envelope.js.map +1 -1
- package/dist/server/envelope.sql +10 -6
- package/dist/server/exec-poll-backoff.js +3 -3
- package/dist/server/exec-poll-backoff.js.map +1 -1
- package/dist/server/lifecycle-recovery.sql +8 -35
- package/dist/server/logEntry.sql +2 -2
- package/dist/server/loopDocs.js +3 -3
- package/dist/server/loopDocs.sql +4 -2
- package/dist/server/model-catalog.d.ts.map +1 -1
- package/dist/server/model-catalog.js +2 -2
- package/dist/server/model-catalog.js.map +1 -1
- package/dist/server/seam-loop.sql +0 -1
- package/dist/server/workspace-storage.sql +8 -0
- package/dist/service.d.ts.map +1 -1
- package/dist/service.js +21 -10
- package/dist/service.js.map +1 -1
- package/docs/copy-move.md +31 -0
- package/docs/env.md +19 -7
- package/docs/skills.md +2 -2
- package/migrations/002_workers.sql +26 -17
- package/migrations/003_loops.sql +82 -28
- package/migrations/005_entries.sql +135 -22
- package/migrations/006_log.sql +77 -25
- package/migrations/007_subscriptions.sql +10 -15
- package/package.json +35 -36
- package/dist/core/PromptFrames.d.ts +0 -12
- package/dist/core/PromptFrames.d.ts.map +0 -1
- package/dist/core/PromptFrames.js +0 -28
- package/dist/core/PromptFrames.js.map +0 -1
- package/dist/schemes/Prompt.d.ts +0 -8
- package/dist/schemes/Prompt.d.ts.map +0 -1
- package/dist/schemes/Prompt.js +0 -25
- package/dist/schemes/Prompt.js.map +0 -1
|
@@ -28,7 +28,7 @@ export default class EnvFunctionality {
|
|
|
28
28
|
namespaceOwner = ENV_OWNER;
|
|
29
29
|
summary = "Read and shape the environment your commands run in";
|
|
30
30
|
definitionSchema = DEFINITION;
|
|
31
|
-
|
|
31
|
+
scopes = ["worker", "workspace"];
|
|
32
32
|
aliasPattern = NAME;
|
|
33
33
|
docsDir = Paths.packageRoot;
|
|
34
34
|
example = { alias: "CARGO_TARGET_DIR", definition: { value: "/tmp/shared" } };
|
|
@@ -107,16 +107,8 @@ export default class EnvFunctionality {
|
|
|
107
107
|
let cached;
|
|
108
108
|
return async () => cached ??= await EnvDefaults.collect(projectRoot, pluginsNodeModules);
|
|
109
109
|
}
|
|
110
|
-
// {§
|
|
111
|
-
|
|
112
|
-
// name. One rule with `list`, which projects the same state, so what a Worker sees listed is what
|
|
113
|
-
// its command receives. The state is the coordinator's persisted shape ({§functionality-state});
|
|
114
|
-
// anything else is a defect, not a fallback. The invariant runs last, as at every layer.
|
|
115
|
-
//
|
|
116
|
-
// Beside the environment comes its record: every name with its provenance, which the spawn
|
|
117
|
-
// writes on its own log row and the digest renders — the host-versus-container confound closed
|
|
118
|
-
// where it starts.
|
|
119
|
-
static compose(ambient, state, modifier = {}) {
|
|
110
|
+
// {§workspace-env} Apply one persisted layer and record the provenance beside its values.
|
|
111
|
+
static compose(ambient, state, modifier = {}, scope = "worker") {
|
|
120
112
|
if (!isRecord(state) || state.version !== 1 || !isRecord(state.definitions))
|
|
121
113
|
throw new Error("env state is not a version 1 record");
|
|
122
114
|
const env = { ...ambient };
|
|
@@ -131,9 +123,9 @@ export default class EnvFunctionality {
|
|
|
131
123
|
record[name] = { source: "masked", ...from };
|
|
132
124
|
continue;
|
|
133
125
|
}
|
|
134
|
-
if (entry.origin === "service")
|
|
126
|
+
if (entry.origin === "service" || (scope === "worker" && entry.origin === "workspace"))
|
|
135
127
|
continue;
|
|
136
|
-
if (entry.origin !==
|
|
128
|
+
if (entry.origin !== scope)
|
|
137
129
|
throw new Error(`env state for '${name}' has origin '${String(entry.origin)}'`);
|
|
138
130
|
if (!isRecord(entry.definition) || typeof entry.definition.value !== "string")
|
|
139
131
|
throw new Error(`env state for '${name}' holds no string value`);
|
|
@@ -143,7 +135,7 @@ export default class EnvFunctionality {
|
|
|
143
135
|
continue;
|
|
144
136
|
}
|
|
145
137
|
env[name] = entry.definition.value;
|
|
146
|
-
record[name] = { source:
|
|
138
|
+
record[name] = { source: scope, ...from, value: entry.definition.value };
|
|
147
139
|
}
|
|
148
140
|
// {§env-option} — the op's own environment, nearest the spawn; admitted by name already.
|
|
149
141
|
for (const [name, value] of Object.entries(modifier)) {
|
|
@@ -159,6 +151,19 @@ export default class EnvFunctionality {
|
|
|
159
151
|
}
|
|
160
152
|
return { env, record };
|
|
161
153
|
}
|
|
154
|
+
// {§workspace-env} Both execution and capability startup read these same persisted layers.
|
|
155
|
+
static async workspace(db, workspaceId) {
|
|
156
|
+
const row = await db.workspace_module_state_get.get({ workspace_id: workspaceId, namespace_owner: ENV_OWNER });
|
|
157
|
+
const state = row === undefined ? { version: 1, definitions: {} } : JSON.parse(row.state);
|
|
158
|
+
return (ambient = ExecEnv.scoped()) => this.compose(ambient, state, {}, "workspace");
|
|
159
|
+
}
|
|
160
|
+
static async resolve(db, workspaceId, workerId, modifier = {}, ambient = ExecEnv.scoped()) {
|
|
161
|
+
const empty = { version: 1, definitions: {} };
|
|
162
|
+
const shared = (await this.workspace(db, workspaceId))(ambient);
|
|
163
|
+
const worker = workerId === undefined ? undefined : await db.worker_module_state_get.get({ worker_id: workerId, namespace_owner: ENV_OWNER });
|
|
164
|
+
const result = this.compose(shared.env, worker === undefined ? empty : JSON.parse(worker.state), modifier);
|
|
165
|
+
return { env: result.env, record: { ...shared.record, ...Object.fromEntries(Object.entries(result.record).filter(([, item]) => item.source !== "host")) } };
|
|
166
|
+
}
|
|
162
167
|
// {§env-option} — the heading's `env` option, read through the one metadata reader and admitted
|
|
163
168
|
// by the family's own rules: an object of string values under names a shell can export, never
|
|
164
169
|
// plurnk's own. A refusal names the key and the reason, so the model learns why, exactly as `add`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EnvFunctionality.js","sourceRoot":"","sources":["../../src/server/EnvFunctionality.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"EnvFunctionality.js","sourceRoot":"","sources":["../../src/server/EnvFunctionality.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { FunctionalityAdapter, FunctionalityCaller, FunctionalityFamilyHandle, FunctionalityIdentity, ModuleActionRegistration, WorkspaceCapabilityIdentity, WorkspaceCapabilityGate, WorkspaceCapabilityProvider, WorkspaceCapabilityReplacement, WorkspaceCapabilityPublication } from "./DaemonModule.ts";
|
|
1
|
+
import type { FunctionalityAdapter, FunctionalityCaller, FunctionalityFamilyHandle, FunctionalityIdentity, FunctionalityOptions, ModuleActionRegistration, WorkspaceCapabilityIdentity, WorkspaceCapabilityGate, WorkspaceCapabilityProvider, WorkspaceCapabilityReplacement, WorkspaceCapabilityPublication } from "./DaemonModule.ts";
|
|
2
2
|
import { type FunctionalityVerb } from "./FunctionalityManager.ts";
|
|
3
3
|
export interface FunctionalityHost {
|
|
4
4
|
registerModuleAction(registration: ModuleActionRegistration): void;
|
|
@@ -28,6 +28,6 @@ export default class Functionality {
|
|
|
28
28
|
pathname: string;
|
|
29
29
|
content: string;
|
|
30
30
|
}>;
|
|
31
|
-
invoke(family: string, verb: FunctionalityVerb, params: unknown, identity: FunctionalityIdentity, caller: FunctionalityCaller): Promise<FunctionalityInvocation>;
|
|
31
|
+
invoke(family: string, verb: FunctionalityVerb, params: unknown, identity: FunctionalityIdentity, caller: FunctionalityCaller, options?: FunctionalityOptions): Promise<FunctionalityInvocation>;
|
|
32
32
|
}
|
|
33
33
|
//# sourceMappingURL=Functionality.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Functionality.d.ts","sourceRoot":"","sources":["../../src/server/Functionality.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Functionality.d.ts","sourceRoot":"","sources":["../../src/server/Functionality.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EACR,oBAAoB,EACpB,mBAAmB,EACnB,yBAAyB,EACzB,qBAAqB,EACrB,oBAAoB,EAGpB,wBAAwB,EAExB,2BAA2B,EAC3B,uBAAuB,EACvB,2BAA2B,EAC3B,8BAA8B,EAC9B,8BAA8B,EACjC,MAAM,mBAAmB,CAAC;AAC3B,OAA6B,EAGzB,KAAK,iBAAiB,EACzB,MAAM,2BAA2B,CAAC;AAInC,MAAM,WAAW,iBAAiB;IAC9B,oBAAoB,CAAC,YAAY,EAAE,wBAAwB,GAAG,IAAI,CAAC;IACnE,mCAAmC,CAAC,cAAc,EAAE,MAAM,EAAE,QAAQ,EAAE,2BAA2B,GAAG,IAAI,CAAC;IACzG,wBAAwB,CAAC,WAAW,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IAC/F,4BAA4B,CACxB,WAAW,EAAE,8BAA8B,EAC3C,OAAO,CAAC,EAAE,8BAA8B,GACzC,OAAO,CAAC,IAAI,CAAC,CAAC;IAGjB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IACzF,wBAAwB,CAAC,QAAQ,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACzG,eAAe,CAAC,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,mBAAmB,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAChI,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,IAAI,CAAC;CACpD;AAMD,YAAY,EAAE,mBAAmB,EAAE,CAAC;AAEpC,MAAM,WAAW,uBAAuB;IACpC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;CAC1B;AAqED,MAAM,CAAC,OAAO,OAAO,aAAa;;IAQ9B,YAAY,IAAI,EAAE,iBAAiB,EAElC;IAID,QAAQ,CAAC,OAAO,EAAE,oBAAoB,GAAG,yBAAyB,CA6EjE;IAOK,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,2BAA2B,EAAE,OAAO,GAAE;QAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,uBAAuB,CAAA;KAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAW7I;IAED,QAAQ,IAAI,MAAM,EAAE,CAEnB;IAIK,MAAM,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAKhD;IAmBD,SAAS,CAAC,WAAW,EAAE,MAAM,GAAG,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAS3E;IAGK,MAAM,CACR,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,iBAAiB,EACvB,MAAM,EAAE,OAAO,EACf,QAAQ,EAAE,qBAAqB,EAC/B,MAAM,EAAE,mBAAmB,EAC3B,OAAO,GAAE,oBAAyB,GACnC,OAAO,CAAC,uBAAuB,CAAC,CAkClC;CA2ZJ"}
|
|
@@ -6,6 +6,7 @@ var _a;
|
|
|
6
6
|
// generated executor family whose host verbs propose. An explicit
|
|
7
7
|
// client mutation and an accepted model proposal converge on `invoke`.
|
|
8
8
|
import { Validator } from "@plurnk/plurnk-contracts";
|
|
9
|
+
import discoverySchema from "@plurnk/plurnk-contracts/schema/FunctionalityDiscoverQuery.json" with { type: "json" };
|
|
9
10
|
import { isDeepStrictEqual } from "node:util";
|
|
10
11
|
import { DocFile } from "@plurnk/plurnk-execs";
|
|
11
12
|
import FunctionalityManager, { FUNCTIONALITY_VERBS, functionalityRuntimeDecl, } from "./FunctionalityManager.js";
|
|
@@ -17,6 +18,7 @@ const ALIAS = /^[a-z][a-z0-9-]*$/u;
|
|
|
17
18
|
// A family may declare its own alias grammar ({§functionality-adapter}); the coordinator enforces it
|
|
18
19
|
// wherever an alias enters: admission, the service projection, and persisted state.
|
|
19
20
|
const aliasPattern = (adapter) => adapter.aliasPattern ?? ALIAS;
|
|
21
|
+
const scopesOf = (adapter) => adapter.scopes ?? ["workspace"];
|
|
20
22
|
const EMPTY_STATE = Object.freeze({ version: STATE_VERSION, definitions: Object.freeze({}) });
|
|
21
23
|
const SCHEMA = (name) => ({ $ref: `https://schemas.plurnk.xyz/v0/${name}.json` });
|
|
22
24
|
const ALIAS_INPUT = Object.freeze({
|
|
@@ -52,21 +54,37 @@ class Functionality {
|
|
|
52
54
|
throw new Error(`Functionality namespace owner '${namespaceOwner}' is already registered.`);
|
|
53
55
|
if (!isRecord(adapter.definitionSchema))
|
|
54
56
|
throw new Error(`Functionality family '${family}' requires a definition schema.`);
|
|
57
|
+
const scopes = scopesOf(adapter);
|
|
58
|
+
if (scopes.length === 0 || new Set(scopes).size !== scopes.length || scopes.some((scope) => scope !== "workspace" && scope !== "worker")) {
|
|
59
|
+
throw new Error(`Functionality family '${family}' declares invalid scopes.`);
|
|
60
|
+
}
|
|
61
|
+
const scopeProperties = scopes.length > 1
|
|
62
|
+
? { scope: { enum: [...scopes], description: `Definition scope; model calls default to ${scopes[0]}.` } }
|
|
63
|
+
: {};
|
|
64
|
+
const scopedInput = (schema) => {
|
|
65
|
+
if (scopes.length === 1)
|
|
66
|
+
return schema;
|
|
67
|
+
const { $id: _id, ...source } = schema;
|
|
68
|
+
if (!isRecord(source.properties))
|
|
69
|
+
throw new Error(`Functionality ${family} input has no property map.`);
|
|
70
|
+
return { ...source, properties: { ...source.properties, ...scopeProperties } };
|
|
71
|
+
};
|
|
55
72
|
const schemas = Object.freeze({
|
|
56
|
-
list: EMPTY_INPUT,
|
|
57
|
-
discover: SCHEMA("FunctionalityDiscoverQuery"),
|
|
73
|
+
list: scopedInput(EMPTY_INPUT),
|
|
74
|
+
discover: scopes.length === 1 ? SCHEMA("FunctionalityDiscoverQuery") : scopedInput(discoverySchema),
|
|
58
75
|
add: Object.freeze({
|
|
59
76
|
type: "object",
|
|
60
77
|
additionalProperties: false,
|
|
61
78
|
required: ["definition"],
|
|
62
79
|
properties: {
|
|
80
|
+
...scopeProperties,
|
|
63
81
|
alias: { type: "string", minLength: 1 },
|
|
64
82
|
definition: adapter.definitionSchema,
|
|
65
83
|
},
|
|
66
84
|
}),
|
|
67
|
-
enable: ALIAS_INPUT,
|
|
68
|
-
disable: ALIAS_INPUT,
|
|
69
|
-
remove: ALIAS_INPUT,
|
|
85
|
+
enable: scopedInput(ALIAS_INPUT),
|
|
86
|
+
disable: scopedInput(ALIAS_INPUT),
|
|
87
|
+
remove: scopedInput(ALIAS_INPUT),
|
|
70
88
|
});
|
|
71
89
|
// {§functionality-model-projection} — the taught `add` example must satisfy the schema it teaches.
|
|
72
90
|
if (adapter.example !== undefined) {
|
|
@@ -82,29 +100,28 @@ class Functionality {
|
|
|
82
100
|
activate: (context) => this.#activate(adapter, context),
|
|
83
101
|
deactivate: (identity) => this.#deactivate(adapter, identity),
|
|
84
102
|
});
|
|
85
|
-
// {§functionality-scope}
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
});
|
|
103
|
+
// {§functionality-scope} The action context binds one of the family's supported scopes.
|
|
104
|
+
for (const scope of scopes) {
|
|
105
|
+
for (const verb of FUNCTIONALITY_VERBS) {
|
|
106
|
+
this.#host.registerModuleAction({
|
|
107
|
+
name: `${scope}.${family}.${verb}`,
|
|
108
|
+
scope,
|
|
109
|
+
inputSchema: schemas[verb],
|
|
110
|
+
outputSchema: SCHEMA(verb === "list"
|
|
111
|
+
? "FunctionalityListResult"
|
|
112
|
+
: verb === "discover"
|
|
113
|
+
? "FunctionalityDiscoverResult"
|
|
114
|
+
: "FunctionalityMutationResult"),
|
|
115
|
+
handler: async (params, context) => {
|
|
116
|
+
if (context.scope === "worldless" || context.scope !== scope)
|
|
117
|
+
throw new Error(`${scope}.${family}.${verb} requires a ${scope}-scoped context.`);
|
|
118
|
+
const identity = context.scope === "worker"
|
|
119
|
+
? { workspaceId: context.workspaceId, workerId: context.workerId, scope }
|
|
120
|
+
: { workspaceId: context.workspaceId, scope };
|
|
121
|
+
return (await this.invoke(family, verb, params, identity, "action")).body;
|
|
122
|
+
},
|
|
123
|
+
});
|
|
124
|
+
}
|
|
108
125
|
}
|
|
109
126
|
return {
|
|
110
127
|
invoke: (verb, params, identity) => this.invoke(family, verb, params, identity, "action"),
|
|
@@ -167,7 +184,7 @@ class Functionality {
|
|
|
167
184
|
return out;
|
|
168
185
|
}
|
|
169
186
|
// The one lifecycle entry for both projections ({§functionality-model-mutation}).
|
|
170
|
-
async invoke(family, verb, params, identity, caller) {
|
|
187
|
+
async invoke(family, verb, params, identity, caller, options = {}) {
|
|
171
188
|
const adapter = this.#adapter(family);
|
|
172
189
|
const schema = this.#schemas.get(family)[verb];
|
|
173
190
|
const validation = Validator.validateJsonSchemaInstance(schema, params);
|
|
@@ -179,19 +196,26 @@ class Functionality {
|
|
|
179
196
|
});
|
|
180
197
|
}
|
|
181
198
|
const input = params;
|
|
182
|
-
|
|
183
|
-
|
|
199
|
+
const scope = (input.scope ?? identity.scope ?? scopesOf(adapter)[0]);
|
|
200
|
+
if (!scopesOf(adapter).includes(scope) || (identity.scope !== undefined && identity.scope !== scope)) {
|
|
201
|
+
throw failure(family, "scope-mismatch", 400, `The ${family} operation's scope does not match its bound context.`, { retryable: false });
|
|
202
|
+
}
|
|
203
|
+
identity = { ...identity, scope };
|
|
204
|
+
if (verb === "discover") {
|
|
205
|
+
const { scope: _scope, ...query } = input;
|
|
206
|
+
return { status: 200, body: await this.#discover(adapter, query, identity, options) };
|
|
207
|
+
}
|
|
184
208
|
// {§functionality-scope} — a worker-scoped family's list and mutations act for the invoking
|
|
185
209
|
// Worker. The state is that Worker's and nothing resident changes, so they serialize on the
|
|
186
210
|
// Worker's own lane and take no workspace exclusivity: a Worker shapes its environment while
|
|
187
211
|
// its siblings run.
|
|
188
|
-
if (
|
|
212
|
+
if (scope === "worker") {
|
|
189
213
|
const workerId = _a.#workerOf(adapter, identity);
|
|
190
|
-
return this.#serialize(`${this.#key(identity.workspaceId, family)}:${workerId}`, () => this.#invokeForWorker(adapter, verb, input, identity, workerId, caller));
|
|
214
|
+
return this.#serialize(`${this.#key(identity.workspaceId, family)}:${workerId}`, () => this.#invokeForWorker(adapter, verb, input, identity, workerId, caller, options));
|
|
191
215
|
}
|
|
192
216
|
if (verb === "list")
|
|
193
217
|
return { status: 200, body: await this.#list(adapter, identity) };
|
|
194
|
-
return this.#host.mutateWorkspace(identity.workspaceId, adapter.namespaceOwner, caller, () => this.#serialize(this.#key(identity.workspaceId, family), () => this.#mutate(adapter, verb, input, identity, caller)));
|
|
218
|
+
return this.#host.mutateWorkspace(identity.workspaceId, adapter.namespaceOwner, caller, () => this.#serialize(this.#key(identity.workspaceId, family), () => this.#mutate(adapter, verb, input, identity, caller, options)));
|
|
195
219
|
}
|
|
196
220
|
// A worker-scoped verb that names no Worker is a defect at the projection, never a client
|
|
197
221
|
// failure: both projections name the Worker ({§functionality-model-projection}).
|
|
@@ -202,8 +226,8 @@ class Functionality {
|
|
|
202
226
|
}
|
|
203
227
|
// The origin a definition carries when this family owns it locally. Service definitions
|
|
204
228
|
// always come from the adapter's own `available()`; everything else is the family's own.
|
|
205
|
-
static #localOrigin(
|
|
206
|
-
return
|
|
229
|
+
static #localOrigin(identity) {
|
|
230
|
+
return identity.scope ?? "workspace";
|
|
207
231
|
}
|
|
208
232
|
#adapter(family) {
|
|
209
233
|
const adapter = this.#adapters.get(family);
|
|
@@ -238,12 +262,12 @@ class Functionality {
|
|
|
238
262
|
});
|
|
239
263
|
}
|
|
240
264
|
async #loadState(adapter, workspaceId) {
|
|
241
|
-
return _a.#parseState(adapter, await this.#host.readWorkspaceModuleState(workspaceId, adapter.namespaceOwner), `workspace ${workspaceId}
|
|
265
|
+
return _a.#parseState(adapter, await this.#host.readWorkspaceModuleState(workspaceId, adapter.namespaceOwner), `workspace ${workspaceId}`, "workspace");
|
|
242
266
|
}
|
|
243
267
|
async #loadWorkerState(adapter, workerId) {
|
|
244
|
-
return _a.#parseState(adapter, await this.#host.readWorkerModuleState(workerId, adapter.namespaceOwner), `worker ${workerId}
|
|
268
|
+
return _a.#parseState(adapter, await this.#host.readWorkerModuleState(workerId, adapter.namespaceOwner), `worker ${workerId}`, "worker");
|
|
245
269
|
}
|
|
246
|
-
static #parseState(adapter, raw, where) {
|
|
270
|
+
static #parseState(adapter, raw, where, scope) {
|
|
247
271
|
if (raw === null)
|
|
248
272
|
return EMPTY_STATE;
|
|
249
273
|
if (!isRecord(raw) || raw.version !== STATE_VERSION || !isRecord(raw.definitions)) {
|
|
@@ -257,11 +281,14 @@ class Functionality {
|
|
|
257
281
|
if ((origin !== "service" && origin !== "workspace" && origin !== "worker") || typeof enabled !== "boolean") {
|
|
258
282
|
throw new Error(`Functionality state for ${adapter.family} alias '${alias}' is malformed.`);
|
|
259
283
|
}
|
|
260
|
-
if (
|
|
284
|
+
if (origin !== "service" && origin !== scope && !(scope === "worker" && origin === "workspace" && scopesOf(adapter).includes("workspace"))) {
|
|
285
|
+
throw new Error(`Functionality state for ${adapter.family} alias '${alias}' has an invalid origin for ${scope} scope.`);
|
|
286
|
+
}
|
|
287
|
+
if (inherited !== undefined && (typeof inherited !== "string" || inherited.length === 0 || scope !== "worker")) {
|
|
261
288
|
throw new Error(`Functionality state for ${adapter.family} alias '${alias}' carries an invalid inheritance.`);
|
|
262
289
|
}
|
|
263
290
|
const provenance = inherited === undefined ? {} : { inherited };
|
|
264
|
-
if (origin ===
|
|
291
|
+
if (origin === scope) {
|
|
265
292
|
const result = Validator.validateJsonSchemaInstance(adapter.definitionSchema, definition);
|
|
266
293
|
if (!result.valid)
|
|
267
294
|
throw new Error(`Functionality state for ${adapter.family} alias '${alias}' holds an invalid definition.`);
|
|
@@ -269,7 +296,7 @@ class Functionality {
|
|
|
269
296
|
}
|
|
270
297
|
else {
|
|
271
298
|
if (definition !== undefined)
|
|
272
|
-
throw new Error(`Functionality state for ${adapter.family} alias '${alias}' persists a
|
|
299
|
+
throw new Error(`Functionality state for ${adapter.family} alias '${alias}' persists a lower-layer definition.`);
|
|
273
300
|
definitions[alias] = { origin, enabled, ...provenance };
|
|
274
301
|
}
|
|
275
302
|
}
|
|
@@ -280,16 +307,21 @@ class Functionality {
|
|
|
280
307
|
}
|
|
281
308
|
async #effective(adapter, identity, state) {
|
|
282
309
|
const effective = new Map();
|
|
283
|
-
|
|
310
|
+
const local = _a.#localOrigin(identity);
|
|
311
|
+
const inheritsWorkspace = identity.scope === "worker" && scopesOf(adapter).includes("workspace");
|
|
312
|
+
const lower = inheritsWorkspace
|
|
313
|
+
? [...(await this.#effective(adapter, { workspaceId: identity.workspaceId, scope: "workspace" }, await this.#loadState(adapter, identity.workspaceId))).values()]
|
|
314
|
+
: (await adapter.available(identity)).map((entry) => ({ ...entry, origin: "service" }));
|
|
315
|
+
for (const service of lower) {
|
|
284
316
|
if (!aliasPattern(adapter).test(service.alias))
|
|
285
317
|
throw new Error(`${adapter.family} service alias '${service.alias}' must match ${aliasPattern(adapter)}.`);
|
|
286
318
|
const record = state.definitions[service.alias];
|
|
287
|
-
const
|
|
288
|
-
const
|
|
289
|
-
|
|
319
|
+
const overlay = record !== undefined && record.origin !== local ? record : undefined;
|
|
320
|
+
const enabled = overlay === undefined ? service.enabled : overlay.enabled && (!inheritsWorkspace || service.enabled);
|
|
321
|
+
const inherited = overlay?.inherited === undefined ? {} : { inherited: overlay.inherited };
|
|
322
|
+
effective.set(service.alias, { alias: service.alias, origin: service.origin, definition: service.definition, enabled, ...inherited });
|
|
290
323
|
}
|
|
291
324
|
for (const [alias, record] of Object.entries(state.definitions)) {
|
|
292
|
-
const local = _a.#localOrigin(adapter);
|
|
293
325
|
if (record.origin !== local)
|
|
294
326
|
continue;
|
|
295
327
|
const inherited = record.inherited === undefined ? {} : { inherited: record.inherited };
|
|
@@ -323,22 +355,22 @@ class Functionality {
|
|
|
323
355
|
definitions: [...effective.values()].map((definition) => this.#projection(definition, outcomes.get(definition.alias))),
|
|
324
356
|
});
|
|
325
357
|
}
|
|
326
|
-
async #discover(adapter, query, identity) {
|
|
327
|
-
const candidates = await adapter.discover(query, identity);
|
|
358
|
+
async #discover(adapter, query, identity, options) {
|
|
359
|
+
const candidates = await adapter.discover(query, identity, options);
|
|
328
360
|
return Validator.assertFunctionalityDiscoverResult({ family: adapter.family, candidates: [...candidates] });
|
|
329
361
|
}
|
|
330
362
|
// The verb semantics, one implementation for every family ({§functionality-scope}): the next
|
|
331
363
|
// state, the alias it concerns, and how the mutation reports. Only publication differs by scope.
|
|
332
|
-
async #transition(adapter, verb, input, identity, caller, state, effective) {
|
|
333
|
-
const local = _a.#localOrigin(
|
|
334
|
-
const here =
|
|
364
|
+
async #transition(adapter, verb, input, identity, caller, state, effective, options) {
|
|
365
|
+
const local = _a.#localOrigin(identity);
|
|
366
|
+
const here = local === "worker" ? "this worker" : "this workspace";
|
|
335
367
|
const definitions = { ...state.definitions };
|
|
336
368
|
let alias;
|
|
337
369
|
let status = 200;
|
|
338
370
|
let removed = false;
|
|
339
371
|
switch (verb) {
|
|
340
372
|
case "add": {
|
|
341
|
-
const admitted = await adapter.admit(input, identity, caller);
|
|
373
|
+
const admitted = await adapter.admit(input, identity, caller, options);
|
|
342
374
|
alias = admitted.alias;
|
|
343
375
|
if (!aliasPattern(adapter).test(alias))
|
|
344
376
|
throw failure(adapter.family, "alias-invalid", 400, `Alias '${alias}' must match ${aliasPattern(adapter)}.`, { alias, retryable: false });
|
|
@@ -360,7 +392,7 @@ class Functionality {
|
|
|
360
392
|
throw failure(adapter.family, "alias-unknown", 404, `'${alias}' is not available to ${here}.`, { alias, retryable: false });
|
|
361
393
|
definitions[alias] = current.origin === local
|
|
362
394
|
? { origin: local, definition: current.definition, enabled: verb === "enable" }
|
|
363
|
-
: { origin:
|
|
395
|
+
: { origin: current.origin, enabled: verb === "enable" };
|
|
364
396
|
break;
|
|
365
397
|
}
|
|
366
398
|
case "remove": {
|
|
@@ -370,11 +402,13 @@ class Functionality {
|
|
|
370
402
|
throw failure(adapter.family, "alias-unknown", 404, `'${alias}' is not available to ${here}.`, { alias, retryable: false });
|
|
371
403
|
if (current.origin === "service")
|
|
372
404
|
throw failure(adapter.family, "alias-service-owned", 409, `'${alias}' is a service definition and cannot be removed here.`, { alias, recovery: `Disable it, or change the service configuration that contributes it.`, retryable: false });
|
|
405
|
+
if (current.origin !== local)
|
|
406
|
+
throw failure(adapter.family, "alias-workspace-owned", 409, `'${alias}' is a workspace definition; remove it in workspace scope or disable it here.`, { alias, retryable: false });
|
|
373
407
|
await adapter.forget?.({ alias, definition: current.definition }, identity);
|
|
374
408
|
delete definitions[alias];
|
|
375
|
-
const revealed = (await adapter
|
|
409
|
+
const revealed = (await this.#effective(adapter, identity, EMPTY_STATE)).get(alias);
|
|
376
410
|
if (revealed)
|
|
377
|
-
definitions[alias] = { origin:
|
|
411
|
+
definitions[alias] = { origin: revealed.origin, enabled: false };
|
|
378
412
|
removed = true;
|
|
379
413
|
break;
|
|
380
414
|
}
|
|
@@ -394,13 +428,13 @@ class Functionality {
|
|
|
394
428
|
});
|
|
395
429
|
return { status: body.status, body };
|
|
396
430
|
}
|
|
397
|
-
async #mutate(adapter, verb, input, identity, caller) {
|
|
431
|
+
async #mutate(adapter, verb, input, identity, caller, options) {
|
|
398
432
|
const key = this.#key(identity.workspaceId, adapter.family);
|
|
399
433
|
const family = this.#families.get(key);
|
|
400
434
|
if (family === undefined)
|
|
401
435
|
throw failure(adapter.family, "workspace-not-resident", 409, `Workspace ${identity.workspaceId} has no resident ${adapter.family} Functionality.`, { recovery: "Retry through a workspace operation, then retry.", retryable: false });
|
|
402
436
|
const effective = await this.#effective(adapter, identity, family.state);
|
|
403
|
-
const transition = await this.#transition(adapter, verb, input, identity, caller, family.state, effective);
|
|
437
|
+
const transition = await this.#transition(adapter, verb, input, identity, caller, family.state, effective, options);
|
|
404
438
|
const nextState = { version: STATE_VERSION, definitions: transition.definitions };
|
|
405
439
|
// Re-enabling an alias that is not active retries its preparation; an
|
|
406
440
|
// already-active alias keeps its live attachment.
|
|
@@ -417,7 +451,7 @@ class Functionality {
|
|
|
417
451
|
// {§functionality-scope} — the Worker's own lane. State is read at each verb rather than held: the
|
|
418
452
|
// spawn reads the same row, and a Worker's row is written at its creation, so nothing in memory
|
|
419
453
|
// could be more current than the table.
|
|
420
|
-
async #invokeForWorker(adapter, verb, input, identity, workerId, caller) {
|
|
454
|
+
async #invokeForWorker(adapter, verb, input, identity, workerId, caller, options) {
|
|
421
455
|
if (!this.#families.has(this.#key(identity.workspaceId, adapter.family)))
|
|
422
456
|
throw failure(adapter.family, "workspace-not-resident", 409, `Workspace ${identity.workspaceId} has no resident ${adapter.family} Functionality.`, { recovery: "Retry through a workspace operation, then retry.", retryable: false });
|
|
423
457
|
const state = await this.#loadWorkerState(adapter, workerId);
|
|
@@ -430,7 +464,7 @@ class Functionality {
|
|
|
430
464
|
definitions: [...effective.values()].map((definition) => this.#projection(definition, prepared.outcomes.get(definition.alias))),
|
|
431
465
|
}) };
|
|
432
466
|
}
|
|
433
|
-
const transition = await this.#transition(adapter, verb, input, identity, caller, state, effective);
|
|
467
|
+
const transition = await this.#transition(adapter, verb, input, identity, caller, state, effective, options);
|
|
434
468
|
const nextState = { version: STATE_VERSION, definitions: transition.definitions };
|
|
435
469
|
const effectiveAfter = await this.#effective(adapter, identity, nextState);
|
|
436
470
|
const prepared = await this.#prepareForWorker(adapter, identity, effectiveAfter, caller === "action" ? "reject" : "publish-unavailable");
|
|
@@ -486,7 +520,7 @@ class Functionality {
|
|
|
486
520
|
const previous = this.#families.get(key)?.prepared ?? null;
|
|
487
521
|
// A worker-scoped family's workspace publication carries only its manager: what is enabled
|
|
488
522
|
// is decided per Worker, at each verb and each spawn ({§functionality-scope}).
|
|
489
|
-
const effective = adapter.
|
|
523
|
+
const effective = !scopesOf(adapter).includes("workspace") ? new Map() : await this.#effective(adapter, { ...identity, scope: "workspace" }, nextState);
|
|
490
524
|
const enabled = _a.#enabled(effective);
|
|
491
525
|
const prepared = await adapter.prepare({
|
|
492
526
|
workspaceId: identity.workspaceId,
|
|
@@ -509,9 +543,10 @@ class Functionality {
|
|
|
509
543
|
decl: functionalityRuntimeDecl(adapter.family, adapter.summary, await this.#documentBody(adapter)),
|
|
510
544
|
executor: new FunctionalityManager({
|
|
511
545
|
family: adapter.family, workspaceId: identity.workspaceId, coordinator: this,
|
|
512
|
-
inputSchemas: this.#schemas.get(adapter.family), example: adapter.example, discovery: adapter.discovery,
|
|
546
|
+
traits: adapter.traits, inputSchemas: this.#schemas.get(adapter.family), example: adapter.example, discovery: adapter.discovery,
|
|
513
547
|
}),
|
|
514
548
|
availability: { available: true, detail: "workspace Functionality manager" },
|
|
549
|
+
...(adapter.scheme === undefined ? {} : { scheme: adapter.scheme }),
|
|
515
550
|
};
|
|
516
551
|
runtimes = [manager, ...(prepared.runtimes ?? [])];
|
|
517
552
|
}
|