@wrongstack/core 0.264.0 → 0.265.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.
Files changed (87) hide show
  1. package/dist/{agent-bridge-D8sa1vtv.d.ts → agent-bridge-DrkBxszZ.d.ts} +1 -1
  2. package/dist/{agent-subagent-runner-c9DLkaas.d.ts → agent-subagent-runner-DM2pP-B6.d.ts} +113 -11
  3. package/dist/{brain-O1IdKPaK.d.ts → brain-BXd_61kQ.d.ts} +31 -2
  4. package/dist/{compactor-BBy0rCtB.d.ts → compactor-B8pOf45Y.d.ts} +1 -1
  5. package/dist/{config-Dz2F3H2K.d.ts → config-BMCj_XDs.d.ts} +80 -12
  6. package/dist/{context-BGSpZNSE.d.ts → context-MRk5PhNv.d.ts} +26 -12
  7. package/dist/coordination/index.d.ts +77 -21
  8. package/dist/coordination/index.js +557 -159
  9. package/dist/coordination/index.js.map +1 -1
  10. package/dist/{default-config-CXsDvOmP.d.ts → default-config-B0cj-Hry.d.ts} +11 -1
  11. package/dist/defaults/index.d.ts +28 -28
  12. package/dist/defaults/index.js +609 -195
  13. package/dist/defaults/index.js.map +1 -1
  14. package/dist/execution/index.d.ts +16 -16
  15. package/dist/execution/index.js +394 -155
  16. package/dist/execution/index.js.map +1 -1
  17. package/dist/execution/prompt-enhancer.d.ts +2 -2
  18. package/dist/execution/prompt-enhancer.js +1 -1
  19. package/dist/execution/prompt-enhancer.js.map +1 -1
  20. package/dist/extension/index.d.ts +6 -6
  21. package/dist/{goal-preamble-DzjFuN3p.d.ts → goal-preamble-DvHDSKSe.d.ts} +14 -10
  22. package/dist/{goal-store-CxWmCGbH.d.ts → goal-store-DtLMySNb.d.ts} +1 -1
  23. package/dist/{index-CYIQrXVF.d.ts → index-B-ch8K9C.d.ts} +8 -8
  24. package/dist/{index-CbLSI66_.d.ts → index-CEDeNodM.d.ts} +5 -5
  25. package/dist/index.d.ts +183 -52
  26. package/dist/index.js +1779 -673
  27. package/dist/index.js.map +1 -1
  28. package/dist/infrastructure/index.d.ts +6 -6
  29. package/dist/infrastructure/index.js +12 -8
  30. package/dist/infrastructure/index.js.map +1 -1
  31. package/dist/kernel/index.d.ts +9 -9
  32. package/dist/kernel/index.js +1 -1
  33. package/dist/kernel/index.js.map +1 -1
  34. package/dist/{llm-selector-DzxuZnNz.d.ts → llm-selector-C0tfTCUe.d.ts} +14 -2
  35. package/dist/{mcp-servers-DC4QRPUI.d.ts → mcp-servers-2x4w6Jn9.d.ts} +3 -3
  36. package/dist/models/index.d.ts +5 -5
  37. package/dist/models/index.js +74 -30
  38. package/dist/models/index.js.map +1 -1
  39. package/dist/{models-registry-B_siPxqN.d.ts → models-registry-DmJlKuNp.d.ts} +1 -1
  40. package/dist/{multi-agent-coordinator-CK5Jdj9K.d.ts → multi-agent-coordinator-DyCkCZnU.d.ts} +1 -1
  41. package/dist/{null-fleet-bus-DgvD4SCO.d.ts → null-fleet-bus-CG9QY2aP.d.ts} +6 -6
  42. package/dist/observability/index.d.ts +2 -2
  43. package/dist/{parallel-eternal-engine-bK0JQBR_.d.ts → parallel-eternal-engine-Jw9uhEoT.d.ts} +9 -9
  44. package/dist/{path-resolver-BPEDlN38.d.ts → path-resolver-Dy2ej-gE.d.ts} +3 -3
  45. package/dist/{permission-4yvGmMRB.d.ts → permission-B9SB45lp.d.ts} +1 -1
  46. package/dist/{permission-policy-C6XpsBOy.d.ts → permission-policy-CkjSXabK.d.ts} +2 -2
  47. package/dist/{pipeline-CXCeMz8J.d.ts → pipeline-DPDxH_7m.d.ts} +3 -3
  48. package/dist/{plan-templates-BvzRBkJc.d.ts → plan-templates-CzD9GnAU.d.ts} +32 -8
  49. package/dist/{provider-runner-C5aQpDWE.d.ts → provider-runner-DMa70ODu.d.ts} +3 -3
  50. package/dist/{retry-policy-CFhdtRzz.d.ts → retry-policy-CN0khdlj.d.ts} +1 -1
  51. package/dist/sdd/index.d.ts +8 -8
  52. package/dist/sdd/index.js +274 -93
  53. package/dist/sdd/index.js.map +1 -1
  54. package/dist/{secret-vault-CxiVLbt1.d.ts → secret-vault-B2yw84VT.d.ts} +43 -4
  55. package/dist/secret-vault-BAKpgFw_.d.ts +57 -0
  56. package/dist/security/index.d.ts +5 -5
  57. package/dist/security/index.js +204 -23
  58. package/dist/security/index.js.map +1 -1
  59. package/dist/{selector-gIuhRTkN.d.ts → selector-CzHh_igB.d.ts} +1 -1
  60. package/dist/{session-event-bridge-DkvvrpDt.d.ts → session-event-bridge-BUI6Jf-4.d.ts} +1 -1
  61. package/dist/{session-reader-KdfVwkKP.d.ts → session-reader-CMgdMSRP.d.ts} +1 -1
  62. package/dist/storage/index.d.ts +112 -15
  63. package/dist/storage/index.js +419 -81
  64. package/dist/storage/index.js.map +1 -1
  65. package/dist/tools/index.d.ts +2 -2
  66. package/dist/types/index.d.ts +21 -21
  67. package/dist/types/index.js +261 -53
  68. package/dist/types/index.js.map +1 -1
  69. package/dist/utils/index.d.ts +3 -3
  70. package/dist/utils/index.js +3 -5
  71. package/dist/utils/index.js.map +1 -1
  72. package/dist/{wstack-paths-CJjEwPXn.d.ts → wstack-paths-hOpNLmvf.d.ts} +2 -0
  73. package/package.json +1 -1
  74. package/skills/api-design/SKILL.md +1 -1
  75. package/skills/audit-log/SKILL.md +6 -6
  76. package/skills/bug-hunter/SKILL.md +5 -5
  77. package/skills/chimera/SKILL.md +4 -4
  78. package/skills/docker-deploy/SKILL.md +1 -1
  79. package/skills/git-flow/SKILL.md +3 -3
  80. package/skills/multi-agent/SKILL.md +3 -3
  81. package/skills/node-modern/SKILL.md +1 -0
  82. package/skills/observability/SKILL.md +2 -2
  83. package/skills/output-standards/SKILL.md +51 -28
  84. package/skills/refactor-planner/SKILL.md +3 -3
  85. package/skills/security-scanner/SKILL.md +4 -3
  86. package/skills/tech-stack/SKILL.md +1 -2
  87. package/dist/secret-vault-BJDY28ev.d.ts +0 -25
