opentasks 0.1.3 → 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 +174 -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/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 +145 -9
- 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 +48 -2
- package/dist/daemon/methods/sync.d.ts.map +1 -1
- package/dist/daemon/methods/sync.js +106 -3
- package/dist/daemon/methods/sync.js.map +1 -1
- 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/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 +95 -28
- 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 +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- 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
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Event Method Handlers (P3 M2)
|
|
3
|
+
*
|
|
4
|
+
* JSON-RPC methods for the replayable event stream. A subscriber that
|
|
5
|
+
* reconnects (or starts with a saved cursor) calls `events.since(cursor)` to
|
|
6
|
+
* backfill the change events it missed within the buffer window; `events.current`
|
|
7
|
+
* returns the head cursor so a fresh subscriber can establish a baseline without
|
|
8
|
+
* waiting for the first event.
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Register event-stream method handlers on an IPC server.
|
|
12
|
+
*/
|
|
13
|
+
export function registerEventMethods(options) {
|
|
14
|
+
const { server, eventManager } = options;
|
|
15
|
+
// events.since - replay events after a cursor, or signal resync
|
|
16
|
+
server.handle('events.since', async (params) => {
|
|
17
|
+
const cursor = params?.cursor;
|
|
18
|
+
// A missing/garbage cursor can't be served as a delta — force a resync so
|
|
19
|
+
// the caller re-queries rather than silently receiving nothing.
|
|
20
|
+
if (!cursor || typeof cursor.seq !== 'number' || typeof cursor.epoch !== 'string') {
|
|
21
|
+
return { epoch: eventManager.epoch, resync: true };
|
|
22
|
+
}
|
|
23
|
+
return eventManager.since(cursor);
|
|
24
|
+
});
|
|
25
|
+
// events.current - head cursor (epoch + latest seq)
|
|
26
|
+
server.handle('events.current', async () => {
|
|
27
|
+
return eventManager.current();
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=events.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.js","sourceRoot":"","sources":["../../../src/daemon/methods/events.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAaH;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAA4B;IAC/D,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC;IAEzC,gEAAgE;IAChE,MAAM,CAAC,MAAM,CAAuC,cAAc,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;QACnF,MAAM,MAAM,GAAG,MAAM,EAAE,MAAM,CAAC;QAC9B,0EAA0E;QAC1E,gEAAgE;QAChE,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,CAAC,GAAG,KAAK,QAAQ,IAAI,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YAClF,OAAO,EAAE,KAAK,EAAE,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;QACrD,CAAC;QACD,OAAO,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,oDAAoD;IACpD,MAAM,CAAC,MAAM,CAAyB,gBAAgB,EAAE,KAAK,IAAI,EAAE;QACjE,OAAO,YAAY,CAAC,OAAO,EAAE,CAAC;IAChC,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
*/
|
|
11
11
|
import type { IPCServer } from '../ipc.js';
|
|
12
12
|
import type { LocationResolver } from '../location-state.js';
|
|
13
|
+
import type { IdempotencyStore } from '../idempotency.js';
|
|
13
14
|
/**
|
|
14
15
|
* Options for registering graph methods
|
|
15
16
|
*/
|
|
@@ -18,6 +19,12 @@ export interface GraphMethodsOptions {
|
|
|
18
19
|
server: IPCServer;
|
|
19
20
|
/** Location resolver for routing to correct store */
|
|
20
21
|
locationResolver: LocationResolver;
|
|
22
|
+
/**
|
|
23
|
+
* Optional idempotency store (P3 M3 / F9). When present, a `graph.create`
|
|
24
|
+
* carrying an `idempotency_key` is deduped within the store's TTL window so a
|
|
25
|
+
* retried create returns the original node instead of a duplicate.
|
|
26
|
+
*/
|
|
27
|
+
idempotencyStore?: IdempotencyStore;
|
|
21
28
|
}
|
|
22
29
|
/**
|
|
23
30
|
* Register graph method handlers on an IPC server
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"graph.d.ts","sourceRoot":"","sources":["../../../src/daemon/methods/graph.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"graph.d.ts","sourceRoot":"","sources":["../../../src/daemon/methods/graph.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAe1D;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,yCAAyC;IACzC,MAAM,EAAE,SAAS,CAAC;IAElB,qDAAqD;IACrD,gBAAgB,EAAE,gBAAgB,CAAC;IAEnC;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;CACrC;AA0DD;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,mBAAmB,GAAG,IAAI,CA6LvE"}
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
* Register graph method handlers on an IPC server
|
|
16
16
|
*/
|
|
17
17
|
export function registerGraphMethods(options) {
|
|
18
|
-
const { server, locationResolver } = options;
|
|
18
|
+
const { server, locationResolver, idempotencyStore } = options;
|
|
19
19
|
// graph.query - Query nodes
|
|
20
20
|
server.handle('graph.query', async (params) => {
|
|
21
21
|
const { type, filter = {}, limit, offset, location } = params || {};
|
|
@@ -49,22 +49,32 @@ export function registerGraphMethods(options) {
|
|
|
49
49
|
if (!params) {
|
|
50
50
|
throw new Error('Missing required parameters');
|
|
51
51
|
}
|
|
52
|
-
const { location, scheme, ...createParams } = params;
|
|
52
|
+
const { location, scheme, idempotency_key, ...createParams } = params;
|
|
53
53
|
const state = locationResolver.resolve(location);
|
|
54
|
-
//
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
54
|
+
// Create a node (provider-aware when available), mark dirty + schedule flush.
|
|
55
|
+
const doCreate = async () => {
|
|
56
|
+
if (state.providerStore) {
|
|
57
|
+
const result = await state.providerStore.providerCreate(createParams, { scheme });
|
|
58
|
+
state.flushManager.markDirty(result.node.id);
|
|
59
|
+
state.flushManager.schedule();
|
|
60
|
+
return result.node;
|
|
61
|
+
}
|
|
62
|
+
const node = await state.store.createNode(createParams);
|
|
63
|
+
state.flushManager.markDirty(node.id);
|
|
59
64
|
state.flushManager.schedule();
|
|
60
|
-
return
|
|
65
|
+
return node;
|
|
66
|
+
};
|
|
67
|
+
// Idempotent retry (F9): dedupe BOTH sequential retries (TTL window) and
|
|
68
|
+
// concurrent in-flight retries with the same key. `run` reserves the key
|
|
69
|
+
// before the create, closing the get→create race; if the mapped node was
|
|
70
|
+
// deleted since (or a concurrent creator failed), it recreates.
|
|
71
|
+
if (idempotency_key && idempotencyStore) {
|
|
72
|
+
const fetchNode = (id) => (state.providerStore
|
|
73
|
+
? state.providerStore.providerGet(id)
|
|
74
|
+
: state.store.getNode(id));
|
|
75
|
+
return idempotencyStore.run(idempotency_key, doCreate, fetchNode);
|
|
61
76
|
}
|
|
62
|
-
|
|
63
|
-
const node = await state.store.createNode(createParams);
|
|
64
|
-
// Mark dirty and schedule flush
|
|
65
|
-
state.flushManager.markDirty(node.id);
|
|
66
|
-
state.flushManager.schedule();
|
|
67
|
-
return node;
|
|
77
|
+
return doCreate();
|
|
68
78
|
});
|
|
69
79
|
// graph.update - Update node (with provider routing for external nodes)
|
|
70
80
|
server.handle('graph.update', async (params) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"graph.js","sourceRoot":"","sources":["../../../src/daemon/methods/graph.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;
|
|
1
|
+
{"version":3,"file":"graph.js","sourceRoot":"","sources":["../../../src/daemon/methods/graph.ts"],"names":[],"mappings":"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"}
|
|
@@ -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"}
|
|
@@ -8,13 +8,14 @@
|
|
|
8
8
|
* MAP `context.updated` event telling us a peer pushed changes we should pull).
|
|
9
9
|
*/
|
|
10
10
|
import type { IPCServer } from '../ipc.js';
|
|
11
|
-
import type {
|
|
11
|
+
import type { LocationResolver, LocationState } from '../location-state.js';
|
|
12
|
+
import type { GitGraphSyncer, SyncCycleResult, PullResult, SyncerHealth } from '../../graph/git-graph-syncer.js';
|
|
12
13
|
export interface SyncMethodsOptions {
|
|
13
14
|
/** IPC server to register handlers on */
|
|
14
15
|
server: IPCServer;
|
|
15
16
|
/** Resolver for the active syncer — returns null when no git sync is configured */
|
|
16
17
|
getSyncer(): GitGraphSyncer | null;
|
|
17
|
-
/** Static snapshot of the sync config (for sync.status) */
|
|
18
|
+
/** Static snapshot of the sync config + recent health (for sync.status) */
|
|
18
19
|
getSyncStatus(): {
|
|
19
20
|
enabled: boolean;
|
|
20
21
|
remote?: string;
|
|
@@ -22,6 +23,11 @@ export interface SyncMethodsOptions {
|
|
|
22
23
|
autoPush: boolean;
|
|
23
24
|
pullOnStartup: boolean;
|
|
24
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;
|
|
25
31
|
};
|
|
26
32
|
/**
|
|
27
33
|
* Reload the syncer from the current on-disk config. Called from `sync.reload`
|
|
@@ -34,6 +40,22 @@ export interface SyncMethodsOptions {
|
|
|
34
40
|
* subsequent `sync.now` / `sync.pull` calls return `ran: false`.
|
|
35
41
|
*/
|
|
36
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>;
|
|
37
59
|
}
|
|
38
60
|
export interface SyncNowResult {
|
|
39
61
|
/** Whether the syncer is available */
|
|
@@ -64,4 +86,28 @@ export interface SyncReloadResult {
|
|
|
64
86
|
* sync.status — inspection; returns the active config + autoSync state
|
|
65
87
|
*/
|
|
66
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;
|
|
67
113
|
//# sourceMappingURL=sync.d.ts.map
|
|
@@ -1 +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,cAAc,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;
|
|
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"}
|
|
@@ -7,6 +7,36 @@
|
|
|
7
7
|
* operations for on-demand triggers (e.g., from an external signal like a
|
|
8
8
|
* MAP `context.updated` event telling us a peer pushed changes we should pull).
|
|
9
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
|
+
}
|
|
10
40
|
// ============================================================================
|
|
11
41
|
// Implementation
|
|
12
42
|
// ============================================================================
|
|
@@ -18,13 +48,14 @@
|
|
|
18
48
|
* sync.status — inspection; returns the active config + autoSync state
|
|
19
49
|
*/
|
|
20
50
|
export function registerSyncMethods(options) {
|
|
21
|
-
const { server, getSyncer, getSyncStatus, reloadSyncer } = options;
|
|
51
|
+
const { server, getSyncer, getSyncStatus, reloadSyncer, flushManager, reloadStore } = options;
|
|
52
|
+
const coordinated = (run, pulledChanges) => runCoordinated(flushManager, reloadStore, run, pulledChanges);
|
|
22
53
|
server.handle('sync.now', async () => {
|
|
23
54
|
const syncer = getSyncer();
|
|
24
55
|
if (!syncer) {
|
|
25
56
|
return { ran: false, reason: 'git sync is not enabled for this daemon' };
|
|
26
57
|
}
|
|
27
|
-
const result = await syncer.sync();
|
|
58
|
+
const result = await coordinated(() => syncer.sync(), (r) => r.pull.pulled && r.pull.hasChanges);
|
|
28
59
|
return { ran: true, result };
|
|
29
60
|
});
|
|
30
61
|
server.handle('sync.pull', async () => {
|
|
@@ -32,7 +63,14 @@ export function registerSyncMethods(options) {
|
|
|
32
63
|
if (!syncer) {
|
|
33
64
|
return { ran: false, reason: 'git sync is not enabled for this daemon' };
|
|
34
65
|
}
|
|
35
|
-
|
|
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);
|
|
36
74
|
return { ran: true, result };
|
|
37
75
|
});
|
|
38
76
|
server.handle('sync.status', async () => {
|
|
@@ -52,4 +90,69 @@ export function registerSyncMethods(options) {
|
|
|
52
90
|
}
|
|
53
91
|
});
|
|
54
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
|
+
}
|
|
55
158
|
//# sourceMappingURL=sync.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../../../src/daemon/methods/sync.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;
|
|
1
|
+
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../../../src/daemon/methods/sync.ts"],"names":[],"mappings":"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"}
|
|
@@ -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"}
|