opentasks 0.1.2 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +218 -49
- package/dist/cli.d.ts +20 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +451 -15
- package/dist/cli.js.map +1 -1
- package/dist/client/client.d.ts +54 -0
- package/dist/client/client.d.ts.map +1 -1
- package/dist/client/client.js +148 -4
- package/dist/client/client.js.map +1 -1
- package/dist/client/index.d.ts +1 -1
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +1 -1
- package/dist/client/index.js.map +1 -1
- package/dist/core/discover.d.ts.map +1 -1
- package/dist/core/discover.js +7 -2
- package/dist/core/discover.js.map +1 -1
- package/dist/core/hash.d.ts.map +1 -1
- package/dist/core/hash.js +7 -0
- package/dist/core/hash.js.map +1 -1
- package/dist/core/id.d.ts +1 -1
- package/dist/core/id.d.ts.map +1 -1
- package/dist/core/id.js +2 -0
- package/dist/core/id.js.map +1 -1
- package/dist/core/worktree.js +4 -4
- package/dist/core/worktree.js.map +1 -1
- package/dist/daemon/events.d.ts +82 -0
- package/dist/daemon/events.d.ts.map +1 -0
- package/dist/daemon/events.js +71 -0
- package/dist/daemon/events.js.map +1 -0
- package/dist/daemon/flush.d.ts.map +1 -1
- package/dist/daemon/flush.js +12 -2
- package/dist/daemon/flush.js.map +1 -1
- package/dist/daemon/health-counters.d.ts +38 -0
- package/dist/daemon/health-counters.d.ts.map +1 -0
- package/dist/daemon/health-counters.js +42 -0
- package/dist/daemon/health-counters.js.map +1 -0
- package/dist/daemon/idempotency.d.ts +50 -0
- package/dist/daemon/idempotency.d.ts.map +1 -0
- package/dist/daemon/idempotency.js +104 -0
- package/dist/daemon/idempotency.js.map +1 -0
- package/dist/daemon/index.d.ts +2 -0
- package/dist/daemon/index.d.ts.map +1 -1
- package/dist/daemon/index.js +1 -0
- package/dist/daemon/index.js.map +1 -1
- package/dist/daemon/ipc.d.ts +32 -2
- package/dist/daemon/ipc.d.ts.map +1 -1
- package/dist/daemon/ipc.js +54 -3
- package/dist/daemon/ipc.js.map +1 -1
- package/dist/daemon/lifecycle.d.ts.map +1 -1
- package/dist/daemon/lifecycle.js +302 -8
- package/dist/daemon/lifecycle.js.map +1 -1
- package/dist/daemon/location-state.d.ts +60 -1
- package/dist/daemon/location-state.d.ts.map +1 -1
- package/dist/daemon/location-state.js +136 -31
- package/dist/daemon/location-state.js.map +1 -1
- package/dist/daemon/methods/context-files.d.ts.map +1 -1
- package/dist/daemon/methods/context-files.js +4 -3
- package/dist/daemon/methods/context-files.js.map +1 -1
- package/dist/daemon/methods/events.d.ts +22 -0
- package/dist/daemon/methods/events.d.ts.map +1 -0
- package/dist/daemon/methods/events.js +30 -0
- package/dist/daemon/methods/events.js.map +1 -0
- package/dist/daemon/methods/graph.d.ts +7 -0
- package/dist/daemon/methods/graph.d.ts.map +1 -1
- package/dist/daemon/methods/graph.js +24 -14
- package/dist/daemon/methods/graph.js.map +1 -1
- package/dist/daemon/methods/lifecycle.d.ts +16 -0
- package/dist/daemon/methods/lifecycle.d.ts.map +1 -1
- package/dist/daemon/methods/lifecycle.js +3 -1
- package/dist/daemon/methods/lifecycle.js.map +1 -1
- package/dist/daemon/methods/location.js.map +1 -1
- package/dist/daemon/methods/sync.d.ts +113 -0
- package/dist/daemon/methods/sync.d.ts.map +1 -0
- package/dist/daemon/methods/sync.js +158 -0
- package/dist/daemon/methods/sync.js.map +1 -0
- package/dist/daemon/methods/tools.d.ts.map +1 -1
- package/dist/daemon/methods/tools.js +42 -8
- package/dist/daemon/methods/tools.js.map +1 -1
- package/dist/daemon/methods/watch.d.ts +24 -0
- package/dist/daemon/methods/watch.d.ts.map +1 -1
- package/dist/daemon/methods/watch.js +178 -88
- package/dist/daemon/methods/watch.js.map +1 -1
- package/dist/daemon/sessionlog-watcher.d.ts.map +1 -1
- package/dist/daemon/sessionlog-watcher.js +4 -0
- package/dist/daemon/sessionlog-watcher.js.map +1 -1
- package/dist/graph/EdgeTypeRegistry.d.ts.map +1 -1
- package/dist/graph/EdgeTypeRegistry.js +32 -0
- package/dist/graph/EdgeTypeRegistry.js.map +1 -1
- package/dist/graph/FederatedGraph.d.ts.map +1 -1
- package/dist/graph/GraphologyAdapter.d.ts.map +1 -1
- package/dist/graph/GraphologyAdapter.js.map +1 -1
- package/dist/graph/HydratingFederatedGraph.d.ts.map +1 -1
- package/dist/graph/HydratingFederatedGraph.js +1 -1
- package/dist/graph/HydratingFederatedGraph.js.map +1 -1
- package/dist/graph/attempts.d.ts +50 -0
- package/dist/graph/attempts.d.ts.map +1 -0
- package/dist/graph/attempts.js +51 -0
- package/dist/graph/attempts.js.map +1 -0
- package/dist/graph/coordination.d.ts +4 -2
- package/dist/graph/coordination.d.ts.map +1 -1
- package/dist/graph/coordination.js +77 -85
- package/dist/graph/coordination.js.map +1 -1
- package/dist/graph/expansion.d.ts.map +1 -1
- package/dist/graph/expansion.js +1 -1
- package/dist/graph/expansion.js.map +1 -1
- package/dist/graph/git-graph-syncer.d.ts +24 -0
- package/dist/graph/git-graph-syncer.d.ts.map +1 -1
- package/dist/graph/git-graph-syncer.js +111 -26
- package/dist/graph/git-graph-syncer.js.map +1 -1
- package/dist/graph/provider-store.d.ts +12 -1
- package/dist/graph/provider-store.d.ts.map +1 -1
- package/dist/graph/provider-store.js +35 -8
- package/dist/graph/provider-store.js.map +1 -1
- package/dist/graph/query.d.ts.map +1 -1
- package/dist/graph/query.js +18 -2
- package/dist/graph/query.js.map +1 -1
- package/dist/graph/store.d.ts +18 -2
- package/dist/graph/store.d.ts.map +1 -1
- package/dist/graph/store.js +43 -0
- package/dist/graph/store.js.map +1 -1
- package/dist/graph/sync.js +1 -1
- package/dist/graph/sync.js.map +1 -1
- package/dist/graph/types.d.ts +9 -1
- package/dist/graph/types.d.ts.map +1 -1
- package/dist/graph/types.js.map +1 -1
- package/dist/graph/validation.d.ts.map +1 -1
- package/dist/graph/validation.js +20 -2
- package/dist/graph/validation.js.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -1
- package/dist/index.js.map +1 -1
- package/dist/materialization/archiver.d.ts.map +1 -1
- package/dist/materialization/archiver.js.map +1 -1
- package/dist/materialization/snapshot.d.ts.map +1 -1
- package/dist/materialization/snapshot.js +1 -1
- package/dist/materialization/snapshot.js.map +1 -1
- package/dist/materialization/types.d.ts +7 -5
- package/dist/materialization/types.d.ts.map +1 -1
- package/dist/materialization/types.js.map +1 -1
- package/dist/mcp/server.d.ts +2 -1
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +308 -11
- package/dist/mcp/server.js.map +1 -1
- package/dist/providers/beads.d.ts.map +1 -1
- package/dist/providers/beads.js +2 -0
- package/dist/providers/beads.js.map +1 -1
- package/dist/providers/claude-tasks.d.ts.map +1 -1
- package/dist/providers/claude-tasks.js.map +1 -1
- package/dist/providers/global.js +1 -1
- package/dist/providers/global.js.map +1 -1
- package/dist/providers/location.d.ts.map +1 -1
- package/dist/providers/location.js.map +1 -1
- package/dist/providers/map-client-factory.d.ts.map +1 -1
- package/dist/providers/map-client-factory.js +1 -1
- package/dist/providers/map-client-factory.js.map +1 -1
- package/dist/providers/map-connector.js +1 -1
- package/dist/providers/map-connector.js.map +1 -1
- package/dist/providers/map-event-bridge.d.ts.map +1 -1
- package/dist/providers/map-event-bridge.js +1 -0
- package/dist/providers/map-event-bridge.js.map +1 -1
- package/dist/providers/map.d.ts.map +1 -1
- package/dist/providers/map.js +5 -2
- package/dist/providers/map.js.map +1 -1
- package/dist/providers/native.d.ts.map +1 -1
- package/dist/providers/native.js +21 -8
- package/dist/providers/native.js.map +1 -1
- package/dist/providers/registry.js +1 -1
- package/dist/providers/registry.js.map +1 -1
- package/dist/providers/sudocode.d.ts.map +1 -1
- package/dist/providers/sudocode.js +5 -11
- package/dist/providers/sudocode.js.map +1 -1
- package/dist/providers/traits/Reconcilable.d.ts.map +1 -1
- package/dist/providers/traits/TaskManageable.d.ts +15 -1
- package/dist/providers/traits/TaskManageable.d.ts.map +1 -1
- package/dist/providers/traits/TaskManageable.js +26 -0
- package/dist/providers/traits/TaskManageable.js.map +1 -1
- package/dist/providers/traits/Watchable.d.ts +6 -0
- package/dist/providers/traits/Watchable.d.ts.map +1 -1
- package/dist/providers/traits/Watchable.js.map +1 -1
- package/dist/providers/types.d.ts +1 -1
- package/dist/providers/types.d.ts.map +1 -1
- package/dist/schema/edges.d.ts +5 -1
- package/dist/schema/edges.d.ts.map +1 -1
- package/dist/schema/index.d.ts +2 -2
- package/dist/schema/index.d.ts.map +1 -1
- package/dist/schema/index.js +1 -1
- package/dist/schema/index.js.map +1 -1
- package/dist/schema/nodes.d.ts +55 -2
- package/dist/schema/nodes.d.ts.map +1 -1
- package/dist/schema/storage.d.ts +2 -0
- package/dist/schema/storage.d.ts.map +1 -1
- package/dist/schema/validation.d.ts +6 -2
- package/dist/schema/validation.d.ts.map +1 -1
- package/dist/schema/validation.js +18 -1
- package/dist/schema/validation.js.map +1 -1
- package/dist/sessionlog/agent/registry.js.map +1 -1
- package/dist/sessionlog/agent/session-types.d.ts.map +1 -1
- package/dist/sessionlog/agent/types.d.ts.map +1 -1
- package/dist/sessionlog/commands/clean.js +1 -1
- package/dist/sessionlog/commands/clean.js.map +1 -1
- package/dist/sessionlog/commands/disable.d.ts.map +1 -1
- package/dist/sessionlog/commands/disable.js.map +1 -1
- package/dist/sessionlog/commands/doctor.js +1 -1
- package/dist/sessionlog/commands/doctor.js.map +1 -1
- package/dist/sessionlog/commands/enable.js +1 -1
- package/dist/sessionlog/commands/enable.js.map +1 -1
- package/dist/sessionlog/commands/resume.js +1 -1
- package/dist/sessionlog/commands/resume.js.map +1 -1
- package/dist/sessionlog/commands/rewind.d.ts.map +1 -1
- package/dist/sessionlog/commands/rewind.js +1 -1
- package/dist/sessionlog/commands/rewind.js.map +1 -1
- package/dist/sessionlog/commands/status.d.ts.map +1 -1
- package/dist/sessionlog/commands/status.js.map +1 -1
- package/dist/sessionlog/hooks/lifecycle.d.ts.map +1 -1
- package/dist/sessionlog/hooks/lifecycle.js +3 -3
- package/dist/sessionlog/hooks/lifecycle.js.map +1 -1
- package/dist/sessionlog/security/redaction.js +1 -1
- package/dist/sessionlog/security/redaction.js.map +1 -1
- package/dist/sessionlog/store/checkpoint-store.d.ts.map +1 -1
- package/dist/sessionlog/store/checkpoint-store.js +2 -2
- package/dist/sessionlog/store/checkpoint-store.js.map +1 -1
- package/dist/sessionlog/store/native-store.d.ts.map +1 -1
- package/dist/sessionlog/store/native-store.js.map +1 -1
- package/dist/sessionlog/store/session-store.d.ts.map +1 -1
- package/dist/sessionlog/store/session-store.js +1 -1
- package/dist/sessionlog/store/session-store.js.map +1 -1
- package/dist/sessionlog/strategy/attribution.js +2 -2
- package/dist/sessionlog/strategy/attribution.js.map +1 -1
- package/dist/sessionlog/strategy/common.d.ts +1 -1
- package/dist/sessionlog/strategy/common.d.ts.map +1 -1
- package/dist/sessionlog/strategy/common.js +3 -3
- package/dist/sessionlog/strategy/common.js.map +1 -1
- package/dist/sessionlog/strategy/content-overlap.d.ts.map +1 -1
- package/dist/sessionlog/strategy/content-overlap.js +1 -1
- package/dist/sessionlog/strategy/content-overlap.js.map +1 -1
- package/dist/sessionlog/strategy/manual-commit.d.ts.map +1 -1
- package/dist/sessionlog/strategy/manual-commit.js +6 -16
- package/dist/sessionlog/strategy/manual-commit.js.map +1 -1
- package/dist/sessionlog/utils/preview-rewind.d.ts.map +1 -1
- package/dist/sessionlog/utils/preview-rewind.js +1 -1
- package/dist/sessionlog/utils/preview-rewind.js.map +1 -1
- package/dist/sessionlog/utils/trailers.d.ts.map +1 -1
- package/dist/sessionlog/utils/trailers.js +0 -1
- package/dist/sessionlog/utils/trailers.js.map +1 -1
- package/dist/storage/interface.d.ts +64 -0
- package/dist/storage/interface.d.ts.map +1 -1
- package/dist/storage/interface.js.map +1 -1
- package/dist/storage/jsonl.js +2 -2
- package/dist/storage/jsonl.js.map +1 -1
- package/dist/storage/sqlite-schema.d.ts +8 -2
- package/dist/storage/sqlite-schema.d.ts.map +1 -1
- package/dist/storage/sqlite-schema.js +10 -1
- package/dist/storage/sqlite-schema.js.map +1 -1
- package/dist/storage/sqlite.d.ts +16 -1
- package/dist/storage/sqlite.d.ts.map +1 -1
- package/dist/storage/sqlite.js +134 -2
- package/dist/storage/sqlite.js.map +1 -1
- package/dist/tools/link.js +1 -1
- package/dist/tools/link.js.map +1 -1
- package/dist/tools/query.d.ts.map +1 -1
- package/dist/tools/query.js +8 -29
- package/dist/tools/query.js.map +1 -1
- package/dist/tools/task.d.ts.map +1 -1
- package/dist/tools/task.js +115 -5
- package/dist/tools/task.js.map +1 -1
- package/dist/tools/types.d.ts +84 -3
- package/dist/tools/types.d.ts.map +1 -1
- package/dist/tools/types.js.map +1 -1
- package/dist/version.d.ts +14 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +44 -0
- package/dist/version.js.map +1 -0
- package/package.json +32 -7
- package/skills/opentasks/SKILL.md +226 -0
- package/skills/opentasks/dependency-management.md +119 -0
- package/skills/opentasks/feedback-and-review.md +100 -0
- package/skills/opentasks/linking-external-data.md +103 -0
- package/skills/opentasks/spec-to-implementation.md +171 -0
|
@@ -5,6 +5,8 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import type { IPCServer } from '../ipc.js';
|
|
7
7
|
import type { DaemonStatus } from '../types.js';
|
|
8
|
+
import type { DaemonHealthSnapshot } from '../health-counters.js';
|
|
9
|
+
import type { SyncerHealth } from '../../graph/git-graph-syncer.js';
|
|
8
10
|
/**
|
|
9
11
|
* Health check response
|
|
10
12
|
*/
|
|
@@ -17,6 +19,16 @@ export interface HealthResponse {
|
|
|
17
19
|
rss: number;
|
|
18
20
|
};
|
|
19
21
|
version: string;
|
|
22
|
+
/**
|
|
23
|
+
* Counters for otherwise-silent watcher/reconcile failures + liveness
|
|
24
|
+
* timestamps (F10). Omitted if the daemon wasn't given a counters source.
|
|
25
|
+
*/
|
|
26
|
+
counters?: DaemonHealthSnapshot;
|
|
27
|
+
/**
|
|
28
|
+
* Git sync health (last error/op/success + cumulative error count), or null
|
|
29
|
+
* when git sync is disabled. Omitted if no sync-health source was provided.
|
|
30
|
+
*/
|
|
31
|
+
sync?: SyncerHealth | null;
|
|
20
32
|
}
|
|
21
33
|
/**
|
|
22
34
|
* Status getter function
|
|
@@ -46,6 +58,10 @@ export interface LifecycleMethodsOptions {
|
|
|
46
58
|
startedAt: Date;
|
|
47
59
|
/** Optional health checker for multi-location awareness */
|
|
48
60
|
checkHealth?: HealthChecker;
|
|
61
|
+
/** Optional source of watcher/reconcile failure counters (F10) */
|
|
62
|
+
getHealthCounters?: () => DaemonHealthSnapshot;
|
|
63
|
+
/** Optional source of git sync health (null when sync is disabled) (F10) */
|
|
64
|
+
getSyncHealth?: () => SyncerHealth | null;
|
|
49
65
|
}
|
|
50
66
|
/**
|
|
51
67
|
* Register lifecycle method handlers on an IPC server
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../../../src/daemon/methods/lifecycle.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../../../src/daemon/methods/lifecycle.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAClE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAMpE;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,SAAS,GAAG,UAAU,GAAG,WAAW,CAAC;IAC7C,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE;QACN,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,MAAM,CAAC;QAClB,GAAG,EAAE,MAAM,CAAC;KACb,CAAC;IACF,OAAO,EAAE,MAAM,CAAC;IAEhB;;;OAGG;IACH,QAAQ,CAAC,EAAE,oBAAoB,CAAC;IAEhC;;;OAGG;IACH,IAAI,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,MAAM,YAAY,CAAC;AAE9C;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;AAElD;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,MAAM,SAAS,GAAG,UAAU,GAAG,WAAW,CAAC;AAEvE;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,yCAAyC;IACzC,MAAM,EAAE,SAAS,CAAC;IAElB,4CAA4C;IAC5C,SAAS,EAAE,YAAY,CAAC;IAExB,mCAAmC;IACnC,QAAQ,EAAE,eAAe,CAAC;IAE1B,wBAAwB;IACxB,OAAO,EAAE,MAAM,CAAC;IAEhB,oCAAoC;IACpC,SAAS,EAAE,IAAI,CAAC;IAEhB,2DAA2D;IAC3D,WAAW,CAAC,EAAE,aAAa,CAAC;IAE5B,kEAAkE;IAClE,iBAAiB,CAAC,EAAE,MAAM,oBAAoB,CAAC;IAE/C,4EAA4E;IAC5E,aAAa,CAAC,EAAE,MAAM,YAAY,GAAG,IAAI,CAAC;CAC3C;AAMD;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,uBAAuB,GAAG,IAAI,CA0C/E"}
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
* Register lifecycle method handlers on an IPC server
|
|
11
11
|
*/
|
|
12
12
|
export function registerLifecycleMethods(options) {
|
|
13
|
-
const { server, getStatus, shutdown, version, startedAt, checkHealth } = options;
|
|
13
|
+
const { server, getStatus, shutdown, version, startedAt, checkHealth, getHealthCounters, getSyncHealth } = options;
|
|
14
14
|
// ping - Simple health check
|
|
15
15
|
server.handle('ping', async () => {
|
|
16
16
|
return { pong: true };
|
|
@@ -28,6 +28,8 @@ export function registerLifecycleMethods(options) {
|
|
|
28
28
|
rss: memory.rss,
|
|
29
29
|
},
|
|
30
30
|
version,
|
|
31
|
+
...(getHealthCounters ? { counters: getHealthCounters() } : {}),
|
|
32
|
+
...(getSyncHealth ? { sync: getSyncHealth() } : {}),
|
|
31
33
|
};
|
|
32
34
|
});
|
|
33
35
|
// status - Daemon status and stats
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../../src/daemon/methods/lifecycle.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../../src/daemon/methods/lifecycle.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAiFH,+EAA+E;AAC/E,iBAAiB;AACjB,+EAA+E;AAE/E;;GAEG;AACH,MAAM,UAAU,wBAAwB,CAAC,OAAgC;IACvE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,iBAAiB,EAAE,aAAa,EAAE,GACtG,OAAO,CAAC;IAEV,6BAA6B;IAC7B,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,IAAI,EAAE;QAC/B,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IACxB,CAAC,CAAC,CAAC;IAEH,uCAAuC;IACvC,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,IAA6B,EAAE;QAC1D,MAAM,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;QACrC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,OAAO,EAAE,CAAC;QAEhD,OAAO;YACL,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,SAAS;YAC/C,MAAM;YACN,MAAM,EAAE;gBACN,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,SAAS,EAAE,MAAM,CAAC,SAAS;gBAC3B,GAAG,EAAE,MAAM,CAAC,GAAG;aAChB;YACD,OAAO;YACP,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,iBAAiB,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/D,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACpD,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,mCAAmC;IACnC,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,IAA2B,EAAE;QACxD,OAAO,SAAS,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,+BAA+B;IAC/B,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,KAAK,IAAI,EAAE;QACnC,2CAA2C;QAC3C,YAAY,CAAC,GAAG,EAAE;YAChB,KAAK,QAAQ,EAAE,CAAC;QAClB,CAAC,CAAC,CAAC;QAEH,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"location.js","sourceRoot":"","sources":["../../../src/daemon/methods/location.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAAE,mBAAmB,
|
|
1
|
+
{"version":3,"file":"location.js","sourceRoot":"","sources":["../../../src/daemon/methods/location.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAE3D,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAsB,MAAM,wBAAwB,CAAC;AA6BlG,+EAA+E;AAC/E,iBAAiB;AACjB,+EAA+E;AAE/E;;GAEG;AACH,MAAM,UAAU,uBAAuB,CAAC,OAA+B;IACrE,MAAM,EAAE,MAAM,EAAE,gBAAgB,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC;IAE3D,6CAA6C;IAC7C,MAAM,CAAC,MAAM,CAAwC,eAAe,EAAE,KAAK,IAAI,EAAE;QAC/E,OAAO,gBAAgB,CAAC,IAAI,EAAE,CAAC;IACjC,CAAC,CAAC,CAAC;IAEH,0DAA0D;IAC1D,MAAM,CAAC,MAAM,CAAuC,mBAAmB,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;QACxF,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;YACrD,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;QACtE,CAAC;QAED,8BAA8B;QAC9B,IAAI,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;YACtC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,aAAa;QACzC,CAAC;QAED,wBAAwB;QACxB,MAAM,KAAK,GAAkB,MAAM,mBAAmB,CACpD,MAAM,CAAC,aAAa,EACpB,MAAM,CAAC,IAAI,EACX,KAAK,CACN,CAAC;QAEF,oBAAoB;QACpB,MAAM,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QAE5B,kBAAkB;QAClB,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAE5B,4CAA4C;QAC5C,IAAI,YAAY,EAAE,CAAC;YACjB,IAAI,CAAC;gBACH,MAAM,KAAK,GAAkB;oBAC3B,IAAI,EAAE,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,mBAAmB,EAAE,EAAE,CAAC;oBAC3D,aAAa,EAAE,MAAM,CAAC,aAAa;oBACnC,IAAI,EAAE,MAAM,CAAC,IAAI;oBACjB,IAAI,EAAE,QAAQ;iBACf,CAAC;gBACF,gBAAgB,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;YACxC,CAAC;YAAC,MAAM,CAAC;gBACP,yEAAyE;YAC3E,CAAC;QACH,CAAC;QAED,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC,CAAC,CAAC;IAEH,8CAA8C;IAC9C,MAAM,CAAC,MAAM,CAAyC,qBAAqB,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;QAC5F,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;QACtD,CAAC;QAED,uBAAuB;QACvB,MAAM,gBAAgB,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAE3C,6CAA6C;QAC7C,IAAI,YAAY,EAAE,CAAC;YACjB,IAAI,CAAC;gBACH,kBAAkB,CAAC,YAAY,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;YAChD,CAAC;YAAC,MAAM,CAAC;gBACP,yEAAyE;YAC3E,CAAC;QACH,CAAC;QAED,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Git Sync Method Handlers
|
|
3
|
+
*
|
|
4
|
+
* JSON-RPC method handlers for manual git sync operations + status inspection.
|
|
5
|
+
* The daemon runs auto-sync in the background when `sync.git.autoCommit` or
|
|
6
|
+
* `sync.git.autoPush` are enabled in config; these methods expose the same
|
|
7
|
+
* operations for on-demand triggers (e.g., from an external signal like a
|
|
8
|
+
* MAP `context.updated` event telling us a peer pushed changes we should pull).
|
|
9
|
+
*/
|
|
10
|
+
import type { IPCServer } from '../ipc.js';
|
|
11
|
+
import type { LocationResolver, LocationState } from '../location-state.js';
|
|
12
|
+
import type { GitGraphSyncer, SyncCycleResult, PullResult, SyncerHealth } from '../../graph/git-graph-syncer.js';
|
|
13
|
+
export interface SyncMethodsOptions {
|
|
14
|
+
/** IPC server to register handlers on */
|
|
15
|
+
server: IPCServer;
|
|
16
|
+
/** Resolver for the active syncer — returns null when no git sync is configured */
|
|
17
|
+
getSyncer(): GitGraphSyncer | null;
|
|
18
|
+
/** Static snapshot of the sync config + recent health (for sync.status) */
|
|
19
|
+
getSyncStatus(): {
|
|
20
|
+
enabled: boolean;
|
|
21
|
+
remote?: string;
|
|
22
|
+
autoCommit: boolean;
|
|
23
|
+
autoPush: boolean;
|
|
24
|
+
pullOnStartup: boolean;
|
|
25
|
+
autoSyncRunning: boolean;
|
|
26
|
+
/**
|
|
27
|
+
* Recent success/failure snapshot. Absent when git sync is disabled
|
|
28
|
+
* or the syncer hasn't been built yet; present otherwise.
|
|
29
|
+
*/
|
|
30
|
+
health?: SyncerHealth;
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* Reload the syncer from the current on-disk config. Called from `sync.reload`
|
|
34
|
+
* when an external writer (e.g., OpenHive's PATCH /resources/:id/git-sync
|
|
35
|
+
* endpoint) has rewritten `.opentasks/config.json` and we need the running
|
|
36
|
+
* daemon to pick up the new settings without a restart.
|
|
37
|
+
*
|
|
38
|
+
* Returns the new status snapshot after the swap. When `config.json` can't
|
|
39
|
+
* be read or `sync.git.enabled` is false, the syncer is torn down and
|
|
40
|
+
* subsequent `sync.now` / `sync.pull` calls return `ran: false`.
|
|
41
|
+
*/
|
|
42
|
+
reloadSyncer(): Promise<ReturnType<SyncMethodsOptions['getSyncStatus']>>;
|
|
43
|
+
/**
|
|
44
|
+
* The daemon flush manager. When present, `sync.now`/`sync.pull` drain and
|
|
45
|
+
* freeze the debounced SQLite→JSONL flush around the git op so a pending
|
|
46
|
+
* flush can't fire mid-pull and overwrite the freshly-pulled `graph.jsonl`
|
|
47
|
+
* (the F2 data-loss race). Optional — when absent, sync runs uncoordinated.
|
|
48
|
+
*/
|
|
49
|
+
flushManager?: {
|
|
50
|
+
flush(): Promise<void>;
|
|
51
|
+
pause(): void;
|
|
52
|
+
resume(): void;
|
|
53
|
+
};
|
|
54
|
+
/**
|
|
55
|
+
* Re-sync SQLite from the (possibly merged) JSONL after a pull brought
|
|
56
|
+
* changes. Called only when a pull actually changed the file.
|
|
57
|
+
*/
|
|
58
|
+
reloadStore?: () => Promise<void>;
|
|
59
|
+
}
|
|
60
|
+
export interface SyncNowResult {
|
|
61
|
+
/** Whether the syncer is available */
|
|
62
|
+
ran: boolean;
|
|
63
|
+
/** Present when ran=true */
|
|
64
|
+
result?: SyncCycleResult;
|
|
65
|
+
/** Present when ran=false */
|
|
66
|
+
reason?: string;
|
|
67
|
+
}
|
|
68
|
+
export interface SyncPullOnlyResult {
|
|
69
|
+
ran: boolean;
|
|
70
|
+
result?: PullResult;
|
|
71
|
+
reason?: string;
|
|
72
|
+
}
|
|
73
|
+
export interface SyncReloadResult {
|
|
74
|
+
/** Whether a reload was actually applied (config file read + syncer rebuilt). */
|
|
75
|
+
reloaded: boolean;
|
|
76
|
+
/** New post-reload status. Mirrors `sync.status`. */
|
|
77
|
+
status: ReturnType<SyncMethodsOptions['getSyncStatus']>;
|
|
78
|
+
/** Populated on failure (e.g., config.json missing or unreadable). */
|
|
79
|
+
error?: string;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Register sync.now / sync.pull / sync.status method handlers on an IPC server.
|
|
83
|
+
*
|
|
84
|
+
* sync.now — runs the full cycle (commitIfDirty → pull → push)
|
|
85
|
+
* sync.pull — pulls only; used when the hub signals "peer pushed, catch up"
|
|
86
|
+
* sync.status — inspection; returns the active config + autoSync state
|
|
87
|
+
*/
|
|
88
|
+
export declare function registerSyncMethods(options: SyncMethodsOptions): void;
|
|
89
|
+
/** Sync status snapshot shape (shared with single-location `getSyncStatus`). */
|
|
90
|
+
export type SyncStatusSnapshot = ReturnType<SyncMethodsOptions['getSyncStatus']>;
|
|
91
|
+
export interface MultiLocationSyncMethodsOptions {
|
|
92
|
+
/** IPC server to register handlers on */
|
|
93
|
+
server: IPCServer;
|
|
94
|
+
/** Resolves a `location` param to its LocationState */
|
|
95
|
+
locationResolver: LocationResolver;
|
|
96
|
+
/**
|
|
97
|
+
* Rebuild a location's git syncer from its on-disk config (for `sync.reload`).
|
|
98
|
+
* Mutates `state.graphSyncer` / `state.gitSyncConfig` in place. Wired by the
|
|
99
|
+
* daemon to the location-state syncer builder.
|
|
100
|
+
*/
|
|
101
|
+
reloadLocationSyncer(state: LocationState): Promise<void>;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Register location-aware sync.now / sync.pull / sync.status / sync.reload.
|
|
105
|
+
*
|
|
106
|
+
* Each handler takes an optional `location` param (the worktree hash). The git
|
|
107
|
+
* op runs through the SAME coordinated flush-freeze-reload as single-location,
|
|
108
|
+
* but resolved per location — so a debounced flush on one worktree can't clobber
|
|
109
|
+
* that worktree's freshly-pulled graph.jsonl (the F2 race), and pulls reload
|
|
110
|
+
* that location's SQLite.
|
|
111
|
+
*/
|
|
112
|
+
export declare function registerMultiLocationSyncMethods(options: MultiLocationSyncMethodsOptions): void;
|
|
113
|
+
//# sourceMappingURL=sync.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../../src/daemon/methods/sync.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC5E,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAkDjH,MAAM,WAAW,kBAAkB;IACjC,yCAAyC;IACzC,MAAM,EAAE,SAAS,CAAC;IAElB,mFAAmF;IACnF,SAAS,IAAI,cAAc,GAAG,IAAI,CAAC;IAEnC,2EAA2E;IAC3E,aAAa,IAAI;QACf,OAAO,EAAE,OAAO,CAAC;QACjB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,UAAU,EAAE,OAAO,CAAC;QACpB,QAAQ,EAAE,OAAO,CAAC;QAClB,aAAa,EAAE,OAAO,CAAC;QACvB,eAAe,EAAE,OAAO,CAAC;QACzB;;;WAGG;QACH,MAAM,CAAC,EAAE,YAAY,CAAC;KACvB,CAAC;IAEF;;;;;;;;;OASG;IACH,YAAY,IAAI,OAAO,CAAC,UAAU,CAAC,kBAAkB,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IAEzE;;;;;OAKG;IACH,YAAY,CAAC,EAAE;QAAE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;QAAC,KAAK,IAAI,IAAI,CAAC;QAAC,MAAM,IAAI,IAAI,CAAA;KAAE,CAAC;IAEzE;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,aAAa;IAC5B,sCAAsC;IACtC,GAAG,EAAE,OAAO,CAAC;IAEb,4BAA4B;IAC5B,MAAM,CAAC,EAAE,eAAe,CAAC;IAEzB,6BAA6B;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,OAAO,CAAC;IACb,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,iFAAiF;IACjF,QAAQ,EAAE,OAAO,CAAC;IAElB,qDAAqD;IACrD,MAAM,EAAE,UAAU,CAAC,kBAAkB,CAAC,eAAe,CAAC,CAAC,CAAC;IAExD,sEAAsE;IACtE,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAMD;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,kBAAkB,GAAG,IAAI,CAuDrE;AAMD,gFAAgF;AAChF,MAAM,MAAM,kBAAkB,GAAG,UAAU,CAAC,kBAAkB,CAAC,eAAe,CAAC,CAAC,CAAC;AAEjF,MAAM,WAAW,+BAA+B;IAC9C,yCAAyC;IACzC,MAAM,EAAE,SAAS,CAAC;IAElB,uDAAuD;IACvD,gBAAgB,EAAE,gBAAgB,CAAC;IAEnC;;;;OAIG;IACH,oBAAoB,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3D;AAiBD;;;;;;;;GAQG;AACH,wBAAgB,gCAAgC,CAAC,OAAO,EAAE,+BAA+B,GAAG,IAAI,CAsD/F"}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Git Sync Method Handlers
|
|
3
|
+
*
|
|
4
|
+
* JSON-RPC method handlers for manual git sync operations + status inspection.
|
|
5
|
+
* The daemon runs auto-sync in the background when `sync.git.autoCommit` or
|
|
6
|
+
* `sync.git.autoPush` are enabled in config; these methods expose the same
|
|
7
|
+
* operations for on-demand triggers (e.g., from an external signal like a
|
|
8
|
+
* MAP `context.updated` event telling us a peer pushed changes we should pull).
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Serialize a git sync/pull with the debounced SQLite→JSONL flush:
|
|
12
|
+
* drain pending flush (so local writes are in JSONL for the commit/merge)
|
|
13
|
+
* → freeze the flush (so it can't fire mid-pull and clobber the pulled file)
|
|
14
|
+
* → run the git op
|
|
15
|
+
* → reload SQLite from the merged JSONL (only when a pull changed it)
|
|
16
|
+
* → resume the flush.
|
|
17
|
+
* Without a flushManager this is a passthrough (legacy / uncoordinated behavior).
|
|
18
|
+
*/
|
|
19
|
+
async function runCoordinated(flushManager, reloadStore, run, pulledChanges) {
|
|
20
|
+
if (flushManager) {
|
|
21
|
+
await flushManager.flush();
|
|
22
|
+
flushManager.pause();
|
|
23
|
+
}
|
|
24
|
+
try {
|
|
25
|
+
const result = await run();
|
|
26
|
+
if (reloadStore && pulledChanges(result)) {
|
|
27
|
+
try {
|
|
28
|
+
await reloadStore();
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
/* best-effort: a reload hiccup shouldn't fail the sync */
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return result;
|
|
35
|
+
}
|
|
36
|
+
finally {
|
|
37
|
+
flushManager?.resume();
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
// ============================================================================
|
|
41
|
+
// Implementation
|
|
42
|
+
// ============================================================================
|
|
43
|
+
/**
|
|
44
|
+
* Register sync.now / sync.pull / sync.status method handlers on an IPC server.
|
|
45
|
+
*
|
|
46
|
+
* sync.now — runs the full cycle (commitIfDirty → pull → push)
|
|
47
|
+
* sync.pull — pulls only; used when the hub signals "peer pushed, catch up"
|
|
48
|
+
* sync.status — inspection; returns the active config + autoSync state
|
|
49
|
+
*/
|
|
50
|
+
export function registerSyncMethods(options) {
|
|
51
|
+
const { server, getSyncer, getSyncStatus, reloadSyncer, flushManager, reloadStore } = options;
|
|
52
|
+
const coordinated = (run, pulledChanges) => runCoordinated(flushManager, reloadStore, run, pulledChanges);
|
|
53
|
+
server.handle('sync.now', async () => {
|
|
54
|
+
const syncer = getSyncer();
|
|
55
|
+
if (!syncer) {
|
|
56
|
+
return { ran: false, reason: 'git sync is not enabled for this daemon' };
|
|
57
|
+
}
|
|
58
|
+
const result = await coordinated(() => syncer.sync(), (r) => r.pull.pulled && r.pull.hasChanges);
|
|
59
|
+
return { ran: true, result };
|
|
60
|
+
});
|
|
61
|
+
server.handle('sync.pull', async () => {
|
|
62
|
+
const syncer = getSyncer();
|
|
63
|
+
if (!syncer) {
|
|
64
|
+
return { ran: false, reason: 'git sync is not enabled for this daemon' };
|
|
65
|
+
}
|
|
66
|
+
// Commit any (now-flushed) local changes before pulling so the merge
|
|
67
|
+
// driver merges local + remote instead of git refusing the pull over
|
|
68
|
+
// uncommitted changes — and so un-flushed local work isn't lost on reload.
|
|
69
|
+
// This still does not push, preserving sync.pull's "pull, don't push" intent.
|
|
70
|
+
const result = await coordinated(async () => {
|
|
71
|
+
await syncer.commitIfDirty();
|
|
72
|
+
return syncer.pull();
|
|
73
|
+
}, (r) => r.pulled && r.hasChanges);
|
|
74
|
+
return { ran: true, result };
|
|
75
|
+
});
|
|
76
|
+
server.handle('sync.status', async () => {
|
|
77
|
+
return getSyncStatus();
|
|
78
|
+
});
|
|
79
|
+
server.handle('sync.reload', async () => {
|
|
80
|
+
try {
|
|
81
|
+
const status = await reloadSyncer();
|
|
82
|
+
return { reloaded: true, status };
|
|
83
|
+
}
|
|
84
|
+
catch (err) {
|
|
85
|
+
return {
|
|
86
|
+
reloaded: false,
|
|
87
|
+
status: getSyncStatus(),
|
|
88
|
+
error: err.message,
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
/** Build a sync.status snapshot for one location from its state. */
|
|
94
|
+
function locationSyncStatus(state) {
|
|
95
|
+
const cfg = state.gitSyncConfig;
|
|
96
|
+
const syncer = state.graphSyncer;
|
|
97
|
+
return {
|
|
98
|
+
enabled: cfg?.enabled ?? false,
|
|
99
|
+
remote: cfg?.remote,
|
|
100
|
+
autoCommit: cfg?.autoCommit ?? false,
|
|
101
|
+
autoPush: cfg?.autoPush ?? false,
|
|
102
|
+
pullOnStartup: cfg?.pullOnStartup ?? false,
|
|
103
|
+
autoSyncRunning: syncer?.isAutoSyncRunning() ?? false,
|
|
104
|
+
health: syncer?.getHealth(),
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Register location-aware sync.now / sync.pull / sync.status / sync.reload.
|
|
109
|
+
*
|
|
110
|
+
* Each handler takes an optional `location` param (the worktree hash). The git
|
|
111
|
+
* op runs through the SAME coordinated flush-freeze-reload as single-location,
|
|
112
|
+
* but resolved per location — so a debounced flush on one worktree can't clobber
|
|
113
|
+
* that worktree's freshly-pulled graph.jsonl (the F2 race), and pulls reload
|
|
114
|
+
* that location's SQLite.
|
|
115
|
+
*/
|
|
116
|
+
export function registerMultiLocationSyncMethods(options) {
|
|
117
|
+
const { server, locationResolver, reloadLocationSyncer } = options;
|
|
118
|
+
server.handle('sync.now', async (params) => {
|
|
119
|
+
const state = locationResolver.resolve(params?.location);
|
|
120
|
+
const syncer = state.graphSyncer;
|
|
121
|
+
if (!syncer) {
|
|
122
|
+
return { ran: false, reason: 'git sync is not enabled for this location' };
|
|
123
|
+
}
|
|
124
|
+
const result = await runCoordinated(state.flushManager, () => state.store.reload(), () => syncer.sync(), (r) => r.pull.pulled && r.pull.hasChanges);
|
|
125
|
+
return { ran: true, result };
|
|
126
|
+
});
|
|
127
|
+
server.handle('sync.pull', async (params) => {
|
|
128
|
+
const state = locationResolver.resolve(params?.location);
|
|
129
|
+
const syncer = state.graphSyncer;
|
|
130
|
+
if (!syncer) {
|
|
131
|
+
return { ran: false, reason: 'git sync is not enabled for this location' };
|
|
132
|
+
}
|
|
133
|
+
const result = await runCoordinated(state.flushManager, () => state.store.reload(), async () => {
|
|
134
|
+
await syncer.commitIfDirty();
|
|
135
|
+
return syncer.pull();
|
|
136
|
+
}, (r) => r.pulled && r.hasChanges);
|
|
137
|
+
return { ran: true, result };
|
|
138
|
+
});
|
|
139
|
+
server.handle('sync.status', async (params) => {
|
|
140
|
+
const state = locationResolver.resolve(params?.location);
|
|
141
|
+
return locationSyncStatus(state);
|
|
142
|
+
});
|
|
143
|
+
server.handle('sync.reload', async (params) => {
|
|
144
|
+
const state = locationResolver.resolve(params?.location);
|
|
145
|
+
try {
|
|
146
|
+
await reloadLocationSyncer(state);
|
|
147
|
+
return { reloaded: true, status: locationSyncStatus(state) };
|
|
148
|
+
}
|
|
149
|
+
catch (err) {
|
|
150
|
+
return {
|
|
151
|
+
reloaded: false,
|
|
152
|
+
status: locationSyncStatus(state),
|
|
153
|
+
error: err.message,
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=sync.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../../../src/daemon/methods/sync.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAgBH;;;;;;;;GAQG;AACH,KAAK,UAAU,cAAc,CAC3B,YAAmC,EACnC,WAA8C,EAC9C,GAAqB,EACrB,aAAqC;IAErC,IAAI,YAAY,EAAE,CAAC;QACjB,MAAM,YAAY,CAAC,KAAK,EAAE,CAAC;QAC3B,YAAY,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;IACD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,GAAG,EAAE,CAAC;QAC3B,IAAI,WAAW,IAAI,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC;YACzC,IAAI,CAAC;gBACH,MAAM,WAAW,EAAE,CAAC;YACtB,CAAC;YAAC,MAAM,CAAC;gBACP,0DAA0D;YAC5D,CAAC;QACH,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;YAAS,CAAC;QACT,YAAY,EAAE,MAAM,EAAE,CAAC;IACzB,CAAC;AACH,CAAC;AAmFD,+EAA+E;AAC/E,iBAAiB;AACjB,+EAA+E;AAE/E;;;;;;GAMG;AACH,MAAM,UAAU,mBAAmB,CAAC,OAA2B;IAC7D,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC;IAE9F,MAAM,WAAW,GAAG,CAClB,GAAqB,EACrB,aAAqC,EACzB,EAAE,CAAC,cAAc,CAAC,YAAY,EAAE,WAAW,EAAE,GAAG,EAAE,aAAa,CAAC,CAAC;IAE/E,MAAM,CAAC,MAAM,CAAuC,UAAU,EAAE,KAAK,IAAI,EAAE;QACzE,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAC3B,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,yCAAyC,EAAE,CAAC;QAC3E,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,WAAW,CAC9B,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,EACnB,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAC1C,CAAC;QACF,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,MAAM,CAA4C,WAAW,EAAE,KAAK,IAAI,EAAE;QAC/E,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAC3B,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,yCAAyC,EAAE,CAAC;QAC3E,CAAC;QACD,qEAAqE;QACrE,qEAAqE;QACrE,2EAA2E;QAC3E,8EAA8E;QAC9E,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,KAAK,IAAI,EAAE;YAC1C,MAAM,MAAM,CAAC,aAAa,EAAE,CAAC;YAC7B,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC;QACvB,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,UAAU,CAAC,CAAC;QACpC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,MAAM,CACX,aAAa,EACb,KAAK,IAAI,EAAE;QACT,OAAO,aAAa,EAAE,CAAC;IACzB,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,MAAM,CAA0C,aAAa,EAAE,KAAK,IAAI,EAAE;QAC/E,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,YAAY,EAAE,CAAC;YACpC,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QACpC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO;gBACL,QAAQ,EAAE,KAAK;gBACf,MAAM,EAAE,aAAa,EAAE;gBACvB,KAAK,EAAG,GAAa,CAAC,OAAO;aAC9B,CAAC;QACJ,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAwBD,oEAAoE;AACpE,SAAS,kBAAkB,CAAC,KAAoB;IAC9C,MAAM,GAAG,GAAG,KAAK,CAAC,aAAa,CAAC;IAChC,MAAM,MAAM,GAAG,KAAK,CAAC,WAAW,CAAC;IACjC,OAAO;QACL,OAAO,EAAE,GAAG,EAAE,OAAO,IAAI,KAAK;QAC9B,MAAM,EAAE,GAAG,EAAE,MAAM;QACnB,UAAU,EAAE,GAAG,EAAE,UAAU,IAAI,KAAK;QACpC,QAAQ,EAAE,GAAG,EAAE,QAAQ,IAAI,KAAK;QAChC,aAAa,EAAE,GAAG,EAAE,aAAa,IAAI,KAAK;QAC1C,eAAe,EAAE,MAAM,EAAE,iBAAiB,EAAE,IAAI,KAAK;QACrD,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE;KAC5B,CAAC;AACJ,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,gCAAgC,CAAC,OAAwC;IACvF,MAAM,EAAE,MAAM,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,GAAG,OAAO,CAAC;IAEnE,MAAM,CAAC,MAAM,CAAuC,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;QAC/E,MAAM,KAAK,GAAG,gBAAgB,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QACzD,MAAM,MAAM,GAAG,KAAK,CAAC,WAAW,CAAC;QACjC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,2CAA2C,EAAE,CAAC;QAC7E,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,cAAc,CACjC,KAAK,CAAC,YAAY,EAClB,GAAG,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,EAC1B,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,EACnB,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAC1C,CAAC;QACF,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,MAAM,CAA4C,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;QACrF,MAAM,KAAK,GAAG,gBAAgB,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QACzD,MAAM,MAAM,GAAG,KAAK,CAAC,WAAW,CAAC;QACjC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,2CAA2C,EAAE,CAAC;QAC7E,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,cAAc,CACjC,KAAK,CAAC,YAAY,EAClB,GAAG,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,EAC1B,KAAK,IAAI,EAAE;YACT,MAAM,MAAM,CAAC,aAAa,EAAE,CAAC;YAC7B,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC;QACvB,CAAC,EACD,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,UAAU,CAChC,CAAC;QACF,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,MAAM,CAA4C,aAAa,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;QACvF,MAAM,KAAK,GAAG,gBAAgB,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QACzD,OAAO,kBAAkB,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,MAAM,CAA0C,aAAa,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;QACrF,MAAM,KAAK,GAAG,gBAAgB,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QACzD,IAAI,CAAC;YACH,MAAM,oBAAoB,CAAC,KAAK,CAAC,CAAC;YAClC,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC;QAC/D,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO;gBACL,QAAQ,EAAE,KAAK;gBACf,MAAM,EAAE,kBAAkB,CAAC,KAAK,CAAC;gBACjC,KAAK,EAAG,GAAa,CAAC,OAAO;aAC9B,CAAC;QACJ,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../../src/daemon/methods/tools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAe7D,OAAO,KAAK,EAAE,oBAAoB,EAAqB,MAAM,iCAAiC,CAAC;AAM/F;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,yCAAyC;IACzC,MAAM,EAAE,SAAS,CAAC;IAElB,qDAAqD;IACrD,gBAAgB,EAAE,gBAAgB,CAAC;IAEnC,mFAAmF;IACnF,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;CAC7C;AAmBD;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,mBAAmB,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../../src/daemon/methods/tools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAe7D,OAAO,KAAK,EAAE,oBAAoB,EAAqB,MAAM,iCAAiC,CAAC;AAM/F;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,yCAAyC;IACzC,MAAM,EAAE,SAAS,CAAC;IAElB,qDAAqD;IACrD,gBAAgB,EAAE,gBAAgB,CAAC;IAEnC,mFAAmF;IACnF,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;CAC7C;AAmBD;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,mBAAmB,GAAG,IAAI,CAwLvE"}
|
|
@@ -18,7 +18,7 @@ import { task } from '../../tools/task.js';
|
|
|
18
18
|
/**
|
|
19
19
|
* Check if an ID is a local node ID (not a provider URI)
|
|
20
20
|
*/
|
|
21
|
-
const LOCAL_ID_PATTERN = /^[
|
|
21
|
+
const LOCAL_ID_PATTERN = /^[ctfexa]-[a-z0-9]+$/;
|
|
22
22
|
function isLocalId(id) {
|
|
23
23
|
return LOCAL_ID_PATTERN.test(id);
|
|
24
24
|
}
|
|
@@ -99,15 +99,49 @@ export function registerToolsMethods(options) {
|
|
|
99
99
|
return { success: false, error: 'Provider store not available' };
|
|
100
100
|
}
|
|
101
101
|
const result = await task(state.providerStore, taskParams);
|
|
102
|
-
//
|
|
102
|
+
// Persist mutations with two durability tiers. Coordination-critical
|
|
103
|
+
// writes — claims/leases and terminal transitions — flush to JSONL
|
|
104
|
+
// *before* the RPC returns so a crash can't lose a claim or a terminal
|
|
105
|
+
// outcome. Ordinary edits (assign, non-terminal transitions) keep the
|
|
106
|
+
// debounced flush.
|
|
103
107
|
if (result.success && result.data) {
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
108
|
+
const d = result.data;
|
|
109
|
+
let dirtyId;
|
|
110
|
+
let durable = false;
|
|
111
|
+
if (d.type === 'transition' && isLocalId(d.node.id)) {
|
|
112
|
+
dirtyId = d.node.id;
|
|
113
|
+
durable =
|
|
114
|
+
d.action === 'complete' ||
|
|
115
|
+
d.action === 'close' ||
|
|
116
|
+
d.action === 'fail' ||
|
|
117
|
+
d.action === 'abandon';
|
|
107
118
|
}
|
|
108
|
-
if (
|
|
109
|
-
|
|
110
|
-
|
|
119
|
+
else if (d.type === 'assign' && isLocalId(d.node.id)) {
|
|
120
|
+
dirtyId = d.node.id;
|
|
121
|
+
}
|
|
122
|
+
else if (
|
|
123
|
+
// Coordination mutations carry a nodeId when they touched a task.
|
|
124
|
+
// claimNext with nothing to claim has no nodeId and is skipped.
|
|
125
|
+
(d.type === 'claim' ||
|
|
126
|
+
d.type === 'renew' ||
|
|
127
|
+
d.type === 'claimNext' ||
|
|
128
|
+
d.type === 'release') &&
|
|
129
|
+
d.nodeId &&
|
|
130
|
+
isLocalId(d.nodeId)) {
|
|
131
|
+
dirtyId = d.nodeId;
|
|
132
|
+
durable = true; // claims/leases are coordination-critical
|
|
133
|
+
}
|
|
134
|
+
if (dirtyId) {
|
|
135
|
+
state.flushManager.markDirty(dirtyId);
|
|
136
|
+
if (durable) {
|
|
137
|
+
// Durable tier: persist before returning. flush() is a no-op while
|
|
138
|
+
// a git sync has the flush paused — the node stays dirty and is
|
|
139
|
+
// flushed when sync resumes.
|
|
140
|
+
await state.flushManager.flush();
|
|
141
|
+
}
|
|
142
|
+
else {
|
|
143
|
+
state.flushManager.schedule();
|
|
144
|
+
}
|
|
111
145
|
}
|
|
112
146
|
}
|
|
113
147
|
return result;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../../src/daemon/methods/tools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAcH,OAAO,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAC3C,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAqB3C,+EAA+E;AAC/E,mBAAmB;AACnB,+EAA+E;AAE/E;;GAEG;AACH,MAAM,gBAAgB,GAAG,
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../../src/daemon/methods/tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,11 +10,35 @@
|
|
|
10
10
|
*/
|
|
11
11
|
import type { IPCServer } from '../ipc.js';
|
|
12
12
|
import type { LocationResolver } from '../location-state.js';
|
|
13
|
+
import type { EventManager } from '../events.js';
|
|
13
14
|
export interface WatchMethodsOptions {
|
|
14
15
|
/** IPC server to register handlers on */
|
|
15
16
|
server: IPCServer;
|
|
16
17
|
/** Location resolver for routing to correct store */
|
|
17
18
|
locationResolver: LocationResolver;
|
|
19
|
+
/**
|
|
20
|
+
* Optional event manager. When present, each broadcast `watch.event` is
|
|
21
|
+
* stamped with a monotonic `seq` + per-process `epoch` and buffered for
|
|
22
|
+
* replay (P3 M2), so a reconnecting subscriber can backfill via `events.since`.
|
|
23
|
+
* Without it, events broadcast unstamped (the M1 fire-and-forget behavior).
|
|
24
|
+
*/
|
|
25
|
+
eventManager?: EventManager;
|
|
26
|
+
/**
|
|
27
|
+
* Optional callback invoked when a diff cycle throws and is swallowed, so the
|
|
28
|
+
* daemon can surface otherwise-silent watcher failures via `health` (F10).
|
|
29
|
+
*/
|
|
30
|
+
onWatcherError?: () => void;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Subscription filter (coarse). Omitted → the subscriber receives all events.
|
|
34
|
+
* `types` matches the provider node type carried on the event (tasks are emitted
|
|
35
|
+
* as `'issue'`, contexts as `'spec'`); `statuses` matches `node.status`;
|
|
36
|
+
* `locations` matches the originating worktree's location hash (multi-location).
|
|
37
|
+
*/
|
|
38
|
+
export interface WatchFilter {
|
|
39
|
+
types?: string[];
|
|
40
|
+
statuses?: string[];
|
|
41
|
+
locations?: string[];
|
|
18
42
|
}
|
|
19
43
|
/**
|
|
20
44
|
* Register watch subscription method handlers on an IPC server
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"watch.d.ts","sourceRoot":"","sources":["../../../src/daemon/methods/watch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,KAAK,EAAE,gBAAgB,
|
|
1
|
+
{"version":3,"file":"watch.d.ts","sourceRoot":"","sources":["../../../src/daemon/methods/watch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,KAAK,EAAE,gBAAgB,EAAiB,MAAM,sBAAsB,CAAC;AAG5E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAMjD,MAAM,WAAW,mBAAmB;IAClC,yCAAyC;IACzC,MAAM,EAAE,SAAS,CAAC;IAElB,qDAAqD;IACrD,gBAAgB,EAAE,gBAAgB,CAAC;IAEnC;;;;;OAKG;IACH,YAAY,CAAC,EAAE,YAAY,CAAC;IAE5B;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,IAAI,CAAC;CAC7B;AAED;;;;;GAKG;AACH,MAAM,WAAW,WAAW;IAC1B,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAgID;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,mBAAmB,GAAG,IAAI,CAuMvE"}
|