@@ -1,4 +1,4 @@
1
- import { M as Message } from './context-BGSpZNSE.js';
1
+ import { M as Message } from './context-MRk5PhNv.js';
2
2
 
3
3
  /**
4
4
  * Result of LLM-driven message importance analysis.
@@ -1,4 +1,4 @@
1
- import { S as SessionEvent, a as SessionWriter } from './context-BGSpZNSE.js';
1
+ import { S as SessionEvent, a as SessionWriter } from './context-MRk5PhNv.js';
2
2
 
3
3
  type AuditLevel = 'minimal' | 'standard' | 'full';
4
4
  /**
@@ -1,4 +1,4 @@
1
- import { g as ContentBlock, S as SessionEvent, h as SessionMetadata, i as SessionStore } from './context-BGSpZNSE.js';
1
+ import { g as ContentBlock, S as SessionEvent, h as SessionMetadata, i as SessionStore } from './context-MRk5PhNv.js';
2
2
 
3
3
  type AttachmentKind = 'text' | 'image' | 'file';
4
4
  interface AttachmentMeta {
@@ -1,20 +1,20 @@
1
- import { M as MemoryBackend, j as FileMemoryBackendOptions } from '../plan-templates-BvzRBkJc.js';
2
- export { A as AbandonedSession, a as AttachmentStoreOptions, C as ConfigLoaderOptions, b as ConfigMigration, c as ConfigMigrationError, d as ConfigSource, D as DEFAULT_CONFIG_MIGRATIONS, e as DefaultAttachmentStore, f as DefaultConfigLoader, g as DefaultConfigStore, h as DefaultMemoryStore, i as DefaultSessionStore, F as FileMemoryBackend, k as MemoryStoreOptions, l as MigrationContext, m as MigrationResult, P as PersistedQueueItem, n as PlanFile, o as PlanItem, p as PlanTemplate, Q as QueueStore, R as RecoveryLock, q as RecoveryLockOptions, S as SessionAnalyzer, r as SessionStoreOptions, T as TodosCheckpointFile, s as addPlanItem, t as attachPlanCheckpoint, u as attachTodosCheckpoint, v as clearPlan, w as deriveTodosFromPlanItem, x as emptyPlan, y as formatPlan, z as formatPlanTemplates, B as getPlanTemplate, E as listPlanTemplates, G as loadPlan, H as loadTodosCheckpoint, I as mutatePlan, J as parseEntries, K as removePlanItem, L as runConfigMigrations, N as savePlan, O as saveTodosCheckpoint, U as setPlanItemStatus } from '../plan-templates-BvzRBkJc.js';
3
- import { M as MemoryScope, b as MemoryEntry, c as MemoryStore, E as EventBus } from '../brain-O1IdKPaK.js';
4
- import { l as AgentExtension, j as AfterRunHook } from '../index-CbLSI66_.js';
5
- import { P as Provider, R as Request, b as Response, S as SessionEvent } from '../context-BGSpZNSE.js';
6
- export { D as DefaultSessionReader, f as DefaultSessionReaderOptions, S as SessionReader } from '../session-reader-KdfVwkKP.js';
1
+ import { M as MemoryBackend, j as FileMemoryBackendOptions } from '../plan-templates-CzD9GnAU.js';
2
+ export { A as AbandonedSession, a as AttachmentStoreOptions, C as ConfigLoaderOptions, b as ConfigMigration, c as ConfigMigrationError, d as ConfigSource, D as DEFAULT_CONFIG_MIGRATIONS, e as DefaultAttachmentStore, f as DefaultConfigLoader, g as DefaultConfigStore, h as DefaultMemoryStore, i as DefaultSessionStore, F as FileMemoryBackend, k as MemoryStoreOptions, l as MigrationContext, m as MigrationResult, P as PersistedQueueItem, n as PlanFile, o as PlanItem, p as PlanTemplate, Q as QueueStore, R as RecoveryLock, q as RecoveryLockOptions, S as SessionAnalyzer, r as SessionStoreOptions, T as TodosCheckpointFile, s as addPlanItem, t as attachPlanCheckpoint, u as attachTodosCheckpoint, v as clearPlan, w as deriveTodosFromPlanItem, x as emptyPlan, y as formatPlan, z as formatPlanTemplates, B as getPlanTemplate, E as listPlanTemplates, G as loadPlan, H as loadTodosCheckpoint, I as mutatePlan, J as parseEntries, K as removePlanItem, L as runConfigMigrations, N as savePlan, O as saveTodosCheckpoint, U as setPlanItemStatus } from '../plan-templates-CzD9GnAU.js';
3
+ import { M as MemoryScope, b as MemoryEntry, c as MemoryStore, E as EventBus } from '../brain-BXd_61kQ.js';
4
+ import { l as AgentExtension, j as AfterRunHook } from '../index-CEDeNodM.js';
5
+ import { P as Provider, R as Request, b as Response, S as SessionEvent } from '../context-MRk5PhNv.js';
6
+ export { D as DefaultSessionReader, f as DefaultSessionReaderOptions, S as SessionReader } from '../session-reader-CMgdMSRP.js';
7
7
  import { S as SessionRewinder, C as CheckpointInfo, a as RewindResultExtended } from '../session-rewinder-C9HnMkhP.js';
8
8
  import { T as TaskItem } from '../task-format-vGOIftmK.js';
9
9
  export { a as DirectorStateCheckpoint, D as DirectorStateSnapshot, b as DirectorSubagentState, c as DirectorTaskState, l as loadDirectorState } from '../director-state-BfeCUbmk.js';
10
- export { G as GoalFile, J as JournalEntry, M as MAX_JOURNAL_ENTRIES, a as MAX_PROGRESS_HISTORY, P as ProgressSnapshot, b as appendJournal, e as emptyGoal, f as formatGoal, g as goalFilePath, l as loadGoal, p as parseProgressFromText, r as recordProgress, s as saveGoal, c as setProgress, d as summarizeUsage } from '../goal-store-CxWmCGbH.js';
11
- import { W as WstackPaths } from '../wstack-paths-CJjEwPXn.js';
12
- import { E as SyncCategory, k as SyncConfig } from '../config-Dz2F3H2K.js';
13
- export { A as AuditLevel, C as CORE_RECONSTRUCT_EVENTS, a as STANDARD_AUDIT_EVENTS, S as SessionEventBridge, b as SessionEventBridgeOptions, c as SessionSamplingOptions, T as ToolProgressSamplingOptions, d as createSessionEventBridge, r as resolveAuditLevel, e as resolveSessionLoggingConfig } from '../session-event-bridge-DkvvrpDt.js';
14
- import '../permission-4yvGmMRB.js';
15
- import '../secret-vault-BJDY28ev.js';
10
+ export { G as GoalFile, J as JournalEntry, M as MAX_JOURNAL_ENTRIES, a as MAX_PROGRESS_HISTORY, P as ProgressSnapshot, b as appendJournal, e as emptyGoal, f as formatGoal, g as goalFilePath, l as loadGoal, p as parseProgressFromText, r as recordProgress, s as saveGoal, c as setProgress, d as summarizeUsage } from '../goal-store-DtLMySNb.js';
11
+ import { W as WstackPaths } from '../wstack-paths-hOpNLmvf.js';
12
+ import { G as SyncCategory, k as SyncConfig } from '../config-BMCj_XDs.js';
13
+ export { A as AuditLevel, C as CORE_RECONSTRUCT_EVENTS, a as STANDARD_AUDIT_EVENTS, S as SessionEventBridge, b as SessionEventBridgeOptions, c as SessionSamplingOptions, T as ToolProgressSamplingOptions, d as createSessionEventBridge, r as resolveAuditLevel, e as resolveSessionLoggingConfig } from '../session-event-bridge-BUI6Jf-4.js';
14
+ import '../permission-B9SB45lp.js';
15
+ import '../secret-vault-BAKpgFw_.js';
16
16
  import '../logger-B63L5bTg.js';
17
- import '../pipeline-CXCeMz8J.js';
17
+ import '../pipeline-DPDxH_7m.js';
18
18
  import '../observability-D-HZN_mF.js';
19
19
  import '../task-graph-u1q9Jkyk.js';
20
20
 
@@ -579,6 +579,22 @@ interface AgentEntry {
579
579
  iterations: number;
580
580
  /** Tool calls so far. */
