@latysh-development/monolith 0.0.0-stage → 0.1.0-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +179 -2
- package/dist/brief/cli.d.ts +30 -0
- package/dist/brief/cli.d.ts.map +1 -0
- package/dist/brief/cli.js +85 -0
- package/dist/brief/collect.d.ts +17 -0
- package/dist/brief/collect.d.ts.map +1 -0
- package/dist/brief/collect.js +342 -0
- package/dist/brief/config.d.ts +40 -0
- package/dist/brief/config.d.ts.map +1 -0
- package/dist/brief/config.js +85 -0
- package/dist/brief/constants.d.ts +12 -0
- package/dist/brief/constants.d.ts.map +1 -0
- package/dist/brief/constants.js +11 -0
- package/dist/brief/docs.d.ts +53 -0
- package/dist/brief/docs.d.ts.map +1 -0
- package/dist/brief/docs.js +229 -0
- package/dist/brief/freshness.d.ts +104 -0
- package/dist/brief/freshness.d.ts.map +1 -0
- package/dist/brief/freshness.js +263 -0
- package/dist/brief/git-signals.d.ts +17 -0
- package/dist/brief/git-signals.d.ts.map +1 -0
- package/dist/brief/git-signals.js +101 -0
- package/dist/brief/index.d.ts +11 -0
- package/dist/brief/index.d.ts.map +1 -0
- package/dist/brief/index.js +5 -0
- package/dist/brief/reconcile.d.ts +75 -0
- package/dist/brief/reconcile.d.ts.map +1 -0
- package/dist/brief/reconcile.js +259 -0
- package/dist/brief/render.d.ts +67 -0
- package/dist/brief/render.d.ts.map +1 -0
- package/dist/brief/render.js +458 -0
- package/dist/brief/sanitize.d.ts +38 -0
- package/dist/brief/sanitize.d.ts.map +1 -0
- package/dist/brief/sanitize.js +48 -0
- package/dist/brief/selectors.d.ts +36 -0
- package/dist/brief/selectors.d.ts.map +1 -0
- package/dist/brief/selectors.js +75 -0
- package/dist/brief/story.d.ts +18 -0
- package/dist/brief/story.d.ts.map +1 -0
- package/dist/brief/story.js +59 -0
- package/dist/brief/types.d.ts +126 -0
- package/dist/brief/types.d.ts.map +1 -0
- package/dist/brief/types.js +11 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +199 -0
- package/dist/cli/init-args.d.ts +16 -0
- package/dist/cli/init-args.d.ts.map +1 -0
- package/dist/cli/init-args.js +24 -0
- package/dist/cli/ui-args.d.ts +23 -0
- package/dist/cli/ui-args.d.ts.map +1 -0
- package/dist/cli/ui-args.js +66 -0
- package/dist/cli/ui.d.ts +40 -0
- package/dist/cli/ui.d.ts.map +1 -0
- package/dist/cli/ui.js +180 -0
- package/dist/coordinatorium/checkpoint.d.ts +44 -0
- package/dist/coordinatorium/checkpoint.d.ts.map +1 -0
- package/dist/coordinatorium/checkpoint.js +124 -0
- package/dist/coordinatorium/cli.d.ts +39 -0
- package/dist/coordinatorium/cli.d.ts.map +1 -0
- package/dist/coordinatorium/cli.js +203 -0
- package/dist/coordinatorium/errors.d.ts +112 -0
- package/dist/coordinatorium/errors.d.ts.map +1 -0
- package/dist/coordinatorium/errors.js +145 -0
- package/dist/coordinatorium/index.d.ts +11 -0
- package/dist/coordinatorium/index.d.ts.map +1 -0
- package/dist/coordinatorium/index.js +5 -0
- package/dist/coordinatorium/lock.d.ts +187 -0
- package/dist/coordinatorium/lock.d.ts.map +1 -0
- package/dist/coordinatorium/lock.js +659 -0
- package/dist/coordinatorium/mission.d.ts +32 -0
- package/dist/coordinatorium/mission.d.ts.map +1 -0
- package/dist/coordinatorium/mission.js +87 -0
- package/dist/coordinatorium/state-keeper.d.ts +115 -0
- package/dist/coordinatorium/state-keeper.d.ts.map +1 -0
- package/dist/coordinatorium/state-keeper.js +396 -0
- package/dist/coordinatorium/types.d.ts +69 -0
- package/dist/coordinatorium/types.d.ts.map +1 -0
- package/dist/coordinatorium/types.js +27 -0
- package/dist/discovery/compose.d.ts +28 -0
- package/dist/discovery/compose.d.ts.map +1 -0
- package/dist/discovery/compose.js +159 -0
- package/dist/discovery/contracts.d.ts +211 -0
- package/dist/discovery/contracts.d.ts.map +1 -0
- package/dist/discovery/contracts.js +555 -0
- package/dist/discovery/docs.d.ts +278 -0
- package/dist/discovery/docs.d.ts.map +1 -0
- package/dist/discovery/docs.js +1182 -0
- package/dist/discovery/facts.d.ts +49 -0
- package/dist/discovery/facts.d.ts.map +1 -0
- package/dist/discovery/facts.js +541 -0
- package/dist/discovery/index.d.ts +8 -0
- package/dist/discovery/index.d.ts.map +1 -0
- package/dist/discovery/index.js +9 -0
- package/dist/discovery/orchestrate.d.ts +35 -0
- package/dist/discovery/orchestrate.d.ts.map +1 -0
- package/dist/discovery/orchestrate.js +32 -0
- package/dist/discovery/render.d.ts +36 -0
- package/dist/discovery/render.d.ts.map +1 -0
- package/dist/discovery/render.js +278 -0
- package/dist/discovery/traverse.d.ts +197 -0
- package/dist/discovery/traverse.d.ts.map +1 -0
- package/dist/discovery/traverse.js +510 -0
- package/dist/durable/assess.d.ts +105 -0
- package/dist/durable/assess.d.ts.map +1 -0
- package/dist/durable/assess.js +239 -0
- package/dist/durable/canonical.d.ts +25 -0
- package/dist/durable/canonical.d.ts.map +1 -0
- package/dist/durable/canonical.js +78 -0
- package/dist/durable/cli.d.ts +37 -0
- package/dist/durable/cli.d.ts.map +1 -0
- package/dist/durable/cli.js +141 -0
- package/dist/durable/errors.d.ts +192 -0
- package/dist/durable/errors.d.ts.map +1 -0
- package/dist/durable/errors.js +323 -0
- package/dist/durable/fs-store.d.ts +254 -0
- package/dist/durable/fs-store.d.ts.map +1 -0
- package/dist/durable/fs-store.js +1493 -0
- package/dist/durable/index.d.ts +20 -0
- package/dist/durable/index.d.ts.map +1 -0
- package/dist/durable/index.js +13 -0
- package/dist/durable/log.d.ts +33 -0
- package/dist/durable/log.d.ts.map +1 -0
- package/dist/durable/log.js +157 -0
- package/dist/durable/memory-store.d.ts +51 -0
- package/dist/durable/memory-store.d.ts.map +1 -0
- package/dist/durable/memory-store.js +302 -0
- package/dist/durable/projection.d.ts +35 -0
- package/dist/durable/projection.d.ts.map +1 -0
- package/dist/durable/projection.js +328 -0
- package/dist/durable/prune-check.d.ts +34 -0
- package/dist/durable/prune-check.d.ts.map +1 -0
- package/dist/durable/prune-check.js +72 -0
- package/dist/durable/register.d.ts +100 -0
- package/dist/durable/register.d.ts.map +1 -0
- package/dist/durable/register.js +532 -0
- package/dist/durable/retention.d.ts +49 -0
- package/dist/durable/retention.d.ts.map +1 -0
- package/dist/durable/retention.js +59 -0
- package/dist/durable/runtime.d.ts +499 -0
- package/dist/durable/runtime.d.ts.map +1 -0
- package/dist/durable/runtime.js +1288 -0
- package/dist/durable/seams.d.ts +44 -0
- package/dist/durable/seams.d.ts.map +1 -0
- package/dist/durable/seams.js +21 -0
- package/dist/durable/testing.d.ts +11 -0
- package/dist/durable/testing.d.ts.map +1 -0
- package/dist/durable/testing.js +25 -0
- package/dist/durable/types.d.ts +442 -0
- package/dist/durable/types.d.ts.map +1 -0
- package/dist/durable/types.js +75 -0
- package/dist/graph/builder.d.ts +11 -0
- package/dist/graph/builder.d.ts.map +1 -0
- package/dist/graph/builder.js +153 -0
- package/dist/graph/identity.d.ts +37 -0
- package/dist/graph/identity.d.ts.map +1 -0
- package/dist/graph/identity.js +46 -0
- package/dist/graph/index.d.ts +7 -0
- package/dist/graph/index.d.ts.map +1 -0
- package/dist/graph/index.js +3 -0
- package/dist/graph/resolver.d.ts +41 -0
- package/dist/graph/resolver.d.ts.map +1 -0
- package/dist/graph/resolver.js +36 -0
- package/dist/graph/types.d.ts +42 -0
- package/dist/graph/types.d.ts.map +1 -0
- package/dist/graph/types.js +1 -0
- package/dist/http/index.d.ts +5 -0
- package/dist/http/index.d.ts.map +1 -0
- package/dist/http/index.js +2 -0
- package/dist/http/server.d.ts +76 -0
- package/dist/http/server.d.ts.map +1 -0
- package/dist/http/server.js +195 -0
- package/dist/http/ui-assets.d.ts +22 -0
- package/dist/http/ui-assets.d.ts.map +1 -0
- package/dist/http/ui-assets.js +100 -0
- package/dist/ideas/cli.d.ts +33 -0
- package/dist/ideas/cli.d.ts.map +1 -0
- package/dist/ideas/cli.js +158 -0
- package/dist/ideas/format.d.ts +38 -0
- package/dist/ideas/format.d.ts.map +1 -0
- package/dist/ideas/format.js +194 -0
- package/dist/ideas/index.d.ts +6 -0
- package/dist/ideas/index.d.ts.map +1 -0
- package/dist/ideas/index.js +3 -0
- package/dist/ideas/store.d.ts +55 -0
- package/dist/ideas/store.d.ts.map +1 -0
- package/dist/ideas/store.js +262 -0
- package/dist/ideas/types.d.ts +54 -0
- package/dist/ideas/types.d.ts.map +1 -0
- package/dist/ideas/types.js +26 -0
- package/dist/index.d.ts +32 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +28 -0
- package/dist/init/index.d.ts +12 -0
- package/dist/init/index.d.ts.map +1 -0
- package/dist/init/index.js +90 -0
- package/dist/init/prompts.d.ts +3 -0
- package/dist/init/prompts.d.ts.map +1 -0
- package/dist/init/prompts.js +47 -0
- package/dist/init/scaffold.d.ts +29 -0
- package/dist/init/scaffold.d.ts.map +1 -0
- package/dist/init/scaffold.js +208 -0
- package/dist/init/types.d.ts +14 -0
- package/dist/init/types.d.ts.map +1 -0
- package/dist/init/types.js +1 -0
- package/dist/managed/index.d.ts +73 -0
- package/dist/managed/index.d.ts.map +1 -0
- package/dist/managed/index.js +222 -0
- package/dist/readmodel/dashboard.d.ts +40 -0
- package/dist/readmodel/dashboard.d.ts.map +1 -0
- package/dist/readmodel/dashboard.js +236 -0
- package/dist/readmodel/index.d.ts +3 -0
- package/dist/readmodel/index.d.ts.map +1 -0
- package/dist/readmodel/index.js +1 -0
- package/dist/readmodel/types.d.ts +104 -0
- package/dist/readmodel/types.d.ts.map +1 -0
- package/dist/readmodel/types.js +15 -0
- package/dist/root/index.d.ts +186 -0
- package/dist/root/index.d.ts.map +1 -0
- package/dist/root/index.js +430 -0
- package/dist/root/safe-write.d.ts +268 -0
- package/dist/root/safe-write.d.ts.map +1 -0
- package/dist/root/safe-write.js +966 -0
- package/dist/root/write-artifacts.d.ts +20 -0
- package/dist/root/write-artifacts.d.ts.map +1 -0
- package/dist/root/write-artifacts.js +42 -0
- package/dist/scriptorium/compile.d.ts +4 -0
- package/dist/scriptorium/compile.d.ts.map +1 -0
- package/dist/scriptorium/compile.js +185 -0
- package/dist/scriptorium/frontmatter.d.ts +13 -0
- package/dist/scriptorium/frontmatter.d.ts.map +1 -0
- package/dist/scriptorium/frontmatter.js +90 -0
- package/dist/scriptorium/index.d.ts +3 -0
- package/dist/scriptorium/index.d.ts.map +1 -0
- package/dist/scriptorium/index.js +1 -0
- package/dist/scriptorium/markdown.d.ts +31 -0
- package/dist/scriptorium/markdown.d.ts.map +1 -0
- package/dist/scriptorium/markdown.js +88 -0
- package/dist/scriptorium/types.d.ts +78 -0
- package/dist/scriptorium/types.d.ts.map +1 -0
- package/dist/scriptorium/types.js +1 -0
- package/dist/types/enforcement.d.ts +11 -0
- package/dist/types/enforcement.d.ts.map +1 -0
- package/dist/types/enforcement.js +1 -0
- package/dist/types/integrity.d.ts +33 -0
- package/dist/types/integrity.d.ts.map +1 -0
- package/dist/types/integrity.js +1 -0
- package/dist/types/project-definition.d.ts +30 -0
- package/dist/types/project-definition.d.ts.map +1 -0
- package/dist/types/project-definition.js +1 -0
- package/dist/ui/assets/cosmic-glass-bg-Dwx47zPu.webp +0 -0
- package/dist/ui/assets/index-C4NhMaq7.js +28 -0
- package/dist/ui/assets/index-DMZ7ZvZY.css +1 -0
- package/dist/ui/index.html +13 -0
- package/dist/update/cli.d.ts +8 -0
- package/dist/update/cli.d.ts.map +1 -0
- package/dist/update/cli.js +115 -0
- package/dist/update/index.d.ts +78 -0
- package/dist/update/index.d.ts.map +1 -0
- package/dist/update/index.js +285 -0
- package/dist/validate/index.d.ts +6 -0
- package/dist/validate/index.d.ts.map +1 -0
- package/dist/validate/index.js +214 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +1 -0
- package/package.json +67 -4
- package/templates/.gitkeep +0 -0
- package/templates/default-instance/instruction/.cursorrules +59 -0
- package/templates/default-instance/instruction/.windsurfrules +59 -0
- package/templates/default-instance/instruction/CLAUDE.md +57 -0
- package/templates/default-instance/managed/agent.md +20 -0
- package/templates/default-instance/managed/bootstrap.md +7 -0
- package/templates/default-instance/managed/index-idea.md +5 -0
- package/templates/default-instance/managed/routing-idea.md +14 -0
- package/templates/default-instance/monolith/AGENT.md +1 -0
- package/templates/default-instance/monolith/context/boot/HANDOFF.md +49 -0
- package/templates/default-instance/monolith/context/boot/WORK_SESSION.md +30 -0
- package/templates/default-instance/monolith/context/execution/current-state.md +30 -0
- package/templates/default-instance/monolith/context/maps/dependency-map.md +38 -0
- package/templates/default-instance/monolith/context/maps/project-map.md +85 -0
- package/templates/default-instance/monolith/context/maps/roadmap-index.md +41 -0
- package/templates/default-instance/monolith/context/maps/routing-map.md +151 -0
- package/templates/default-instance/monolith/context/maps/semantic-map.md +75 -0
- package/templates/default-instance/monolith/context/models/model-registry.md +37 -0
- package/templates/default-instance/monolith/context/models/privacy-classification.md +35 -0
- package/templates/default-instance/monolith/context/templates/plan-template.md +56 -0
- package/templates/default-instance/monolith/governance/README.md +29 -0
- package/templates/default-instance/monolith/governance/RULE_SCHEMA.md +58 -0
- package/templates/default-instance/monolith/learning/INDEX.md +48 -0
- package/templates/default-instance/monolith/learning/injection-map.md +49 -0
- package/templates/default-instance/monolith/learning/taxonomy.md +30 -0
- package/templates/default-instance/monolith/memory/errors/README.md +26 -0
- package/templates/default-instance/monolith/memory/errors/SCHEMA.md +47 -0
- package/templates/default-instance/monolith/memory/errors/TAXONOMY.md +27 -0
- package/templates/default-instance/monolith/memory/long-term/architecture-principles.md +31 -0
- package/templates/default-instance/monolith/memory/long-term/decisions.md +36 -0
- package/templates/default-instance/monolith/memory/long-term/execution-history.md +20 -0
- package/templates/default-instance/monolith/memory/long-term/tech-debt.md +25 -0
- package/templates/default-instance/monolith/memory/working/active.md +41 -0
- package/templates/default-instance/monolith/memory/working/governance-result.md +0 -0
- package/templates/default-instance/monolith/memory/working/integrity-result.md +0 -0
- package/templates/default-instance/monolith/memory/working/story-index.md +28 -0
- package/templates/default-instance/monolith/protocols/boot/boot-sequence.md +59 -0
- package/templates/default-instance/monolith/protocols/cognition/cognitive-modes.md +90 -0
- package/templates/default-instance/monolith/protocols/cognition/dry-run.md +56 -0
- package/templates/default-instance/monolith/protocols/cognition/execution-trace-format.md +52 -0
- package/templates/default-instance/monolith/protocols/cognition/semantic-planning.md +51 -0
- package/templates/default-instance/monolith/protocols/execution/hybrid-execution.md +37 -0
- package/templates/default-instance/monolith/protocols/execution/local-llm-governance.md +42 -0
- package/templates/default-instance/monolith/protocols/governance/command-policy.md +51 -0
- package/templates/default-instance/monolith/protocols/governance/core-invariants.md +40 -0
- package/templates/default-instance/monolith/protocols/governance/memory-governance.md +54 -0
- package/templates/default-instance/monolith/protocols/governance/metadata-schema.md +62 -0
- package/templates/default-instance/monolith/protocols/governance/skills.md +53 -0
- package/templates/default-instance/monolith/protocols/governance/work-session.md +46 -0
- package/templates/default-instance/monolith/skills/INDEX.md +32 -0
- package/templates/default-instance/monolith/skills/current-status/SKILL.md +47 -0
- package/templates/default-instance/monolith/skills/finalize-story/SKILL.md +86 -0
- package/templates/default-instance/monolith/skills/global-status/SKILL.md +56 -0
- package/templates/default-instance/monolith/skills/idea-capture/SKILL.md +157 -0
- package/templates/default-instance/monolith/skills/self-improvement/SKILL.md +77 -0
- package/templates/default-instance/monolith/state.json +11 -0
- package/templates/default-instance/monolith/tests/INDEX.md +57 -0
- package/templates/default-instance/monolith/tests/scenarios/architecture-review.md +32 -0
- package/templates/default-instance/monolith/tests/scenarios/debug-failure.md +32 -0
- package/templates/default-instance/monolith/tests/scenarios/dry-run-activation.md +33 -0
- package/templates/default-instance/monolith/tests/scenarios/execution-trace-verification.md +31 -0
- package/templates/default-instance/monolith/tests/scenarios/finalize-story.md +35 -0
- package/templates/default-instance/monolith/tests/scenarios/implement-feature.md +36 -0
- package/templates/default-instance/monolith/tests/scenarios/local-llm-delegation.md +31 -0
- package/templates/default-instance/monolith/tests/scenarios/planning-request.md +32 -0
- package/templates/default-instance/monolith/tests/scenarios/sensitive-context-task.md +30 -0
- package/templates/default-instance/monolith/tests/scenarios/validator-verification.md +33 -0
- package/templates/default-instance/monolith/tests/validation/expected-behavior.md +70 -0
- package/templates/default-instance/monolith/tests/validators/INDEX.md +17 -0
- package/templates/default-instance/monolith/tests/validators/delegation-semantics.md +22 -0
- package/templates/default-instance/monolith/tests/validators/mode-consistency.md +25 -0
- package/templates/default-instance/monolith/tests/validators/privacy-routing.md +23 -0
- package/templates/default-instance/monolith/tests/validators/protocol-references.md +27 -0
- package/templates/default-instance/monolith/tests/validators/routing-integrity.md +30 -0
- package/templates/default-instance/projectroot/AGENTS.md +111 -0
- package/templates/default-instance/projectroot/monolith.config.json +32 -0
- package/templates/default-instance/projectroot/project.definition.mjs.template +41 -0
|
@@ -0,0 +1,499 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DurableTasks — the application-facing API of Durable State.
|
|
3
|
+
*
|
|
4
|
+
* Every state change is one event appended to the task's log by compare-and-
|
|
5
|
+
* set on the next sequence number (see `EventStore.append`). There is no
|
|
6
|
+
* lock and no in-memory authority: any process can load a task from the store,
|
|
7
|
+
* decide, and append; if another process appended first the attempt re-reads
|
|
8
|
+
* and decides again against the new state. Consequences:
|
|
9
|
+
*
|
|
10
|
+
* - no lost updates, no stale locks, nothing to recover after a crash —
|
|
11
|
+
* a crash leaves either the event (complete) or nothing;
|
|
12
|
+
* - every operation is idempotent where a retry after a crash is plausible
|
|
13
|
+
* (same id + same content is a no-op; same id + different content is an
|
|
14
|
+
* error), so "run the step again" is always safe at the state level;
|
|
15
|
+
* - a worker acts under a *fence* (owner + epoch): once someone else claims
|
|
16
|
+
* the task, the old worker's next write fails with `StaleFenceError`
|
|
17
|
+
* instead of interleaving with the new one;
|
|
18
|
+
* - results from outside arrive through `deliver(token, ...)`, which needs no
|
|
19
|
+
* live process, tolerates duplicates and any order, and never loses a
|
|
20
|
+
* payload it declines to apply.
|
|
21
|
+
*
|
|
22
|
+
* Side effects *outside* the store cannot be made exactly-once by a store.
|
|
23
|
+
* `runEffect` records intent before and outcome after, so after a crash the
|
|
24
|
+
* state says precisely which effects completed, which are known not to have
|
|
25
|
+
* run, and which are *in doubt* (needs reconciliation with the external system).
|
|
26
|
+
*/
|
|
27
|
+
import { type Json } from './canonical.js';
|
|
28
|
+
import { type AssessOptions, type Assessment, type StateChange } from './assess.js';
|
|
29
|
+
import { type RetentionDecision, type RetentionPolicy } from './retention.js';
|
|
30
|
+
import { type AssumptionState, type Criticality, type EffectState, type EventStore, type PlanStepState, type StoreDiagnostic, type TaskEvent, type TaskState, type TaskStatus, type Tombstone } from './types.js';
|
|
31
|
+
export interface DurableTasksOptions {
|
|
32
|
+
store: EventStore;
|
|
33
|
+
now?: () => Date;
|
|
34
|
+
/** Source of ids for tasks/awaits created without an explicit id. */
|
|
35
|
+
newId?: () => string;
|
|
36
|
+
defaultLeaseMs?: number;
|
|
37
|
+
maxEventsPerTask?: number;
|
|
38
|
+
maxAppendAttempts?: number;
|
|
39
|
+
/** Tasks kept in the in-memory read cache (least recently used are dropped). Default 256. */
|
|
40
|
+
maxCachedTasks?: number;
|
|
41
|
+
/**
|
|
42
|
+
* Event slots above `maxEventsPerTask` that only lease changes (`claim`, `release`) and terminal events
|
|
43
|
+
* (`complete`, `fail`, `cancel`) may use, so a task that exhausted its ordinary budget can always be closed.
|
|
44
|
+
* The last slot is for a terminal event only. Default 16; 0 restores the strict ceiling.
|
|
45
|
+
*/
|
|
46
|
+
terminalReserveEvents?: number;
|
|
47
|
+
/**
|
|
48
|
+
* How long a reference pinned by a task that is being created counts as "creation in progress" when nothing
|
|
49
|
+
* of that task was published yet. A creator that died between pinning and publishing must not block the
|
|
50
|
+
* referenced task's pruning forever. Default 10 minutes.
|
|
51
|
+
*/
|
|
52
|
+
referenceGraceMs?: number;
|
|
53
|
+
}
|
|
54
|
+
/** Proof of the right to act on a task as its current worker. */
|
|
55
|
+
export interface Fence {
|
|
56
|
+
taskId: string;
|
|
57
|
+
owner: string;
|
|
58
|
+
epoch: number;
|
|
59
|
+
}
|
|
60
|
+
export interface CreateTaskInput {
|
|
61
|
+
/** Supply a deterministic id to make creation idempotent across retries and restarts. */
|
|
62
|
+
taskId?: string;
|
|
63
|
+
kind: string;
|
|
64
|
+
goal: string;
|
|
65
|
+
input?: unknown;
|
|
66
|
+
parentTaskId?: string;
|
|
67
|
+
dependsOn?: string[];
|
|
68
|
+
labels?: Record<string, string>;
|
|
69
|
+
}
|
|
70
|
+
export interface TaskSummary {
|
|
71
|
+
taskId: string;
|
|
72
|
+
kind: string;
|
|
73
|
+
goal: string;
|
|
74
|
+
status: TaskStatus;
|
|
75
|
+
createdAt: string;
|
|
76
|
+
updatedAt: string;
|
|
77
|
+
closedAt: string | null;
|
|
78
|
+
headSeq: number;
|
|
79
|
+
pendingAwaits: number;
|
|
80
|
+
leaseOwner: string | null;
|
|
81
|
+
parentTaskId: string | null;
|
|
82
|
+
}
|
|
83
|
+
export type DeliveryResult = {
|
|
84
|
+
kind: 'accepted';
|
|
85
|
+
taskId: string;
|
|
86
|
+
awaitId: string;
|
|
87
|
+
seq: number;
|
|
88
|
+
}
|
|
89
|
+
/** Same idempotency key seen before: nothing was written. */
|
|
90
|
+
| {
|
|
91
|
+
kind: 'duplicate';
|
|
92
|
+
taskId: string;
|
|
93
|
+
awaitId: string;
|
|
94
|
+
seq: number;
|
|
95
|
+
}
|
|
96
|
+
/** The await already had a different result. The delivery is kept in the log as `await.delivery_rejected`. */
|
|
97
|
+
| {
|
|
98
|
+
kind: 'conflict';
|
|
99
|
+
taskId: string;
|
|
100
|
+
awaitId: string;
|
|
101
|
+
/** The stored `await.delivery_rejected` event, or - when `recorded` is false - the event that resolved the await. */
|
|
102
|
+
seq: number;
|
|
103
|
+
/**
|
|
104
|
+
* False when the per-await / per-task cap on stored rejections was reached: the delivery was answered
|
|
105
|
+
* but, to keep the log bounded, not written.
|
|
106
|
+
*/
|
|
107
|
+
recorded: boolean;
|
|
108
|
+
} | {
|
|
109
|
+
kind: 'ignored';
|
|
110
|
+
reason: 'task-closed' | 'task-pruned';
|
|
111
|
+
taskId: string;
|
|
112
|
+
} | {
|
|
113
|
+
kind: 'rejected';
|
|
114
|
+
reason: 'malformed-token' | 'unknown-task' | 'unknown-await' | 'bad-token';
|
|
115
|
+
};
|
|
116
|
+
export interface EffectOptions<T extends Json> {
|
|
117
|
+
description: string;
|
|
118
|
+
params?: unknown;
|
|
119
|
+
/**
|
|
120
|
+
* Asked when the previous attempt left the outcome unrecorded. Look at the external
|
|
121
|
+
* system (by the effect key, which should double as its idempotency key) and say what happened.
|
|
122
|
+
*/
|
|
123
|
+
reconcile?: (effect: EffectState) => Promise<{
|
|
124
|
+
status: 'completed';
|
|
125
|
+
result: T;
|
|
126
|
+
} | {
|
|
127
|
+
status: 'not-executed';
|
|
128
|
+
}>;
|
|
129
|
+
/**
|
|
130
|
+
* Says what an exception thrown by `fn` proves. `'not-executed'`: the external operation certainly did not
|
|
131
|
+
* take effect. `'unknown'`: it may have (a timeout, a dropped connection, any error after the request left).
|
|
132
|
+
* Default: only `EffectNotExecutedError` is `'not-executed'`; everything else is `'unknown'`, because an
|
|
133
|
+
* exception is not evidence that the remote side did nothing.
|
|
134
|
+
*/
|
|
135
|
+
classifyError?: (err: unknown) => 'not-executed' | 'unknown';
|
|
136
|
+
/**
|
|
137
|
+
* Whether a failure classified `'not-executed'` may be run again (default true). It has no effect on an
|
|
138
|
+
* `'unknown'` failure: that one is never run again blindly, whatever this says — it needs `reconcile`.
|
|
139
|
+
*/
|
|
140
|
+
retryable?: boolean;
|
|
141
|
+
}
|
|
142
|
+
export interface EffectOutcome<T> {
|
|
143
|
+
result: T;
|
|
144
|
+
/** True when the recorded result was returned and the function was not called. */
|
|
145
|
+
replayed: boolean;
|
|
146
|
+
}
|
|
147
|
+
export interface ResumePacket {
|
|
148
|
+
formatVersion: 1;
|
|
149
|
+
generatedFromSeq: number;
|
|
150
|
+
task: {
|
|
151
|
+
taskId: string;
|
|
152
|
+
kind: string;
|
|
153
|
+
goal: string;
|
|
154
|
+
input: Json | null;
|
|
155
|
+
parentTaskId: string | null;
|
|
156
|
+
dependsOn: string[];
|
|
157
|
+
labels: Record<string, string>;
|
|
158
|
+
status: TaskStatus;
|
|
159
|
+
createdAt: string;
|
|
160
|
+
headSeq: number;
|
|
161
|
+
};
|
|
162
|
+
assessment: Assessment;
|
|
163
|
+
plan: PlanStepState[] | null;
|
|
164
|
+
decisions: TaskState['decisions'];
|
|
165
|
+
assumptions: AssumptionState[];
|
|
166
|
+
observations: TaskState['observations'][string][];
|
|
167
|
+
effects: EffectState[];
|
|
168
|
+
awaits: Array<TaskState['awaits'][string]>;
|
|
169
|
+
/** For every unconsumed result: what changed between sending the request and now. */
|
|
170
|
+
sinceSend: Array<{
|
|
171
|
+
awaitId: string;
|
|
172
|
+
basisSeq: number;
|
|
173
|
+
changes: StateChange[];
|
|
174
|
+
}>;
|
|
175
|
+
timeline: Array<{
|
|
176
|
+
seq: number;
|
|
177
|
+
type: string;
|
|
178
|
+
at: string;
|
|
179
|
+
actor: string | null;
|
|
180
|
+
key: string | null;
|
|
181
|
+
}>;
|
|
182
|
+
timelineTruncated: boolean;
|
|
183
|
+
}
|
|
184
|
+
export interface VerifyReport {
|
|
185
|
+
taskId: string;
|
|
186
|
+
ok: boolean;
|
|
187
|
+
headSeq: number | null;
|
|
188
|
+
status: TaskStatus | 'pruned' | null;
|
|
189
|
+
error: string | null;
|
|
190
|
+
diagnostics: StoreDiagnostic[];
|
|
191
|
+
}
|
|
192
|
+
export interface RetentionReport {
|
|
193
|
+
decisions: RetentionDecision[];
|
|
194
|
+
applied: Array<{
|
|
195
|
+
taskId: string;
|
|
196
|
+
action: 'prune' | 'compact';
|
|
197
|
+
detail: string;
|
|
198
|
+
}>;
|
|
199
|
+
}
|
|
200
|
+
/** A unique, human-readable worker identity: host, pid, random suffix. Use one per process incarnation. */
|
|
201
|
+
export declare function newOwnerId(): string;
|
|
202
|
+
export declare function parseToken(token: unknown): {
|
|
203
|
+
taskId: string;
|
|
204
|
+
awaitId: string;
|
|
205
|
+
nonce: string;
|
|
206
|
+
} | null;
|
|
207
|
+
export declare class DurableTasks {
|
|
208
|
+
private readonly store;
|
|
209
|
+
private readonly now;
|
|
210
|
+
private readonly newId;
|
|
211
|
+
private readonly defaultLeaseMs;
|
|
212
|
+
private readonly maxEvents;
|
|
213
|
+
private readonly maxAttempts;
|
|
214
|
+
private readonly maxCached;
|
|
215
|
+
private readonly terminalReserve;
|
|
216
|
+
private readonly referenceGraceMs;
|
|
217
|
+
/** Validated, incrementally extended view per task. A cache of the log, never an authority. */
|
|
218
|
+
private readonly cache;
|
|
219
|
+
/** Effect executions running in this runtime, so concurrent calls with one identity share one `fn` call. */
|
|
220
|
+
private readonly inflight;
|
|
221
|
+
constructor(opts: DurableTasksOptions);
|
|
222
|
+
private remember;
|
|
223
|
+
/** Brings the cached state up to the head of the log. Throws if the task is missing or pruned. */
|
|
224
|
+
private refresh;
|
|
225
|
+
private loadFull;
|
|
226
|
+
/**
|
|
227
|
+
* Read state -> decide -> append, repeated until the append wins its slot.
|
|
228
|
+
* `plan` must be a pure function of the state it is given: it is re-run
|
|
229
|
+
* against fresh state after every lost race.
|
|
230
|
+
*/
|
|
231
|
+
private mutate;
|
|
232
|
+
/**
|
|
233
|
+
* How many events a task may hold before `type` is refused. Ordinary events stop at `maxEvents`; lease changes
|
|
234
|
+
* may use the reserve except its last slot; terminal events may use all of it. See `terminalReserveEvents`.
|
|
235
|
+
*/
|
|
236
|
+
private eventLimitFor;
|
|
237
|
+
/**
|
|
238
|
+
* Runs a proposed event through the fold before anything is stored. A violation here means the *caller's*
|
|
239
|
+
* request does not fit the task's current state (the stored log was just verified and is fine), so it is
|
|
240
|
+
* a `ValidationError`, never a `LogCorruptError`: corruption is reserved for stored data that fails verification.
|
|
241
|
+
*/
|
|
242
|
+
private precheck;
|
|
243
|
+
/**
|
|
244
|
+
* After an unknown publication outcome: is *our* event (same hash) the one in the slot? Matching bytes cannot prove
|
|
245
|
+
* that this call created the slot, so the answer is 'adopted', never 'appended' (Amendment-004G, F-G-3). A failing
|
|
246
|
+
* read propagates: the outcome stays unknown and no right is granted.
|
|
247
|
+
*/
|
|
248
|
+
private resolveUnknown;
|
|
249
|
+
createTask(input: CreateTaskInput): Promise<{
|
|
250
|
+
taskId: string;
|
|
251
|
+
created: boolean;
|
|
252
|
+
state: TaskState;
|
|
253
|
+
}>;
|
|
254
|
+
/**
|
|
255
|
+
* True when `taskId` exists and is not pruned. A tombstone may be transient (a prune that found a referrer
|
|
256
|
+
* withdraws it right away), so a pruned answer is re-checked for a short while before it is believed.
|
|
257
|
+
*/
|
|
258
|
+
private referenceIsLive;
|
|
259
|
+
/**
|
|
260
|
+
* Immediate feedback for the creator, NOT the safety net: a creator that is killed before it gets here leaves an
|
|
261
|
+
* active task behind, and that is made harmless by `claim` / discovery (see `blockingRequirement`). It runs without
|
|
262
|
+
* looking at any clock: a clock-dependent skip is what let a skewed creator keep a task whose parent was pruned.
|
|
263
|
+
* Only a parent that is GONE cancels the new task. A parent whose prune is merely unfinished is rolled back on the
|
|
264
|
+
* spot (this task is published and active, so it is a referrer the prune must respect) or, if that cannot be
|
|
265
|
+
* done now, left alone: `claim` refuses to run the task until the question is settled, and cancels nothing.
|
|
266
|
+
*/
|
|
267
|
+
private assertReferencesSurvived;
|
|
268
|
+
/**
|
|
269
|
+
* What a required task is, as seen right now (a logical model; nothing of this is persisted):
|
|
270
|
+
* - `live` it exists and carries no tombstone.
|
|
271
|
+
* - `pending` a tombstone exists, but the prune is unfinished and may still be rolled back, or cannot be examined.
|
|
272
|
+
* This is a transient state. It is never a reason to cancel anybody.
|
|
273
|
+
* - `gone` its removal has started or finished: the prune is committed and irreversible.
|
|
274
|
+
* - `missing` its directory is not there and no prune accounts for it (ADR-018 D2). Absence is not proof of a
|
|
275
|
+
* committed prune, so, like `pending`, it blocks execution and is never a reason to cancel anybody.
|
|
276
|
+
*
|
|
277
|
+
* Why the tombstone alone proves nothing: a pruner publishes it BEFORE it looks for referrers, and a stopped
|
|
278
|
+
* (SIGSTOP) or killed pruner leaves it behind with all data in place. Only the data decides:
|
|
279
|
+
* - complete data + a referrer that is active ⇒ the pruner has not passed its referrer check (or never will);
|
|
280
|
+
* the prune is rolled back here (`withdrawTombstone`, idempotent, refused once any file was removed).
|
|
281
|
+
* - data gone or partly removed ⇒ the pruner passed its referrer check and committed.
|
|
282
|
+
* With `recover: false` nothing is written: an unfinished prune is reported as `pending`.
|
|
283
|
+
* No timeout takes part in this decision; `pending` is retried by the caller, never promoted to `gone`.
|
|
284
|
+
*/
|
|
285
|
+
private requirementState;
|
|
286
|
+
/**
|
|
287
|
+
* The first task an ACTIVE task requires (`parentTaskId`, `dependsOn`) that is gone, else the first that is missing,
|
|
288
|
+
* else the first whose prune is pending, else `null`. This — not the presence of `task.created` in the log — is what permits execution. Why it
|
|
289
|
+
* is safe without any clock: a pruner publishes its tombstone and only then looks for referrers; this check runs
|
|
290
|
+
* after the task's `task.created` is published. So either the tombstone is visible here, or the pruner sees the
|
|
291
|
+
* task and backs off. Once the check has passed, no prune of the required task can succeed while this task is active.
|
|
292
|
+
*/
|
|
293
|
+
private blockingRequirement;
|
|
294
|
+
/**
|
|
295
|
+
* Durable, idempotent cleanup of an orphan whose required task is GONE (never for a pending prune):
|
|
296
|
+
* `task.cancelled` (a terminal event, which also fits in the reserve).
|
|
297
|
+
* Best effort by design: if the write fails (crash, ENOSPC) the task stays active in the log but
|
|
298
|
+
* `blockingRequirement` keeps refusing it on every call, and the next discovery tries the write again.
|
|
299
|
+
*/
|
|
300
|
+
private quarantine;
|
|
301
|
+
/**
|
|
302
|
+
* An active task that refers to `taskId`: either published (`parentTaskId` / `dependsOn`) or being created
|
|
303
|
+
* (a recent pin with no task behind it yet). `null` if nothing needs `taskId` any more.
|
|
304
|
+
*/
|
|
305
|
+
private activeReferrer;
|
|
306
|
+
getState(taskId: string): Promise<TaskState>;
|
|
307
|
+
/** The state when the log had `seq` events. */
|
|
308
|
+
getStateAt(taskId: string, seq: number): Promise<TaskState>;
|
|
309
|
+
getLog(taskId: string): Promise<{
|
|
310
|
+
state: TaskState;
|
|
311
|
+
events: TaskEvent[];
|
|
312
|
+
diagnostics: StoreDiagnostic[];
|
|
313
|
+
}>;
|
|
314
|
+
listTasks(filter?: {
|
|
315
|
+
status?: TaskStatus;
|
|
316
|
+
kind?: string;
|
|
317
|
+
label?: [string, string];
|
|
318
|
+
}): Promise<TaskSummary[]>;
|
|
319
|
+
/**
|
|
320
|
+
* Become the task's current worker. Fails with `LeaseHeldError` while another
|
|
321
|
+
* owner's lease is live; an expired or released lease (a dead worker) can be
|
|
322
|
+
* taken over. Every claim increments the epoch, which fences out the previous holder.
|
|
323
|
+
*/
|
|
324
|
+
claim(taskId: string, opts: {
|
|
325
|
+
owner: string;
|
|
326
|
+
leaseMs?: number;
|
|
327
|
+
}): Promise<Fence>;
|
|
328
|
+
private assertFence;
|
|
329
|
+
/** Mutation by the fenced worker. */
|
|
330
|
+
private fenced;
|
|
331
|
+
heartbeat(f: Fence, leaseMs?: number): Promise<void>;
|
|
332
|
+
/** Give the task up. Idempotent; a closed task or an already-superseded fence is a quiet no-op. */
|
|
333
|
+
release(f: Fence): Promise<void>;
|
|
334
|
+
declarePlan(f: Fence, steps: Array<{
|
|
335
|
+
id: string;
|
|
336
|
+
title: string;
|
|
337
|
+
dependsOn?: string[];
|
|
338
|
+
}>, reason?: string): Promise<void>;
|
|
339
|
+
/** Marks a step done. Idempotent: completing a done step is a no-op. */
|
|
340
|
+
completeStep(f: Fence, stepId: string, result?: unknown): Promise<void>;
|
|
341
|
+
skipStep(f: Fence, stepId: string, reason: string): Promise<void>;
|
|
342
|
+
/** Records why something was chosen. Same id + same content is a no-op. */
|
|
343
|
+
recordDecision(f: Fence, d: {
|
|
344
|
+
id: string;
|
|
345
|
+
summary: string;
|
|
346
|
+
rationale?: string;
|
|
347
|
+
basedOn?: string[];
|
|
348
|
+
}): Promise<void>;
|
|
349
|
+
/**
|
|
350
|
+
* Records something the plan relies on, together with the value it was
|
|
351
|
+
* based on. `assess` later compares it with the current value of the same
|
|
352
|
+
* key. `blocking` (default): if it changes, the plan is not to be trusted.
|
|
353
|
+
* `advisory`: if it changes, adapt.
|
|
354
|
+
*/
|
|
355
|
+
recordAssumption(f: Fence, a: {
|
|
356
|
+
key: string;
|
|
357
|
+
statement: string;
|
|
358
|
+
value: unknown;
|
|
359
|
+
criticality?: Criticality;
|
|
360
|
+
evidence?: Array<{
|
|
361
|
+
ref: string;
|
|
362
|
+
note?: string;
|
|
363
|
+
}>;
|
|
364
|
+
/**
|
|
365
|
+
* Replace an active assumption that holds a DIFFERENT value. Off by default on purpose: a worker
|
|
366
|
+
* that is re-run after a restart re-states its assumptions, and silently overwriting the recorded
|
|
367
|
+
* value with today's one would erase exactly the change `assess` exists to detect.
|
|
368
|
+
*/
|
|
369
|
+
supersede?: boolean;
|
|
370
|
+
}): Promise<void>;
|
|
371
|
+
retractAssumption(f: Fence, key: string, reason: string): Promise<void>;
|
|
372
|
+
/**
|
|
373
|
+
* Another agent or system reports a fact about the world. No fence: observers
|
|
374
|
+
* are not the task's worker. An observation equal to the latest one for the key is a no-op.
|
|
375
|
+
*/
|
|
376
|
+
observe(taskId: string, o: {
|
|
377
|
+
key: string;
|
|
378
|
+
value: unknown;
|
|
379
|
+
source?: string;
|
|
380
|
+
}): Promise<void>;
|
|
381
|
+
/**
|
|
382
|
+
* Runs `fn` at most once *as far as the log can tell*, and records what happened.
|
|
383
|
+
* `key` should also be the idempotency key sent to the external system.
|
|
384
|
+
*
|
|
385
|
+
* - completed before: returns the recorded result, `fn` is not called;
|
|
386
|
+
* - intent recorded but no outcome (crash in between): calls `reconcile` if
|
|
387
|
+
* given, else throws `EffectInDoubtError` — it will not guess;
|
|
388
|
+
* - failed before and PROVABLY not executed (`EffectNotExecutedError` / `classifyError`): runs again
|
|
389
|
+
* if retryable (default), else `EffectFailedError`;
|
|
390
|
+
* - `fn` threw anything else: an exception does not prove the remote side did nothing (a timeout after
|
|
391
|
+
* the request was sent is the typical case), so the outcome is recorded as unknown and treated like an
|
|
392
|
+
* announced effect without outcome: `reconcile` or `EffectInDoubtError`, never an automatic re-run.
|
|
393
|
+
* This is "at most once as far as the log can tell", not exactly-once: only an idempotency key honoured
|
|
394
|
+
* by the external system (use `key` for it) makes a repeated call harmless.
|
|
395
|
+
*
|
|
396
|
+
* Concurrency. Calls with the same (fence, key) inside one runtime share a single execution: the
|
|
397
|
+
* later callers wait for it and receive its result (`replayed: true`) or its error. Between runtimes
|
|
398
|
+
* and processes the guarantee comes from the log: the announcement (`effect.intended`) is appended
|
|
399
|
+
* only if the effect is still exactly as this call found it, so of N callers that decided on the same
|
|
400
|
+
* state only one announces and runs `fn`; the others get `EffectConflictError` and `fn` is not
|
|
401
|
+
* called. A different owner finds the unfinished effect in doubt (its epoch is no longer current).
|
|
402
|
+
* A fence belongs to one worker; sharing one fence between processes is outside the contract
|
|
403
|
+
* (the compare-and-set still keeps `fn` single, but `reconcile` cannot tell a live peer from a dead one).
|
|
404
|
+
*/
|
|
405
|
+
runEffect<T extends Json>(f: Fence, key: string, fn: () => Promise<T>, opts: EffectOptions<T>): Promise<EffectOutcome<T>>;
|
|
406
|
+
private executeEffect;
|
|
407
|
+
/**
|
|
408
|
+
* Announces that an answer is expected and returns the token the answer must
|
|
409
|
+
* carry. Idempotent per `awaitId`: a restarted worker that registers the same
|
|
410
|
+
* await again gets the same token and nothing new is written.
|
|
411
|
+
* `basisSeq` records where the log stood at send time, so "what did the task
|
|
412
|
+
* look like then, and what changed since" is always answerable.
|
|
413
|
+
*/
|
|
414
|
+
registerAwait(f: Fence, a: {
|
|
415
|
+
awaitId?: string;
|
|
416
|
+
purpose: string;
|
|
417
|
+
stepId?: string;
|
|
418
|
+
request?: unknown;
|
|
419
|
+
deadlineAt?: Date | string;
|
|
420
|
+
}): Promise<{
|
|
421
|
+
awaitId: string;
|
|
422
|
+
token: string;
|
|
423
|
+
created: boolean;
|
|
424
|
+
}>;
|
|
425
|
+
/**
|
|
426
|
+
* Hand an externally produced result to the task it belongs to. Needs no
|
|
427
|
+
* live process and no fence — only the token. Safe to call repeatedly and in any order:
|
|
428
|
+
* - same `idempotencyKey` again → `duplicate`, nothing written;
|
|
429
|
+
* - a different result for an already resolved await → `conflict`; the payload is kept
|
|
430
|
+
* in the log (`await.delivery_rejected`) and does not replace the first one;
|
|
431
|
+
* - a result after the await's deadline passed → accepted, flagged `late`;
|
|
432
|
+
* - a result for a finished task → `ignored` (its log is sealed).
|
|
433
|
+
*/
|
|
434
|
+
deliver(token: string, payload: unknown, opts: {
|
|
435
|
+
idempotencyKey: string;
|
|
436
|
+
source?: string;
|
|
437
|
+
}): Promise<DeliveryResult>;
|
|
438
|
+
/** Marks pending awaits whose deadline has passed as expired. Returns the awaits it expired. */
|
|
439
|
+
sweepDeadlines(taskId?: string): Promise<Array<{
|
|
440
|
+
taskId: string;
|
|
441
|
+
awaitId: string;
|
|
442
|
+
}>>;
|
|
443
|
+
complete(f: Fence, result?: unknown): Promise<void>;
|
|
444
|
+
fail(f: Fence, error: string, detail?: unknown): Promise<void>;
|
|
445
|
+
/** Administrative stop: no fence needed. Idempotent for an already cancelled task. */
|
|
446
|
+
cancel(taskId: string, reason: string, actor?: string): Promise<void>;
|
|
447
|
+
assess(taskId: string, opts?: Omit<AssessOptions, 'now'> & {
|
|
448
|
+
now?: Date;
|
|
449
|
+
}): Promise<Assessment>;
|
|
450
|
+
/**
|
|
451
|
+
* An active task whose required task is gone is reported as not claimable, with the reason; `claim` enforces it.
|
|
452
|
+
* A required task whose prune is pending also makes it not claimable, but the task is not cancelled.
|
|
453
|
+
* `recover`: roll back an unfinished prune of a required task (a write); `assess` / `resumePacket` do not.
|
|
454
|
+
*/
|
|
455
|
+
private withRequirements;
|
|
456
|
+
/** Everything a resumed worker — or a reasoning component — needs, in one deterministic document. */
|
|
457
|
+
resumePacket(taskId: string, opts?: Omit<AssessOptions, 'now'> & {
|
|
458
|
+
now?: Date;
|
|
459
|
+
}): Promise<ResumePacket>;
|
|
460
|
+
private keyOf;
|
|
461
|
+
/**
|
|
462
|
+
* The wake-up query of a scheduler after a restart: active tasks nobody is
|
|
463
|
+
* working on that have something to do (`direct`, `adaptive`, `recovery`).
|
|
464
|
+
* Tasks that only wait for more results are not returned.
|
|
465
|
+
*/
|
|
466
|
+
findResumable(opts?: {
|
|
467
|
+
observations?: (state: TaskState) => Record<string, unknown> | undefined;
|
|
468
|
+
}): Promise<Array<{
|
|
469
|
+
taskId: string;
|
|
470
|
+
mode: Assessment['mode'];
|
|
471
|
+
reasons: string[];
|
|
472
|
+
}>>;
|
|
473
|
+
/** Re-reads and re-verifies logs end to end (hash chain, sequence, fold). Never repairs. */
|
|
474
|
+
verify(taskId?: string): Promise<VerifyReport[]>;
|
|
475
|
+
/**
|
|
476
|
+
* Decide what retention would do. Nothing is changed. Tasks whose log fails
|
|
477
|
+
* verification are skipped (never pruned or compacted while corrupt).
|
|
478
|
+
*/
|
|
479
|
+
planRetention(policy: RetentionPolicy): Promise<RetentionDecision[]>;
|
|
480
|
+
/** Executes a plan. Every destructive step re-checks its precondition against the live log. */
|
|
481
|
+
applyRetention(policy: RetentionPolicy): Promise<RetentionReport>;
|
|
482
|
+
/**
|
|
483
|
+
* Packs events up to `throughSeq` into verified segments. Returns the number of events packed.
|
|
484
|
+
* Also finishes an interrupted earlier compaction: loose copies that a published segment already covers
|
|
485
|
+
* are removed (only if byte-identical to the segment), even when there is nothing new to pack.
|
|
486
|
+
*/
|
|
487
|
+
compact(taskId: string, opts: {
|
|
488
|
+
throughSeq: number;
|
|
489
|
+
}): Promise<number>;
|
|
490
|
+
/**
|
|
491
|
+
* Removes a finished task's log, leaving a tombstone. Refuses unless the
|
|
492
|
+
* task is terminal, past retention, and not referenced by an active task —
|
|
493
|
+
* checked now, against the live log, not against an earlier plan.
|
|
494
|
+
*/
|
|
495
|
+
pruneTask(taskId: string, policy: Pick<RetentionPolicy, 'terminalRetentionMs'>): Promise<Tombstone>;
|
|
496
|
+
/** A referrer showed up after the tombstone was published: undo the prune if the data is still complete. */
|
|
497
|
+
private refuseAfterTombstone;
|
|
498
|
+
}
|
|
499
|
+
//# sourceMappingURL=runtime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/durable/runtime.ts"],"names":[],"mappings":"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"}
|