@plurnk/plurnk-service 1.3.12 → 1.4.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 +84 -77
- package/INSTALL.md +50 -25
- package/README.md +24 -10
- package/SPEC.md +2311 -928
- package/dist/Paths.d.ts +4 -1
- package/dist/Paths.d.ts.map +1 -1
- package/dist/Paths.js +23 -21
- package/dist/Paths.js.map +1 -1
- package/dist/build-info.json +1 -1
- package/dist/content/edit-receipt.d.ts +13 -28
- package/dist/content/edit-receipt.d.ts.map +1 -1
- package/dist/content/edit-receipt.js +285 -104
- package/dist/content/edit-receipt.js.map +1 -1
- package/dist/content/edited-span.d.ts.map +1 -1
- package/dist/content/edited-span.js +2 -5
- package/dist/content/edited-span.js.map +1 -1
- package/dist/content/index.d.ts +3 -3
- package/dist/content/index.d.ts.map +1 -1
- package/dist/content/index.js +1 -1
- package/dist/content/index.js.map +1 -1
- package/dist/content/line-marker.d.ts +6 -9
- package/dist/content/line-marker.d.ts.map +1 -1
- package/dist/content/line-marker.js +7 -11
- package/dist/content/line-marker.js.map +1 -1
- package/dist/content/matcher.d.ts +14 -25
- package/dist/content/matcher.d.ts.map +1 -1
- package/dist/content/matcher.js +77 -107
- package/dist/content/matcher.js.map +1 -1
- package/dist/content/mimetype-binary.d.ts +2 -2
- package/dist/content/mimetype-binary.d.ts.map +1 -1
- package/dist/content/mimetype-binary.js +10 -10
- package/dist/content/mimetype-binary.js.map +1 -1
- package/dist/content/path-mimetype.js +3 -3
- package/dist/content/path-mimetype.js.map +1 -1
- package/dist/content/read-resolve.d.ts +8 -4
- package/dist/content/read-resolve.d.ts.map +1 -1
- package/dist/content/read-resolve.js +101 -49
- package/dist/content/read-resolve.js.map +1 -1
- package/dist/core/BranchReceipt.d.ts +7 -0
- package/dist/core/BranchReceipt.d.ts.map +1 -0
- package/dist/core/BranchReceipt.js +27 -0
- package/dist/core/BranchReceipt.js.map +1 -0
- package/dist/core/BudgetOverflow.d.ts +23 -0
- package/dist/core/BudgetOverflow.d.ts.map +1 -0
- package/dist/core/BudgetOverflow.js +61 -0
- package/dist/core/BudgetOverflow.js.map +1 -0
- package/dist/core/BudgetReadout.d.ts +8 -0
- package/dist/core/BudgetReadout.d.ts.map +1 -0
- package/dist/core/BudgetReadout.js +79 -0
- package/dist/core/BudgetReadout.js.map +1 -0
- package/dist/core/ChannelWrite.d.ts +28 -9
- package/dist/core/ChannelWrite.d.ts.map +1 -1
- package/dist/core/ChannelWrite.js +28 -21
- package/dist/core/ChannelWrite.js.map +1 -1
- package/dist/core/ChannelWrite.sql +11 -10
- package/dist/core/CoreSchemeServices.d.ts +10 -4
- package/dist/core/CoreSchemeServices.d.ts.map +1 -1
- package/dist/core/CoreSchemeServices.js +7 -1
- package/dist/core/CoreSchemeServices.js.map +1 -1
- package/dist/core/Dispatcher.d.ts +29 -20
- package/dist/core/Dispatcher.d.ts.map +1 -1
- package/dist/core/Dispatcher.js +1488 -599
- package/dist/core/Dispatcher.js.map +1 -1
- package/dist/core/DurableStatement.d.ts +6 -0
- package/dist/core/DurableStatement.d.ts.map +1 -0
- package/dist/core/DurableStatement.js +51 -0
- package/dist/core/DurableStatement.js.map +1 -0
- package/dist/core/Engine.d.ts +48 -20
- package/dist/core/Engine.d.ts.map +1 -1
- package/dist/core/Engine.js +1208 -789
- package/dist/core/Engine.js.map +1 -1
- package/dist/core/Engine.sql +309 -217
- package/dist/core/EnvFlags.js +1 -1
- package/dist/core/EnvFlags.js.map +1 -1
- package/dist/core/ErrorDetail.d.ts +6 -0
- package/dist/core/ErrorDetail.d.ts.map +1 -0
- package/dist/core/ErrorDetail.js +20 -0
- package/dist/core/ErrorDetail.js.map +1 -0
- package/dist/core/ExecutorRegistry.d.ts +14 -3
- package/dist/core/ExecutorRegistry.d.ts.map +1 -1
- package/dist/core/ExecutorRegistry.js +56 -30
- package/dist/core/ExecutorRegistry.js.map +1 -1
- package/dist/core/GitBranch.d.ts +20 -0
- package/dist/core/GitBranch.d.ts.map +1 -0
- package/dist/core/GitBranch.js +110 -0
- package/dist/core/GitBranch.js.map +1 -0
- package/dist/core/JournalTurn.d.ts +9 -0
- package/dist/core/JournalTurn.d.ts.map +1 -0
- package/dist/core/JournalTurn.js +14 -0
- package/dist/core/JournalTurn.js.map +1 -0
- package/dist/core/JournalTurn.sql +10 -0
- package/dist/core/LogBody.d.ts +17 -0
- package/dist/core/LogBody.d.ts.map +1 -0
- package/dist/core/LogBody.js +148 -0
- package/dist/core/LogBody.js.map +1 -0
- package/dist/core/LoopFlagsReader.d.ts +7 -0
- package/dist/core/LoopFlagsReader.d.ts.map +1 -0
- package/dist/core/LoopFlagsReader.js +33 -0
- package/dist/core/LoopFlagsReader.js.map +1 -0
- package/dist/core/LoopLifecycle.d.ts +8 -1
- package/dist/core/LoopLifecycle.d.ts.map +1 -1
- package/dist/core/LoopLifecycle.js +55 -9
- package/dist/core/LoopLifecycle.js.map +1 -1
- package/dist/core/LoopLifecycle.sql +9 -3
- package/dist/core/NoticeChannel.d.ts +13 -0
- package/dist/core/NoticeChannel.d.ts.map +1 -0
- package/dist/core/NoticeChannel.js +40 -0
- package/dist/core/NoticeChannel.js.map +1 -0
- package/dist/core/Owner.d.ts +0 -1
- package/dist/core/Owner.d.ts.map +1 -1
- package/dist/core/Owner.js +2 -5
- package/dist/core/Owner.js.map +1 -1
- package/dist/core/PacketBuilder.d.ts +25 -24
- package/dist/core/PacketBuilder.d.ts.map +1 -1
- package/dist/core/PacketBuilder.js +313 -375
- package/dist/core/PacketBuilder.js.map +1 -1
- package/dist/core/ProblemLog.d.ts +26 -0
- package/dist/core/ProblemLog.d.ts.map +1 -0
- package/dist/core/ProblemLog.js +58 -0
- package/dist/core/ProblemLog.js.map +1 -0
- package/dist/core/ProposalLifecycle.d.ts +15 -21
- package/dist/core/ProposalLifecycle.d.ts.map +1 -1
- package/dist/core/ProposalLifecycle.js +291 -78
- package/dist/core/ProposalLifecycle.js.map +1 -1
- package/dist/core/ProviderInstantiate.d.ts.map +1 -1
- package/dist/core/ProviderInstantiate.js +51 -48
- package/dist/core/ProviderInstantiate.js.map +1 -1
- package/dist/core/SchemeRegistry.d.ts +14 -8
- package/dist/core/SchemeRegistry.d.ts.map +1 -1
- package/dist/core/SchemeRegistry.js +189 -114
- package/dist/core/SchemeRegistry.js.map +1 -1
- package/dist/core/ServiceTeardown.d.ts +11 -0
- package/dist/core/ServiceTeardown.d.ts.map +1 -0
- package/dist/core/ServiceTeardown.js +70 -0
- package/dist/core/ServiceTeardown.js.map +1 -0
- package/dist/core/StoredPacket.d.ts +29 -0
- package/dist/core/StoredPacket.d.ts.map +1 -0
- package/dist/core/StoredPacket.js +147 -0
- package/dist/core/StoredPacket.js.map +1 -0
- package/dist/core/StrikeRail.d.ts +1 -2
- package/dist/core/StrikeRail.d.ts.map +1 -1
- package/dist/core/StrikeRail.js +25 -55
- package/dist/core/StrikeRail.js.map +1 -1
- package/dist/core/WorkerControlAddress.d.ts +17 -0
- package/dist/core/WorkerControlAddress.d.ts.map +1 -0
- package/dist/core/WorkerControlAddress.js +44 -0
- package/dist/core/WorkerControlAddress.js.map +1 -0
- package/dist/core/WorkerName.d.ts +31 -0
- package/dist/core/WorkerName.d.ts.map +1 -0
- package/dist/core/WorkerName.js +95 -0
- package/dist/core/WorkerName.js.map +1 -0
- package/dist/core/WorkerName.sql +36 -0
- package/dist/core/WorkspaceGate.d.ts +14 -0
- package/dist/core/WorkspaceGate.d.ts.map +1 -0
- package/dist/core/WorkspaceGate.js +155 -0
- package/dist/core/WorkspaceGate.js.map +1 -0
- package/dist/core/caps/CapsResolve.d.ts +1 -1
- package/dist/core/caps/CapsResolve.d.ts.map +1 -1
- package/dist/core/caps/CapsResolve.js.map +1 -1
- package/dist/core/caps/DbChannelCaps.d.ts +5 -11
- package/dist/core/caps/DbChannelCaps.d.ts.map +1 -1
- package/dist/core/caps/DbChannelCaps.js +24 -8
- package/dist/core/caps/DbChannelCaps.js.map +1 -1
- package/dist/core/caps/DbEntryCaps.d.ts +4 -13
- package/dist/core/caps/DbEntryCaps.d.ts.map +1 -1
- package/dist/core/caps/DbEntryCaps.js +15 -6
- package/dist/core/caps/DbEntryCaps.js.map +1 -1
- package/dist/core/caps/DbNotifyCaps.d.ts +1 -1
- package/dist/core/caps/DbNotifyCaps.d.ts.map +1 -1
- package/dist/core/caps/DbNotifyCaps.js +12 -11
- package/dist/core/caps/DbNotifyCaps.js.map +1 -1
- package/dist/core/caps/DbProjectionCaps.d.ts +5 -5
- package/dist/core/caps/DbProjectionCaps.d.ts.map +1 -1
- package/dist/core/caps/DbProjectionCaps.js +21 -4
- package/dist/core/caps/DbProjectionCaps.js.map +1 -1
- package/dist/core/caps/DbSubscriptionCaps.d.ts +4 -4
- package/dist/core/caps/DbSubscriptionCaps.d.ts.map +1 -1
- package/dist/core/caps/DbSubscriptionCaps.js +57 -62
- package/dist/core/caps/DbSubscriptionCaps.js.map +1 -1
- package/dist/core/caps/DbTagCaps.d.ts +5 -12
- package/dist/core/caps/DbTagCaps.d.ts.map +1 -1
- package/dist/core/caps/DbTagCaps.js +14 -7
- package/dist/core/caps/DbTagCaps.js.map +1 -1
- package/dist/core/content-hash.js +1 -1
- package/dist/core/content-hash.js.map +1 -1
- package/dist/core/env-defaults.d.ts.map +1 -1
- package/dist/core/env-defaults.js.map +1 -1
- package/dist/core/fork.d.ts.map +1 -1
- package/dist/core/fork.js +55 -30
- package/dist/core/fork.js.map +1 -1
- package/dist/core/fork.sql +41 -27
- package/dist/core/git-env.d.ts +2 -0
- package/dist/core/git-env.d.ts.map +1 -1
- package/dist/core/git-env.js +13 -18
- package/dist/core/git-env.js.map +1 -1
- package/dist/core/git-iso.d.ts.map +1 -1
- package/dist/core/git-iso.js +9 -15
- package/dist/core/git-iso.js.map +1 -1
- package/dist/core/git-membership.d.ts +1 -1
- package/dist/core/git-membership.d.ts.map +1 -1
- package/dist/core/git-membership.js +198 -146
- package/dist/core/git-membership.js.map +1 -1
- package/dist/core/git-state.d.ts.map +1 -1
- package/dist/core/git-state.js +10 -11
- package/dist/core/git-state.js.map +1 -1
- package/dist/core/owner.sql +1 -1
- package/dist/core/packet-inject.d.ts.map +1 -1
- package/dist/core/packet-inject.js +7 -11
- package/dist/core/packet-inject.js.map +1 -1
- package/dist/core/packet-wire.d.ts +2 -20
- package/dist/core/packet-wire.d.ts.map +1 -1
- package/dist/core/packet-wire.js +242 -368
- package/dist/core/packet-wire.js.map +1 -1
- package/dist/core/plurnk-uri.d.ts +12 -1
- package/dist/core/plurnk-uri.d.ts.map +1 -1
- package/dist/core/plurnk-uri.js +49 -29
- package/dist/core/plurnk-uri.js.map +1 -1
- package/dist/core/results.d.ts +16 -5
- package/dist/core/results.d.ts.map +1 -1
- package/dist/core/results.js +27 -18
- package/dist/core/results.js.map +1 -1
- package/dist/core/ruler_count.d.ts +4 -0
- package/dist/core/ruler_count.d.ts.map +1 -0
- package/dist/core/ruler_count.js +7 -0
- package/dist/core/ruler_count.js.map +1 -0
- package/dist/core/scheme-types.d.ts +9 -11
- package/dist/core/scheme-types.d.ts.map +1 -1
- package/dist/core/scheme-types.js.map +1 -1
- package/dist/core/search-gate.d.ts.map +1 -1
- package/dist/core/search-gate.js +3 -11
- package/dist/core/search-gate.js.map +1 -1
- package/dist/core/teaching-corpus.d.ts +6 -0
- package/dist/core/teaching-corpus.d.ts.map +1 -0
- package/dist/core/teaching-corpus.js +23 -0
- package/dist/core/teaching-corpus.js.map +1 -0
- package/dist/core/teaching.d.ts +0 -1
- package/dist/core/teaching.d.ts.map +1 -1
- package/dist/core/teaching.js +2 -8
- package/dist/core/teaching.js.map +1 -1
- package/dist/core/token-ruler.d.ts.map +1 -1
- package/dist/core/token-ruler.js +3 -16
- package/dist/core/token-ruler.js.map +1 -1
- package/dist/core/turn-scheduler.d.ts +1 -1
- package/dist/core/turn-scheduler.d.ts.map +1 -1
- package/dist/core/turn-scheduler.js +1 -1
- package/dist/core/turn-scheduler.js.map +1 -1
- package/dist/core/worker-cap.d.ts +2 -4
- package/dist/core/worker-cap.d.ts.map +1 -1
- package/dist/core/worker-cap.js +13 -4
- package/dist/core/worker-cap.js.map +1 -1
- package/dist/core/{run-ops.sql → worker-ops.sql} +11 -11
- package/dist/core/workspace-settings.d.ts.map +1 -1
- package/dist/core/workspace-settings.js +17 -9
- package/dist/core/workspace-settings.js.map +1 -1
- package/dist/digest/Digest.d.ts +2 -1
- package/dist/digest/Digest.d.ts.map +1 -1
- package/dist/digest/Digest.js +337 -138
- package/dist/digest/Digest.js.map +1 -1
- package/dist/digest/digest.sql +19 -10
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -5
- package/dist/index.js.map +1 -1
- package/dist/matrix/live-specimen.d.ts +9 -0
- package/dist/matrix/live-specimen.d.ts.map +1 -0
- package/dist/matrix/live-specimen.js +37 -0
- package/dist/matrix/live-specimen.js.map +1 -0
- package/dist/observe/api.d.ts +6 -0
- package/dist/observe/api.d.ts.map +1 -0
- package/dist/observe/api.js +11 -0
- package/dist/observe/api.js.map +1 -0
- package/dist/observe/init.d.ts +7 -0
- package/dist/observe/init.d.ts.map +1 -0
- package/dist/observe/init.js +159 -0
- package/dist/observe/init.js.map +1 -0
- package/dist/observe/metrics.d.ts +6 -0
- package/dist/observe/metrics.d.ts.map +1 -0
- package/dist/observe/metrics.js +15 -0
- package/dist/observe/metrics.js.map +1 -0
- package/dist/observe/spans.d.ts +4 -0
- package/dist/observe/spans.d.ts.map +1 -0
- package/dist/observe/spans.js +51 -0
- package/dist/observe/spans.js.map +1 -0
- package/dist/schemes/EffectPolicy.d.ts +1 -0
- package/dist/schemes/EffectPolicy.d.ts.map +1 -1
- package/dist/schemes/EffectPolicy.js +5 -2
- package/dist/schemes/EffectPolicy.js.map +1 -1
- package/dist/schemes/Exec.d.ts +6 -11
- package/dist/schemes/Exec.d.ts.map +1 -1
- package/dist/schemes/Exec.js +364 -247
- package/dist/schemes/Exec.js.map +1 -1
- package/dist/schemes/ExecOutputScheme.d.ts +8 -7
- package/dist/schemes/ExecOutputScheme.d.ts.map +1 -1
- package/dist/schemes/ExecOutputScheme.js +48 -9
- package/dist/schemes/ExecOutputScheme.js.map +1 -1
- package/dist/schemes/File.d.ts +7 -11
- package/dist/schemes/File.d.ts.map +1 -1
- package/dist/schemes/File.js +279 -142
- package/dist/schemes/File.js.map +1 -1
- package/dist/schemes/Log.d.ts +4 -8
- package/dist/schemes/Log.d.ts.map +1 -1
- package/dist/schemes/Log.js +475 -208
- package/dist/schemes/Log.js.map +1 -1
- package/dist/schemes/Log.sql +62 -30
- package/dist/schemes/Prompt.d.ts +3 -2
- package/dist/schemes/Prompt.d.ts.map +1 -1
- package/dist/schemes/Prompt.js +9 -6
- package/dist/schemes/Prompt.js.map +1 -1
- package/dist/schemes/Skill.d.ts +1 -1
- package/dist/schemes/Skill.d.ts.map +1 -1
- package/dist/schemes/Skill.js +2 -3
- package/dist/schemes/Skill.js.map +1 -1
- package/dist/schemes/Worker.d.ts +8 -16
- package/dist/schemes/Worker.d.ts.map +1 -1
- package/dist/schemes/Worker.js +179 -69
- package/dist/schemes/Worker.js.map +1 -1
- package/dist/schemes/_entry-chunk.d.ts.map +1 -1
- package/dist/schemes/_entry-chunk.js +12 -5
- package/dist/schemes/_entry-chunk.js.map +1 -1
- package/dist/schemes/_entry-crud.d.ts +10 -9
- package/dist/schemes/_entry-crud.d.ts.map +1 -1
- package/dist/schemes/_entry-crud.js +59 -13
- package/dist/schemes/_entry-crud.js.map +1 -1
- package/dist/schemes/_entry-crud.sql +20 -8
- package/dist/schemes/_entry-find.d.ts +20 -15
- package/dist/schemes/_entry-find.d.ts.map +1 -1
- package/dist/schemes/_entry-find.js +339 -174
- package/dist/schemes/_entry-find.js.map +1 -1
- package/dist/schemes/_entry-find.sql +20 -8
- package/dist/schemes/_entry-graph.d.ts +4 -2
- package/dist/schemes/_entry-graph.d.ts.map +1 -1
- package/dist/schemes/_entry-graph.js +55 -31
- package/dist/schemes/_entry-graph.js.map +1 -1
- package/dist/schemes/_entry-graph.sql +37 -22
- package/dist/schemes/_entry-manifest.d.ts +10 -15
- package/dist/schemes/_entry-manifest.d.ts.map +1 -1
- package/dist/schemes/_entry-manifest.js +50 -268
- package/dist/schemes/_entry-manifest.js.map +1 -1
- package/dist/schemes/_entry-ops.d.ts +9 -14
- package/dist/schemes/_entry-ops.d.ts.map +1 -1
- package/dist/schemes/_entry-ops.js +149 -77
- package/dist/schemes/_entry-ops.js.map +1 -1
- package/dist/schemes/_entry-ops.sql +1 -1
- package/dist/schemes/_entry-semantic.d.ts +23 -8
- package/dist/schemes/_entry-semantic.d.ts.map +1 -1
- package/dist/schemes/_entry-semantic.js +141 -60
- package/dist/schemes/_entry-semantic.js.map +1 -1
- package/dist/schemes/_entry-semantic.sql +63 -45
- package/dist/schemes/_entry-send.d.ts +3 -4
- package/dist/schemes/_entry-send.d.ts.map +1 -1
- package/dist/schemes/_entry-send.js +48 -23
- package/dist/schemes/_entry-send.js.map +1 -1
- package/dist/schemes/_path-scope.d.ts +23 -0
- package/dist/schemes/_path-scope.d.ts.map +1 -0
- package/dist/schemes/_path-scope.js +61 -0
- package/dist/schemes/_path-scope.js.map +1 -0
- package/dist/schemes/_search-candidate.d.ts +20 -0
- package/dist/schemes/_search-candidate.d.ts.map +1 -0
- package/dist/schemes/_search-candidate.js +19 -0
- package/dist/schemes/_search-candidate.js.map +1 -0
- package/dist/schemes/_search-exclusion.d.ts +7 -0
- package/dist/schemes/_search-exclusion.d.ts.map +1 -0
- package/dist/schemes/_search-exclusion.js +23 -0
- package/dist/schemes/_search-exclusion.js.map +1 -0
- package/dist/schemes/_search-index.d.ts +6 -0
- package/dist/schemes/_search-index.d.ts.map +1 -0
- package/dist/schemes/_search-index.js +326 -0
- package/dist/schemes/_search-index.js.map +1 -0
- package/dist/schemes/cosine.js +1 -1
- package/dist/schemes/cosine.js.map +1 -1
- package/dist/schemes/exec-abort.js +3 -3
- package/dist/schemes/exec-abort.js.map +1 -1
- package/dist/schemes/exec-env.js +3 -3
- package/dist/schemes/exec-env.js.map +1 -1
- package/dist/server/BranchBatches.d.ts +48 -0
- package/dist/server/BranchBatches.d.ts.map +1 -0
- package/dist/server/BranchBatches.js +591 -0
- package/dist/server/BranchBatches.js.map +1 -0
- package/dist/server/Daemon.d.ts +36 -66
- package/dist/server/Daemon.d.ts.map +1 -1
- package/dist/server/Daemon.js +920 -446
- package/dist/server/Daemon.js.map +1 -1
- package/dist/server/DaemonModule.d.ts +31 -0
- package/dist/server/DaemonModule.d.ts.map +1 -0
- package/dist/server/DaemonModule.js +2 -0
- package/dist/server/DaemonModule.js.map +1 -0
- package/dist/server/branch-batch.sql +152 -0
- package/dist/server/client-input.d.ts +12 -0
- package/dist/server/client-input.d.ts.map +1 -1
- package/dist/server/client-input.js +262 -57
- package/dist/server/client-input.js.map +1 -1
- package/dist/server/dispatch-as-plurnk.d.ts +1 -1
- package/dist/server/dispatch-as-plurnk.d.ts.map +1 -1
- package/dist/server/dispatch-as-plurnk.js +15 -7
- package/dist/server/dispatch-as-plurnk.js.map +1 -1
- package/dist/server/drain.sql +92 -62
- package/dist/server/envelope.d.ts +2 -5
- package/dist/server/envelope.d.ts.map +1 -1
- package/dist/server/envelope.js +119 -95
- package/dist/server/envelope.js.map +1 -1
- package/dist/server/envelope.sql +19 -23
- package/dist/server/exec-poll-backoff.js +1 -1
- package/dist/server/exec-poll-backoff.js.map +1 -1
- package/dist/server/lifecycle-recovery.sql +79 -2
- package/dist/server/logEntry.d.ts +3 -1
- package/dist/server/logEntry.d.ts.map +1 -1
- package/dist/server/logEntry.js +4 -2
- package/dist/server/logEntry.js.map +1 -1
- package/dist/server/logEntry.sql +1 -1
- package/dist/server/loop-model.d.ts.map +1 -1
- package/dist/server/loop-model.js +22 -9
- package/dist/server/loop-model.js.map +1 -1
- package/dist/server/loopDocs.d.ts.map +1 -1
- package/dist/server/loopDocs.js +5 -4
- package/dist/server/loopDocs.js.map +1 -1
- package/dist/server/seam-entry-read.sql +15 -10
- package/dist/server/seam-log-read.sql +2 -2
- package/dist/server/seam-loop.sql +1 -1
- package/dist/server/seam-proposal-list.sql +17 -7
- package/dist/service.d.ts.map +1 -1
- package/dist/service.js +66 -60
- package/dist/service.js.map +1 -1
- package/migrations/001_schema.sql +897 -0
- package/package.json +57 -26
- package/dist/core/PluginLoader.d.ts +0 -20
- package/dist/core/PluginLoader.d.ts.map +0 -1
- package/dist/core/PluginLoader.js +0 -142
- package/dist/core/PluginLoader.js.map +0 -1
- package/dist/core/TelemetryChannel.d.ts +0 -37
- package/dist/core/TelemetryChannel.d.ts.map +0 -1
- package/dist/core/TelemetryChannel.js +0 -80
- package/dist/core/TelemetryChannel.js.map +0 -1
- package/dist/core/path-decode.d.ts +0 -3
- package/dist/core/path-decode.d.ts.map +0 -1
- package/dist/core/path-decode.js +0 -9
- package/dist/core/path-decode.js.map +0 -1
- package/dist/core/plugin-attribution.d.ts +0 -5
- package/dist/core/plugin-attribution.d.ts.map +0 -1
- package/dist/core/plugin-attribution.js +0 -39
- package/dist/core/plugin-attribution.js.map +0 -1
- package/dist/core/world-state.d.ts +0 -10
- package/dist/core/world-state.d.ts.map +0 -1
- package/dist/core/world-state.js +0 -35
- package/dist/core/world-state.js.map +0 -1
- package/dist/core/world-state.sql +0 -35
- package/dist/core/zero-pin.d.ts +0 -3
- package/dist/core/zero-pin.d.ts.map +0 -1
- package/dist/core/zero-pin.js +0 -16
- package/dist/core/zero-pin.js.map +0 -1
- package/dist/server/auto.d.ts +0 -6
- package/dist/server/auto.d.ts.map +0 -1
- package/dist/server/auto.js +0 -63
- package/dist/server/auto.js.map +0 -1
- package/dist/server/clientTurn.d.ts +0 -6
- package/dist/server/clientTurn.d.ts.map +0 -1
- package/dist/server/clientTurn.js +0 -22
- package/dist/server/clientTurn.js.map +0 -1
- package/dist/server/clientTurn.sql +0 -10
- package/dist/server/noProposals.d.ts +0 -6
- package/dist/server/noProposals.d.ts.map +0 -1
- package/dist/server/noProposals.js +0 -37
- package/dist/server/noProposals.js.map +0 -1
- package/dist/server/version-info.d.ts +0 -14
- package/dist/server/version-info.d.ts.map +0 -1
- package/dist/server/version-info.js +0 -69
- package/dist/server/version-info.js.map +0 -1
- package/migrations/0000-00-00.01_schema.sql +0 -536
- package/migrations/0004_loop-provider.sql +0 -3
- package/migrations/0005_subscription-published-channel.sql +0 -3
- package/migrations/0006_loop-max-turns.sql +0 -3
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import { Validator } from "@plurnk/plurnk-contracts";
|
|
2
|
+
const own = (value, key) => Object.hasOwn(value, key);
|
|
3
|
+
// {§packet-stored-shape} — the one type and validation boundary for the
|
|
4
|
+
// optional model-exchange record stored on a Turn.
|
|
5
|
+
export default class StoredPacket {
|
|
6
|
+
static admit(request, assistant, assistantRaw) {
|
|
7
|
+
const packet = StoredPacket.assert({
|
|
8
|
+
...request,
|
|
9
|
+
assistant,
|
|
10
|
+
assistantRaw: assistantRaw ?? null,
|
|
11
|
+
}, "admitted packet");
|
|
12
|
+
if (!StoredPacket.isAdmitted(packet))
|
|
13
|
+
throw new Error("admitted packet lost its response fields");
|
|
14
|
+
return packet;
|
|
15
|
+
}
|
|
16
|
+
static stringify(packet) {
|
|
17
|
+
const value = StoredPacket.assert(packet, "packet write");
|
|
18
|
+
const encoded = JSON.stringify(value);
|
|
19
|
+
if (encoded === undefined)
|
|
20
|
+
throw new TypeError("packet write is not JSON-serializable");
|
|
21
|
+
StoredPacket.parse(encoded, "packet write");
|
|
22
|
+
return encoded;
|
|
23
|
+
}
|
|
24
|
+
static parse(raw, subject = "stored packet") {
|
|
25
|
+
if (raw === null)
|
|
26
|
+
return null;
|
|
27
|
+
let value;
|
|
28
|
+
try {
|
|
29
|
+
value = JSON.parse(raw);
|
|
30
|
+
}
|
|
31
|
+
catch (cause) {
|
|
32
|
+
throw new Error(`${subject} contains invalid JSON`, { cause });
|
|
33
|
+
}
|
|
34
|
+
try {
|
|
35
|
+
return StoredPacket.assert(value, subject);
|
|
36
|
+
}
|
|
37
|
+
catch (cause) {
|
|
38
|
+
throw new Error(`${subject} has an invalid packet shape`, { cause });
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
static isAdmitted(packet) {
|
|
42
|
+
return own(packet, "assistant");
|
|
43
|
+
}
|
|
44
|
+
static assert(value, subject = "packet") {
|
|
45
|
+
const packet = StoredPacket.#record(value, subject);
|
|
46
|
+
StoredPacket.#keys(packet, ["tokens", "sections", "attributions"], ["tokens", "sections", "attributions", "assistant", "assistantRaw"], subject);
|
|
47
|
+
StoredPacket.#nonnegativeInteger(packet.tokens, `${subject}.tokens`);
|
|
48
|
+
if (!Array.isArray(packet.sections))
|
|
49
|
+
throw new TypeError(`${subject}.sections must be an array`);
|
|
50
|
+
const sections = packet.sections.map((section, index) => StoredPacket.#section(section, `${subject}.sections[${index}]`));
|
|
51
|
+
const attributions = StoredPacket.#attributions(packet.attributions, `${subject}.attributions`);
|
|
52
|
+
const hasAssistant = own(packet, "assistant");
|
|
53
|
+
const hasAssistantRaw = own(packet, "assistantRaw");
|
|
54
|
+
if (hasAssistant !== hasAssistantRaw) {
|
|
55
|
+
throw new TypeError(`${subject}.assistant and ${subject}.assistantRaw must be present together`);
|
|
56
|
+
}
|
|
57
|
+
if (!hasAssistant)
|
|
58
|
+
return { tokens: packet.tokens, sections, attributions };
|
|
59
|
+
if (packet.assistantRaw === undefined)
|
|
60
|
+
throw new TypeError(`${subject}.assistantRaw must be a JSON value`);
|
|
61
|
+
return {
|
|
62
|
+
tokens: packet.tokens,
|
|
63
|
+
sections,
|
|
64
|
+
attributions,
|
|
65
|
+
assistant: StoredPacket.#assistant(packet.assistant, `${subject}.assistant`),
|
|
66
|
+
assistantRaw: packet.assistantRaw,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
static #assistant(value, subject) {
|
|
70
|
+
const assistant = StoredPacket.#record(value, subject);
|
|
71
|
+
StoredPacket.#keys(assistant, ["content", "ops", "reasoning"], ["content", "ops", "reasoning"], subject);
|
|
72
|
+
if (typeof assistant.content !== "string")
|
|
73
|
+
throw new TypeError(`${subject}.content must be a string`);
|
|
74
|
+
if (!Array.isArray(assistant.ops))
|
|
75
|
+
throw new TypeError(`${subject}.ops must be an array`);
|
|
76
|
+
if (assistant.reasoning !== null && typeof assistant.reasoning !== "string") {
|
|
77
|
+
throw new TypeError(`${subject}.reasoning must be a string or null`);
|
|
78
|
+
}
|
|
79
|
+
const ops = assistant.ops.map((op, index) => {
|
|
80
|
+
const result = Validator.validatePlurnkStatement(op);
|
|
81
|
+
if (!result.valid) {
|
|
82
|
+
throw new TypeError(`${subject}.ops[${index}] is not a PlurnkStatement: ${JSON.stringify(result.errors)}`);
|
|
83
|
+
}
|
|
84
|
+
return op;
|
|
85
|
+
});
|
|
86
|
+
return { content: assistant.content, ops, reasoning: assistant.reasoning };
|
|
87
|
+
}
|
|
88
|
+
static #section(value, subject) {
|
|
89
|
+
const section = StoredPacket.#record(value, subject);
|
|
90
|
+
StoredPacket.#keys(section, ["name", "slot", "header", "content", "tokens"], ["name", "slot", "header", "content", "tokens"], subject);
|
|
91
|
+
if (typeof section.name !== "string" || section.name.length === 0) {
|
|
92
|
+
throw new TypeError(`${subject}.name must be a non-empty string`);
|
|
93
|
+
}
|
|
94
|
+
if (section.slot !== "system" && section.slot !== "user") {
|
|
95
|
+
throw new TypeError(`${subject}.slot must be system or user`);
|
|
96
|
+
}
|
|
97
|
+
if (section.header !== null && typeof section.header !== "string") {
|
|
98
|
+
throw new TypeError(`${subject}.header must be a string or null`);
|
|
99
|
+
}
|
|
100
|
+
if (typeof section.content !== "string")
|
|
101
|
+
throw new TypeError(`${subject}.content must be a string`);
|
|
102
|
+
StoredPacket.#nonnegativeInteger(section.tokens, `${subject}.tokens`);
|
|
103
|
+
return {
|
|
104
|
+
name: section.name,
|
|
105
|
+
slot: section.slot,
|
|
106
|
+
header: section.header,
|
|
107
|
+
content: section.content,
|
|
108
|
+
tokens: section.tokens,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
static #attributions(value, subject) {
|
|
112
|
+
if (!Array.isArray(value))
|
|
113
|
+
throw new TypeError(`${subject} must be an array`);
|
|
114
|
+
const tags = value.map((tag, index) => {
|
|
115
|
+
if (typeof tag !== "string" || tag.length === 0) {
|
|
116
|
+
throw new TypeError(`${subject}[${index}] must be a non-empty string`);
|
|
117
|
+
}
|
|
118
|
+
return tag;
|
|
119
|
+
});
|
|
120
|
+
const canonical = [...new Set(tags)].toSorted();
|
|
121
|
+
if (canonical.length !== tags.length || canonical.some((tag, index) => tag !== tags[index])) {
|
|
122
|
+
throw new TypeError(`${subject} must be deduplicated and sorted`);
|
|
123
|
+
}
|
|
124
|
+
return tags;
|
|
125
|
+
}
|
|
126
|
+
static #record(value, subject) {
|
|
127
|
+
if (value === null || typeof value !== "object" || Array.isArray(value)) {
|
|
128
|
+
throw new TypeError(`${subject} must be an object`);
|
|
129
|
+
}
|
|
130
|
+
return value;
|
|
131
|
+
}
|
|
132
|
+
static #keys(value, required, allowed, subject) {
|
|
133
|
+
for (const key of required) {
|
|
134
|
+
if (!own(value, key))
|
|
135
|
+
throw new TypeError(`${subject}.${key} is required`);
|
|
136
|
+
}
|
|
137
|
+
const extras = Object.keys(value).filter((key) => !allowed.includes(key));
|
|
138
|
+
if (extras.length > 0)
|
|
139
|
+
throw new TypeError(`${subject} has unknown fields: ${extras.join(", ")}`);
|
|
140
|
+
}
|
|
141
|
+
static #nonnegativeInteger(value, subject) {
|
|
142
|
+
if (!Number.isSafeInteger(value) || value < 0) {
|
|
143
|
+
throw new TypeError(`${subject} must be a non-negative safe integer`);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
//# sourceMappingURL=StoredPacket.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StoredPacket.js","sourceRoot":"","sources":["../../src/core/StoredPacket.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { PlurnkStatement } from "@plurnk/plurnk-
|
|
1
|
+
import type { PlurnkStatement } from "@plurnk/plurnk-contracts";
|
|
2
2
|
export default class StrikeRail {
|
|
3
3
|
#private;
|
|
4
4
|
static fingerprintTurn(ops: ReadonlyArray<PlurnkStatement>): string;
|
|
@@ -13,7 +13,6 @@ export default class StrikeRail {
|
|
|
13
13
|
assess(loopId: number, turn: {
|
|
14
14
|
fingerprint: string;
|
|
15
15
|
statuses: ReadonlyArray<number>;
|
|
16
|
-
noOps: boolean;
|
|
17
16
|
budgetStruck: boolean;
|
|
18
17
|
steerStruck: boolean;
|
|
19
18
|
minCycles: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StrikeRail.d.ts","sourceRoot":"","sources":["../../src/core/StrikeRail.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAc,MAAM,
|
|
1
|
+
{"version":3,"file":"StrikeRail.d.ts","sourceRoot":"","sources":["../../src/core/StrikeRail.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAc,MAAM,0BAA0B,CAAC;AAqE5E,MAAM,CAAC,OAAO,OAAO,UAAU;;IAG3B,MAAM,CAAC,eAAe,CAAC,GAAG,EAAE,aAAa,CAAC,eAAe,CAAC,GAAG,MAAM,CAElE;IAKD,MAAM,CAAC,WAAW,CACd,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,EAC9B,SAAS,EAAE,MAAM,EACjB,cAAc,EAAE,MAAM,GACvB;QAAE,QAAQ,EAAE,KAAK,CAAA;KAAE,GAAG;QAAE,QAAQ,EAAE,IAAI,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAe1E;IAWD,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAE7B;IAID,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE;QACzB,WAAW,EAAE,MAAM,CAAC;QACpB,QAAQ,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;QAChC,YAAY,EAAE,OAAO,CAAC;QACtB,WAAW,EAAE,OAAO,CAAC;QACrB,SAAS,EAAE,MAAM,CAAC;QAClB,cAAc,EAAE,MAAM,CAAC;QACvB,UAAU,EAAE,MAAM,CAAC;KACtB,GAAG;QAAE,aAAa,EAAE,OAAO,CAAC;QAAC,gBAAgB,EAAE,OAAO,CAAA;KAAE,CAkBxD;IAED,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAE3B;CACJ"}
|
package/dist/core/StrikeRail.js
CHANGED
|
@@ -1,17 +1,13 @@
|
|
|
1
|
-
|
|
2
|
-
//
|
|
3
|
-
//
|
|
4
|
-
// Exploratory misses are not failures: probing a path that doesn't exist (404), a line
|
|
1
|
+
import { renderTarget } from "./plurnk-uri.js";
|
|
2
|
+
// Action-entry statuses that do not accumulate strikes. Exploratory misses are
|
|
3
|
+
// not failures: probing a path that doesn't exist (404), a line
|
|
5
4
|
// range that doesn't exist (416), or a capability a scheme lacks (501) is how discovery
|
|
6
5
|
// works — striking them prices caution into the motions we most want (range-reads ARE
|
|
7
6
|
// the surgical behavior under budget pressure). One simple set, evenly applied.
|
|
8
|
-
// 409
|
|
9
|
-
//
|
|
10
|
-
//
|
|
11
|
-
//
|
|
12
|
-
// the retrieval-only case (a cloud atomic-turn model repeating read+conclude struck out 500 on
|
|
13
|
-
// firefast despite the ruling). The cycle detector remains the backstop for a genuinely-spinning
|
|
14
|
-
// model (508 loop-detected — the honest signal, not a 500 failure).
|
|
7
|
+
// 409 is SOFT here because Engine accounts for a refused final disposition
|
|
8
|
+
// through steerStruck ({§engine-rails}). Counting that raw status as well would
|
|
9
|
+
// double-count one ruling; other 409 outcomes remain soft. The cycle detector
|
|
10
|
+
// remains an independent backstop.
|
|
15
11
|
const SOFT_FAILURE_STATUSES = new Set([404, 409, 416, 501]);
|
|
16
12
|
// Per-op fingerprint: op verb + target URI, plus an op-specific discriminator
|
|
17
13
|
// where the activity isn't fully captured by target alone:
|
|
@@ -58,31 +54,25 @@ const fingerprintOp = (stmt) => {
|
|
|
58
54
|
return `${stmt.op}|(no-path)`;
|
|
59
55
|
}
|
|
60
56
|
const base = path.kind === "url"
|
|
61
|
-
? `${stmt.op}|${path
|
|
57
|
+
? `${stmt.op}|${renderTarget(path)}`
|
|
62
58
|
: `${stmt.op}|local:${path.raw}`;
|
|
63
59
|
if (stmt.op === "FIND" || stmt.op === "READ" || stmt.op === "OPEN" || stmt.op === "FOLD") {
|
|
64
60
|
return `${base}${matcherDiscriminator()}`;
|
|
65
61
|
}
|
|
66
62
|
return base;
|
|
67
63
|
};
|
|
68
|
-
//
|
|
69
|
-
//
|
|
70
|
-
//
|
|
71
|
-
// §telemetry policy: model sees errors that happened (parse_error,
|
|
72
|
-
// action_failure), never the engine's accounting about them (strike counts,
|
|
73
|
-
// cycle detection, sudden-death threshold). Surfacing internal state to the
|
|
74
|
-
// model creates a gamification surface — model optimizes for engine metrics
|
|
75
|
-
// rather than task progress.
|
|
64
|
+
// {§engine-rails} — one per-loop rail owns the consecutive strike streak and
|
|
65
|
+
// cycle history. The model sees admitted operation and engine-rail failures,
|
|
66
|
+
// never this private accounting.
|
|
76
67
|
export default class StrikeRail {
|
|
77
68
|
// Per-turn fingerprint: sorted set of per-op fingerprints, joined. Order
|
|
78
69
|
// within a turn doesn't matter — we want the SET of activities.
|
|
79
70
|
static fingerprintTurn(ops) {
|
|
80
71
|
return ops.map(fingerprintOp).toSorted().join(",");
|
|
81
72
|
}
|
|
82
|
-
//
|
|
73
|
+
// {§engine-rails} cycle detector. For each candidate period k in [1, maxCyclePeriod],
|
|
83
74
|
// check whether the last k*minCycles entries form minCycles repetitions of the
|
|
84
|
-
// same length-k pattern. O(maxCyclePeriod × minCycles × max k) ≈ tiny.
|
|
85
|
-
// parallel: src/plugins/error/error.js detectCycle.
|
|
75
|
+
// same length-k pattern. O(maxCyclePeriod × minCycles × max k) ≈ tiny.
|
|
86
76
|
static detectCycle(history, minCycles, maxCyclePeriod) {
|
|
87
77
|
for (let k = 1; k <= maxCyclePeriod; k++) {
|
|
88
78
|
const needed = k * minCycles;
|
|
@@ -104,47 +94,28 @@ export default class StrikeRail {
|
|
|
104
94
|
}
|
|
105
95
|
return { detected: false };
|
|
106
96
|
}
|
|
107
|
-
//
|
|
108
|
-
//
|
|
109
|
-
// detection #39, grinder, steer) — read and reset at end of each turn.
|
|
110
|
-
// `history` holds per-turn fingerprints for rail #39 cycle detection.
|
|
97
|
+
// {§engine-rails} strike state per loop. `streak` resets on a clean turn;
|
|
98
|
+
// `history` holds consecutive turn fingerprints for cycle detection.
|
|
111
99
|
#state = new Map();
|
|
112
100
|
// The loop's CURRENT strike streak — the same figure the 500-threshold compares. Rides
|
|
113
|
-
// generate({strikes}) as first-party outbound metadata (Plurnk-Strikes,
|
|
114
|
-
//
|
|
101
|
+
// generate({strikes}) as first-party outbound metadata (Plurnk-Strikes,
|
|
102
|
+
// {§strikes-first-party-metadata}): the hosted
|
|
103
|
+
// router's escalation signal. NEVER model-facing ({§engine-rails} — a surfaced count is a
|
|
115
104
|
// metric to game); the packet does not carry it.
|
|
116
105
|
streak(loopId) {
|
|
117
106
|
return this.#state.get(loopId)?.streak ?? 0;
|
|
118
107
|
}
|
|
119
|
-
// Per-turn strike accounting, run by runLoop after every turn.
|
|
120
|
-
//
|
|
121
|
-
// 1. recordedFailed — any action-entry at hard failure status
|
|
122
|
-
// (>= 400 and not in SOFT_FAILURE_STATUSES).
|
|
123
|
-
// 2. noOps — the turn emitted no ops at all (per #41).
|
|
124
|
-
// 3. turnErrors — bumped by per-turn rails (#39 cycle, grinder, steer).
|
|
125
|
-
// Struck → streak++; clean → streak = 0. Threshold → thresholdCrossed,
|
|
126
|
-
// and runLoop owns the abandonment.
|
|
108
|
+
// Per-turn strike accounting, run by runLoop after every admitted turn.
|
|
109
|
+
// {§engine-rails} owns the complete source list and threshold semantics.
|
|
127
110
|
assess(loopId, turn) {
|
|
128
|
-
//
|
|
129
|
-
// history
|
|
130
|
-
//
|
|
131
|
-
|
|
132
|
-
// (plugins/error/error.js#verdict). Intentionally NOT a
|
|
133
|
-
// model-facing telemetry kind: model sees the strike pile-up
|
|
134
|
-
// (which IS the actionable signal); cycle is the engine's
|
|
135
|
-
// reason for treating the turn as a failure, not its own alert.
|
|
136
|
-
const state = this.#state.get(loopId) ?? { streak: 0, turnErrors: 0, history: [] };
|
|
111
|
+
// {§engine-rails}: cycle detection. Push this turn's fingerprint to
|
|
112
|
+
// history and scan for repetition patterns. Detection is intentionally
|
|
113
|
+
// not a model-facing notice; it is private engine accounting.
|
|
114
|
+
const state = this.#state.get(loopId) ?? { streak: 0, history: [] };
|
|
137
115
|
state.history.push(turn.fingerprint);
|
|
138
116
|
const cycle = StrikeRail.detectCycle(state.history, turn.minCycles, turn.maxCyclePeriod);
|
|
139
|
-
if (cycle.detected)
|
|
140
|
-
state.turnErrors++;
|
|
141
|
-
// SPEC §grinder: a non-soft grinder fire counts toward the strike streak.
|
|
142
|
-
if (turn.budgetStruck)
|
|
143
|
-
state.turnErrors++; // a grinder fire bumps the strike streak — §grinder-strike-coupling
|
|
144
|
-
if (turn.steerStruck)
|
|
145
|
-
state.turnErrors++; // idle / premature-terminate steer struck — §send the terminal contract
|
|
146
117
|
const recordedFailed = turn.statuses.some((s) => s >= 400 && !SOFT_FAILURE_STATUSES.has(s));
|
|
147
|
-
const struck = turn.
|
|
118
|
+
const struck = recordedFailed || turn.budgetStruck || turn.steerStruck || cycle.detected;
|
|
148
119
|
let thresholdCrossed = false;
|
|
149
120
|
if (struck) {
|
|
150
121
|
state.streak++;
|
|
@@ -154,7 +125,6 @@ export default class StrikeRail {
|
|
|
154
125
|
else {
|
|
155
126
|
state.streak = 0;
|
|
156
127
|
}
|
|
157
|
-
state.turnErrors = 0;
|
|
158
128
|
this.#state.set(loopId, state);
|
|
159
129
|
return { cycleDetected: cycle.detected, thresholdCrossed };
|
|
160
130
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StrikeRail.js","sourceRoot":"","sources":["../../src/core/StrikeRail.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"StrikeRail.js","sourceRoot":"","sources":["../../src/core/StrikeRail.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { ParsedPath } from "@plurnk/plurnk-contracts";
|
|
2
|
+
import type { SchemeResultBase } from "@plurnk/plurnk-schemes";
|
|
3
|
+
type WorkerControlOperation = "WORK" | "FORK" | "SEND" | "READ" | "KILL";
|
|
4
|
+
type WorkerControlAddressResolution = {
|
|
5
|
+
readonly ok: true;
|
|
6
|
+
readonly authority: string;
|
|
7
|
+
} | {
|
|
8
|
+
readonly ok: false;
|
|
9
|
+
readonly result: SchemeResultBase;
|
|
10
|
+
};
|
|
11
|
+
export default class WorkerControlAddress {
|
|
12
|
+
#private;
|
|
13
|
+
static render(authority: string): string;
|
|
14
|
+
static resolve(target: ParsedPath | null, operation: WorkerControlOperation): WorkerControlAddressResolution;
|
|
15
|
+
}
|
|
16
|
+
export {};
|
|
17
|
+
//# sourceMappingURL=WorkerControlAddress.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WorkerControlAddress.d.ts","sourceRoot":"","sources":["../../src/core/WorkerControlAddress.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAG/D,KAAK,sBAAsB,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AAEzE,KAAK,8BAA8B,GAC7B;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GACjD;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAAA;CAAE,CAAC;AAIhE,MAAM,CAAC,OAAO,OAAO,oBAAoB;;IACrC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEvC;IAED,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI,EAAE,SAAS,EAAE,sBAAsB,GAAG,8BAA8B,CAkB3G;CAuBJ"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import Results from "./results.js";
|
|
2
|
+
// {§worker-control-addressing} Generic URI parsing remains permissive, but a
|
|
3
|
+
// worker-as-actor address is exactly an authority with no other URI component.
|
|
4
|
+
export default class WorkerControlAddress {
|
|
5
|
+
static render(authority) {
|
|
6
|
+
return `worker://${authority}`;
|
|
7
|
+
}
|
|
8
|
+
static resolve(target, operation) {
|
|
9
|
+
const authority = WorkerControlAddress.#authorityOf(target);
|
|
10
|
+
if (authority !== null)
|
|
11
|
+
return { ok: true, authority };
|
|
12
|
+
return {
|
|
13
|
+
ok: false,
|
|
14
|
+
result: Results.failure("scheme:worker", "control-address-invalid", 400, `${operation} requires an authority-only worker:// control address.`, {}, {
|
|
15
|
+
operation,
|
|
16
|
+
recovery: "Provide one worker authority and remove every other URI component.",
|
|
17
|
+
retryable: false,
|
|
18
|
+
}),
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
static #authorityOf(target) {
|
|
22
|
+
if (target === null || target.kind !== "url" || target.scheme !== "worker")
|
|
23
|
+
return null;
|
|
24
|
+
const authority = target.hostname;
|
|
25
|
+
if (authority === null || authority.length === 0)
|
|
26
|
+
return null;
|
|
27
|
+
if (target.username !== null
|
|
28
|
+
|| target.password !== null
|
|
29
|
+
|| target.port !== null
|
|
30
|
+
|| target.pathname !== ""
|
|
31
|
+
|| target.query !== null
|
|
32
|
+
|| target.fragment !== null
|
|
33
|
+
|| target.headers !== undefined)
|
|
34
|
+
return null;
|
|
35
|
+
// Parsed fields cannot distinguish an absent empty fragment from `#`,
|
|
36
|
+
// and WHATWG may normalize dot paths. The preserved spelling closes
|
|
37
|
+
// both gaps without constraining the generic parser.
|
|
38
|
+
const delimiter = target.raw.indexOf("://");
|
|
39
|
+
if (delimiter === -1 || target.raw.slice(0, delimiter).toLowerCase() !== "worker")
|
|
40
|
+
return null;
|
|
41
|
+
return target.raw.slice(delimiter + 3) === authority ? authority : null;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=WorkerControlAddress.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WorkerControlAddress.js","sourceRoot":"","sources":["../../src/core/WorkerControlAddress.ts"],"names":[],"mappings":"AAEA,OAAO,OAAO,MAAM,cAAc,CAAC;AAQnC,6EAA6E;AAC7E,+EAA+E;AAC/E,MAAM,CAAC,OAAO,OAAO,oBAAoB;IACrC,MAAM,CAAC,MAAM,CAAC,SAAiB;QAC3B,OAAO,YAAY,SAAS,EAAE,CAAC;IACnC,CAAC;IAED,MAAM,CAAC,OAAO,CAAC,MAAyB,EAAE,SAAiC;QACvE,MAAM,SAAS,GAAG,oBAAoB,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QAC5D,IAAI,SAAS,KAAK,IAAI;YAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;QACvD,OAAO;YACH,EAAE,EAAE,KAAK;YACT,MAAM,EAAE,OAAO,CAAC,OAAO,CACnB,eAAe,EACf,yBAAyB,EACzB,GAAG,EACH,GAAG,SAAS,wDAAwD,EACpE,EAAE,EACF;gBACI,SAAS;gBACT,QAAQ,EAAE,oEAAoE;gBAC9E,SAAS,EAAE,KAAK;aACnB,CACJ;SACJ,CAAC;IACN,CAAC;IAED,MAAM,CAAC,YAAY,CAAC,MAAyB;QACzC,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,CAAC,IAAI,KAAK,KAAK,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QACxF,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC;QAClC,IAAI,SAAS,KAAK,IAAI,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QAC9D,IACI,MAAM,CAAC,QAAQ,KAAK,IAAI;eACrB,MAAM,CAAC,QAAQ,KAAK,IAAI;eACxB,MAAM,CAAC,IAAI,KAAK,IAAI;eACpB,MAAM,CAAC,QAAQ,KAAK,EAAE;eACtB,MAAM,CAAC,KAAK,KAAK,IAAI;eACrB,MAAM,CAAC,QAAQ,KAAK,IAAI;eACxB,MAAM,CAAC,OAAO,KAAK,SAAS;YACjC,OAAO,IAAI,CAAC;QAEd,sEAAsE;QACtE,oEAAoE;QACpE,qDAAqD;QACrD,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC5C,IAAI,SAAS,KAAK,CAAC,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,WAAW,EAAE,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QAC/F,OAAO,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;IAC5E,CAAC;CACJ"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { Db } from "./Db.ts";
|
|
2
|
+
export type WorkerNameRejection = "invalid" | "reserved";
|
|
3
|
+
export type WorkerOrigin = "model" | "client" | "plurnk";
|
|
4
|
+
export interface WorkerNameClaim {
|
|
5
|
+
id: number;
|
|
6
|
+
name: string;
|
|
7
|
+
}
|
|
8
|
+
interface AutoWorkerOptions {
|
|
9
|
+
workspaceId: number;
|
|
10
|
+
prefix: string;
|
|
11
|
+
qualifier?: string;
|
|
12
|
+
parentWorkerId?: number;
|
|
13
|
+
origin: WorkerOrigin;
|
|
14
|
+
}
|
|
15
|
+
export declare class WorkerNameError extends Error {
|
|
16
|
+
readonly workerName: string;
|
|
17
|
+
readonly rejection: WorkerNameRejection;
|
|
18
|
+
readonly code: "name-invalid" | "name-reserved";
|
|
19
|
+
readonly recovery: string;
|
|
20
|
+
constructor(workerName: string, rejection: WorkerNameRejection);
|
|
21
|
+
}
|
|
22
|
+
export default class WorkerName {
|
|
23
|
+
#private;
|
|
24
|
+
static rejection(workerName: string): WorkerNameRejection | null;
|
|
25
|
+
static assert(workerName: string): string;
|
|
26
|
+
static ordinal(prefix: string, ordinal: number, qualifier?: string): string;
|
|
27
|
+
static claimAuto(db: Db, options: AutoWorkerOptions): Promise<WorkerNameClaim>;
|
|
28
|
+
static ensureDefaultConversation(db: Db, options: Omit<AutoWorkerOptions, "parentWorkerId" | "qualifier" | "origin">): Promise<WorkerNameClaim>;
|
|
29
|
+
}
|
|
30
|
+
export {};
|
|
31
|
+
//# sourceMappingURL=WorkerName.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WorkerName.d.ts","sourceRoot":"","sources":["../../src/core/WorkerName.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAElC,MAAM,MAAM,mBAAmB,GAAG,SAAS,GAAG,UAAU,CAAC;AACzD,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAEzD,MAAM,WAAW,eAAe;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,iBAAiB;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,YAAY,CAAC;CACxB;AAED,qBAAa,eAAgB,SAAQ,KAAK;IACtC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,mBAAmB,CAAC;IACxC,QAAQ,CAAC,IAAI,EAAE,cAAc,GAAG,eAAe,CAAC;IAChD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAE1B,YAAY,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,mBAAmB,EAY7D;CACJ;AAID,MAAM,CAAC,OAAO,OAAO,UAAU;;IAG3B,MAAM,CAAC,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,mBAAmB,GAAG,IAAI,CAG/D;IAED,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAIxC;IAID,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAU1E;IA4CD,OAAa,SAAS,CAAC,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,eAAe,CAAC,CAEnF;IAID,OAAa,yBAAyB,CAClC,EAAE,EAAE,EAAE,EACN,OAAO,EAAE,IAAI,CAAC,iBAAiB,EAAE,gBAAgB,GAAG,WAAW,GAAG,QAAQ,CAAC,GAC5E,OAAO,CAAC,eAAe,CAAC,CAI1B;CACJ"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { RESERVED_AUTHORITIES, WORKER_NAME } from "@plurnk/plurnk-contracts";
|
|
2
|
+
export class WorkerNameError extends Error {
|
|
3
|
+
workerName;
|
|
4
|
+
rejection;
|
|
5
|
+
code;
|
|
6
|
+
recovery;
|
|
7
|
+
constructor(workerName, rejection) {
|
|
8
|
+
const reserved = rejection === "reserved";
|
|
9
|
+
super(reserved
|
|
10
|
+
? `Worker name '${workerName}' is reserved.`
|
|
11
|
+
: `Worker name '${workerName}' must match the lowercase DNS-label contract.`);
|
|
12
|
+
this.name = "WorkerNameError";
|
|
13
|
+
this.workerName = workerName;
|
|
14
|
+
this.rejection = rejection;
|
|
15
|
+
this.code = reserved ? "name-reserved" : "name-invalid";
|
|
16
|
+
this.recovery = reserved
|
|
17
|
+
? "Choose another worker name."
|
|
18
|
+
: "Choose a lowercase DNS-label worker name.";
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
// {§worker-name-minting} Model/client minting only; internal reserved actors and
|
|
22
|
+
// generic URI ingestion have their own contracts.
|
|
23
|
+
export default class WorkerName {
|
|
24
|
+
static #RESERVED = new Set([...RESERVED_AUTHORITIES, "~"]);
|
|
25
|
+
static rejection(workerName) {
|
|
26
|
+
if (WorkerName.#RESERVED.has(workerName.toLowerCase()))
|
|
27
|
+
return "reserved";
|
|
28
|
+
return WORKER_NAME.test(workerName) ? null : "invalid";
|
|
29
|
+
}
|
|
30
|
+
static assert(workerName) {
|
|
31
|
+
const rejection = WorkerName.rejection(workerName);
|
|
32
|
+
if (rejection !== null)
|
|
33
|
+
throw new WorkerNameError(workerName, rejection);
|
|
34
|
+
return workerName;
|
|
35
|
+
}
|
|
36
|
+
// Preserve the semantic suffix and shorten only the inherited prefix until
|
|
37
|
+
// the contracts predicate admits the generated ordinal. {§worker-auto-name}
|
|
38
|
+
static ordinal(prefix, ordinal, qualifier) {
|
|
39
|
+
if (!Number.isSafeInteger(ordinal) || ordinal < 1) {
|
|
40
|
+
throw new Error(`Worker ordinal must be a positive safe integer; received ${ordinal}.`);
|
|
41
|
+
}
|
|
42
|
+
const suffix = `${qualifier === undefined ? "" : `-${qualifier}`}-${ordinal}`;
|
|
43
|
+
for (let length = prefix.length; length > 0; length--) {
|
|
44
|
+
const candidate = `${prefix.slice(0, length)}${suffix}`;
|
|
45
|
+
if (WorkerName.rejection(candidate) === null)
|
|
46
|
+
return candidate;
|
|
47
|
+
}
|
|
48
|
+
throw new Error(`Worker ordinal suffix '${suffix}' leaves no mintable name prefix.`);
|
|
49
|
+
}
|
|
50
|
+
static async #defaultConversation(db, workspaceId) {
|
|
51
|
+
return await db.worker_name_get_default_conversation.get({
|
|
52
|
+
workspace_id: workspaceId,
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
static async #claimAuto(db, options, defaultConversation) {
|
|
56
|
+
const { workspaceId, prefix, qualifier, parentWorkerId, origin } = options;
|
|
57
|
+
const namePrefix = `${prefix}${qualifier === undefined ? "" : `-${qualifier}`}-%`;
|
|
58
|
+
const count = await db.worker_name_count.get({
|
|
59
|
+
workspace_id: workspaceId,
|
|
60
|
+
name_prefix: namePrefix,
|
|
61
|
+
});
|
|
62
|
+
let ordinal = (count?.n ?? 0) + 1;
|
|
63
|
+
while (true) {
|
|
64
|
+
const claimed = await db.worker_name_claim.get({
|
|
65
|
+
workspace_id: workspaceId,
|
|
66
|
+
name: WorkerName.ordinal(prefix, ordinal, qualifier),
|
|
67
|
+
parent_worker_id: parentWorkerId ?? null,
|
|
68
|
+
origin,
|
|
69
|
+
default_conversation: defaultConversation ? 1 : 0,
|
|
70
|
+
});
|
|
71
|
+
if (claimed !== undefined)
|
|
72
|
+
return claimed;
|
|
73
|
+
if (defaultConversation) {
|
|
74
|
+
const existing = await WorkerName.#defaultConversation(db, workspaceId);
|
|
75
|
+
if (existing !== undefined)
|
|
76
|
+
return existing;
|
|
77
|
+
}
|
|
78
|
+
ordinal++;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
// A generated name is not minted until this atomic claim creates its worker.
|
|
82
|
+
// Competing allocators retry only after losing the claim. {§worker-auto-name}
|
|
83
|
+
static async claimAuto(db, options) {
|
|
84
|
+
return await WorkerName.#claimAuto(db, options, false);
|
|
85
|
+
}
|
|
86
|
+
// The stable default conversation is both an auto-name allocation and the
|
|
87
|
+
// workspace's one durable default role; both predicates share one write.
|
|
88
|
+
static async ensureDefaultConversation(db, options) {
|
|
89
|
+
const existing = await WorkerName.#defaultConversation(db, options.workspaceId);
|
|
90
|
+
if (existing !== undefined)
|
|
91
|
+
return existing;
|
|
92
|
+
return await WorkerName.#claimAuto(db, { ...options, origin: "model" }, true);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=WorkerName.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WorkerName.js","sourceRoot":"","sources":["../../src/core/WorkerName.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
-- Automatic worker allocation. SPEC {§worker-auto-name}.
|
|
2
|
+
|
|
3
|
+
-- PREP: worker_name_count
|
|
4
|
+
-- A starting hint only. The atomic claim below remains authoritative because
|
|
5
|
+
-- explicit names and concurrent allocators can occupy any candidate.
|
|
6
|
+
SELECT COUNT(*) AS n
|
|
7
|
+
FROM workers
|
|
8
|
+
WHERE workspace_id = $workspace_id AND name LIKE $name_prefix;
|
|
9
|
+
|
|
10
|
+
-- PREP: worker_name_claim
|
|
11
|
+
-- Claiming the literal and creating its worker are one SQLite write statement.
|
|
12
|
+
-- The default-conversation predicate is enabled only by
|
|
13
|
+
-- ensureDefaultConversation; ordinary allocation passes 0 and competes solely
|
|
14
|
+
-- on the generated literal.
|
|
15
|
+
INSERT INTO workers (workspace_id, name, parent_worker_id, origin, default_conversation)
|
|
16
|
+
SELECT $workspace_id, $name, $parent_worker_id, $origin, $default_conversation
|
|
17
|
+
WHERE NOT EXISTS (
|
|
18
|
+
SELECT 1
|
|
19
|
+
FROM workers
|
|
20
|
+
WHERE workspace_id = $workspace_id AND name = $name
|
|
21
|
+
)
|
|
22
|
+
AND (
|
|
23
|
+
$default_conversation = 0 OR NOT EXISTS (
|
|
24
|
+
SELECT 1
|
|
25
|
+
FROM workers
|
|
26
|
+
WHERE workspace_id = $workspace_id
|
|
27
|
+
AND default_conversation = 1
|
|
28
|
+
)
|
|
29
|
+
)
|
|
30
|
+
RETURNING id, name;
|
|
31
|
+
|
|
32
|
+
-- PREP: worker_name_get_default_conversation
|
|
33
|
+
SELECT id, name
|
|
34
|
+
FROM workers
|
|
35
|
+
WHERE workspace_id = $workspace_id
|
|
36
|
+
AND default_conversation = 1;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
type Release = () => void;
|
|
2
|
+
export interface WorkspaceExclusive {
|
|
3
|
+
readonly acquired: Promise<void>;
|
|
4
|
+
setRoot(workerId: number | null): void;
|
|
5
|
+
release(): void;
|
|
6
|
+
}
|
|
7
|
+
export default class WorkspaceGate {
|
|
8
|
+
#private;
|
|
9
|
+
constructor(isDescendant: (workerId: number, rootWorkerId: number) => Promise<boolean>);
|
|
10
|
+
acquireTurn(workspaceId: number, workerId: number): Promise<Release>;
|
|
11
|
+
requestExclusive(workspaceId: number): WorkspaceExclusive;
|
|
12
|
+
}
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=WorkspaceGate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WorkspaceGate.d.ts","sourceRoot":"","sources":["../../src/core/WorkspaceGate.ts"],"names":[],"mappings":"AAAA,KAAK,OAAO,GAAG,MAAM,IAAI,CAAC;AAuB1B,MAAM,WAAW,kBAAkB;IAC/B,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IACjC,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC;IACvC,OAAO,IAAI,IAAI,CAAC;CACnB;AAMD,MAAM,CAAC,OAAO,OAAO,aAAa;;IAI9B,YAAY,YAAY,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,EAErF;IAED,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAMnE;IAED,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,kBAAkB,CA8CxD;CAqFJ"}
|