581
581
  toolCalls: number;
582
+ /** Cumulative cost in USD for this agent, when known. */
583
+ costUsd?: number | undefined;
584
+ /** Cumulative input tokens, when known. */
585
+ tokensIn?: number | undefined;
586
+ /** Cumulative output tokens, when known. */
587
+ tokensOut?: number | undefined;
588
+ /** Context window fill 0–100 (may exceed 100 when over limit), when known. */
589
+ ctxPct?: number | undefined;
590
+ /** Model id this agent is running on, when known. */
591
+ model?: string | undefined;
592
+ /**
593
+ * Tail of the assistant text currently being streamed (capped, throttled).
594
+ * Lets a cross-process watcher see the response form in near-real-time
595
+ * instead of waiting for the completed turn to land in the session log.
596
+ */
597
+ partialText?: string | undefined;
582
598
  /** UTC ISO timestamp of last activity. */
583
599
  lastActivityAt: string;
584
600
  }
@@ -589,6 +605,12 @@ interface SessionRegistryEntry {
589
605
  projectRoot: string;
590
606
  projectName: string;
591
607
  workingDir: string;
608
+ /**
609
+ * Which surface owns this session — `'tui'` / `'webui'` / `'cli'` (one-shot or
610
+ * REPL). Lets cross-process consumers (e.g. the WebUI Fleet HQ office map) label
611
+ * each live session by client kind. Optional for back-compat with older entries.
612
+ */
613
+ clientType?: 'tui' | 'webui' | 'cli' | 'repl' | string | undefined;
592
614
  /** Current git branch, if the project is a git repo. Detected at registration. */
593
615
  gitBranch?: string | undefined;
594
616
  status: SessionLiveStatus;
@@ -605,6 +627,12 @@ declare class SessionRegistry {
605
627
  private readonly filePath;
606
628
  private heartbeatTimer;
607
629
  private currentSessionId;
630
+ /**
631
+ * Last full entry this process registered. Kept so the heartbeat can
632
+ * re-create our entry if it ever goes missing — e.g. our initial register()
633
+ * write was dropped (a wedged lock), the file was reset, or we were pruned.
634
+ */
635
+ private lastEntry;
608
636
  constructor(globalRoot: string);
609
637
  /**
610
638
  * Register the current session. Call once on session start.
@@ -646,6 +674,14 @@ declare class SessionRegistry {
646
674
  private heartbeat;
647
675
  private readAndPrune;
648
676
  private atomicUpdate;
677
+ /**
678
+ * Break a contended lock if it is stale: the recorded owner pid is no longer
679
+ * alive, or the lock is older than {@link STALE_LOCK_MS}. Returns true when the
680
+ * lock was removed (caller should retry acquisition). Best-effort and
681
+ * race-tolerant — a fresh lock (age ~0, live owner) is never broken, so the
682
+ * common concurrent case self-heals on the next heartbeat.
683
+ */
684
+ private breakStaleLock;
649
685
  private writeAtomicLocked;
650
686
  /** Legacy write without lock — used by heartbeat for performance. */
651
687
  private writeAtomic;
@@ -671,6 +707,12 @@ interface AgentStatusTrackerOptions {
671
707
  registry: SessionRegistry;
672
708
  /** Leader agent name shown in the registry. Default: "leader". */
673
709
  leaderName?: string | undefined;
710
+ /**
711
+ * Best-effort callback fired after each registry write settles. Used to nudge
712
+ * local WebUI servers (FleetNotifier) so cross-process status reaches the map
713
+ * without waiting on their file-watch/poll. Never block or throw.
714
+ */
715
+ onUpdate?: (() => void) | undefined;
674
716
  }
675
717
  declare class AgentStatusTracker {
676
718
  private readonly events;
@@ -681,13 +723,62 @@ declare class AgentStatusTracker {
681
723
  private leaderCurrentTool;
682
724
  private leaderIterations;
683
725
  private leaderToolCalls;
726
+ private leaderCostUsd;
727
+ private leaderTokensIn;
728
+ private leaderTokensOut;
729
+ private leaderCtxPct;
730
+ private leaderModel;
731
+ private leaderPartialText;
684
732
  private unsubscribers;
733
+ private readonly onUpdate;
734
+ private sweepTimer;
735
+ private partialTimer;
685
736
  constructor(opts: AgentStatusTrackerOptions);
686
737
  start(): void;
687
738
  stop(): void;
739
+ /**
740
+ * Coalesce streamed-text flushes: at most one registry write per
741
+ * {@link PARTIAL_FLUSH_THROTTLE_MS} while text streams in, so per-token
742
+ * deltas never thrash the cross-process registry file.
743
+ */
744
+ private schedulePartialFlush;
745
+ /**
746
+ * Remove subagents that have been finished (idle/error) for longer than
747
+ * {@link AGENT_REAP_MS}. Running / streaming / waiting_user agents are kept
748
+ * regardless of age — only *not-working* agents are reaped.
749
+ */
750
+ private sweep;
688
751
  private flush;
689
752
  }
690
753
 
754
+ interface FleetNotifierOptions {
755
+ /** WrongStack global dir (`~/.wrongstack`) holding `webui-instances.json`. */
756
+ baseDir: string;
757
+ /** This process's project root — only WebUIs on the same project are pinged. */
758
+ projectRoot: string;
759
+ /** This process's pid, so a WebUI never pings itself. */
760
+ selfPid?: number | undefined;
761
+ /** Injectable POST for tests. Defaults to a timed `fetch`. */
762
+ post?: ((url: string) => Promise<void>) | undefined;
763
+ }
764
+ declare class FleetNotifier {
765
+ private readonly baseDir;
766
+ private readonly projectRoot;
767
+ private readonly selfPid;
768
+ private readonly doPost;
769
+ private cache;
770
+ private timer;
771
+ private disposed;
772
+ constructor(opts: FleetNotifierOptions);
773
+ /** Coalesced, best-effort nudge. Safe to call on every status change. */
774
+ notify(): void;
775
+ /** Resolve same-project WebUI ping URLs (cached briefly). Exposed for tests. */
776
+ endpoints(): Promise<string[]>;
777
+ dispose(): void;
778
+ private flush;
779
+ private discover;
780
+ }
781
+
691
782
  interface SessionRewinderOptions {
692
783
  sessionsDir: string;
693
784
  /** The project root directory; used to validate rewind targets stay inside it. */
@@ -720,7 +811,13 @@ declare function loadTasks(filePath: string, events?: EventBus, traceId?: string
720
811
  * Write the task file atomically. Prefer `mutateTasks` for read-modify-write
721
812
  * cycles — this low-level function does NOT acquire a lock.
722
813
  */
723
- declare function saveTasks(filePath: string, tasks: TaskFile, events?: EventBus, traceId?: string): Promise<void>;
814
+ /**
815
+ * Persist the task file. Returns `true` on success, `false` if the write
816
+ * failed (still emits `storage.error` + warns — does NOT throw). `mutateTasks`
817
+ * inspects the result and throws so the task TOOL can report `ok:false`
818
+ * instead of falsely claiming the tasks were saved.
819
+ */
820
+ declare function saveTasks(filePath: string, tasks: TaskFile, events?: EventBus, traceId?: string): Promise<boolean>;
724
821
  /**
725
822
  * Load, modify, and save the task file under a file-level lock.
726
823
  * `fn` receives the current TaskFile (or a fresh empty one) and must
@@ -801,4 +898,4 @@ declare class CloudSync {
801
898
  private walkDir;
802
899
  }
803
900
 
804
- export { ALL_SYNC_CATEGORIES, type AgentEntry, type AgentLiveStatus, AgentStatusTracker, type AgentStatusTrackerOptions, type Annotation, AnnotationsStore, type AnnotationsStoreOptions, type AuditEntry, CloudSync, type ConsolidationOp, DefaultPromptStore, DefaultSessionRewinder, FileMemoryBackendOptions, GraphMemoryBackend, type GraphMemoryBackendOptions, MemoryBackend, type MemoryConsolidatorOptions, type PromptEntry, type PromptStore, type RecoveryPlan, type ReplayEntry, ReplayLogStore, type ReplayLogStoreOptions, type SessionLiveStatus, SessionMemoryConsolidator, SessionRecovery, SessionRegistry, type SessionRegistryEntry, type SessionRewinderOptions, type StaleSession, SyncCategory, SyncConfig, type SyncResult, type TaskFile, ToolAuditLog, type ToolAuditLogOptions, type VerifyResult, emptyTaskFile, getSessionRegistry, hasSessionRegistry, loadTasks, mutateTasks, saveTasks };
901
+ export { ALL_SYNC_CATEGORIES, type AgentEntry, type AgentLiveStatus, AgentStatusTracker, type AgentStatusTrackerOptions, type Annotation, AnnotationsStore, type AnnotationsStoreOptions, type AuditEntry, CloudSync, type ConsolidationOp, DefaultPromptStore, DefaultSessionRewinder, FileMemoryBackendOptions, FleetNotifier, type FleetNotifierOptions, GraphMemoryBackend, type GraphMemoryBackendOptions, MemoryBackend, type MemoryConsolidatorOptions, type PromptEntry, type PromptStore, type RecoveryPlan, type ReplayEntry, ReplayLogStore, type ReplayLogStoreOptions, type SessionLiveStatus, SessionMemoryConsolidator, SessionRecovery, SessionRegistry, type SessionRegistryEntry, type SessionRewinderOptions, type StaleSession, SyncCategory, SyncConfig, type SyncResult, type TaskFile, ToolAuditLog, type ToolAuditLogOptions, type VerifyResult, emptyTaskFile, getSessionRegistry, hasSessionRegistry, loadTasks, mutateTasks, saveTasks };