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,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Attempt/verify query helpers (step 3 of docs/ATTEMPT-VERIFY-SCHEMA.md §6).
|
|
3
|
+
*
|
|
4
|
+
* Pure predicates over already-fetched nodes + edges. The MCP `list_attempts`
|
|
5
|
+
* tool composes these over `client.query()` results, so no daemon RPC method is
|
|
6
|
+
* needed. They encode the safety properties as queries:
|
|
7
|
+
* - "what is everyone doing now" = in-progress attempts (Expectation fix)
|
|
8
|
+
* - "unevidenced completions" = success attempts that aren't checkable (Commitment fix)
|
|
9
|
+
* - "completable" = a task has a checkable success attempt
|
|
10
|
+
*/
|
|
11
|
+
import type { AttemptMetadata, EvidenceRef } from '../schema/index.js';
|
|
12
|
+
/** Minimal node shape these helpers read (works on Node and StoredNode). */
|
|
13
|
+
export interface AttemptLike {
|
|
14
|
+
id: string;
|
|
15
|
+
type: string;
|
|
16
|
+
status?: string;
|
|
17
|
+
target_id?: string;
|
|
18
|
+
assignee?: string;
|
|
19
|
+
metadata?: Record<string, unknown>;
|
|
20
|
+
}
|
|
21
|
+
/** Minimal edge shape (works on Edge / StoredEdge / ProviderEdge). */
|
|
22
|
+
export interface EdgeLike {
|
|
23
|
+
from_id: string;
|
|
24
|
+
to_id: string;
|
|
25
|
+
type: string;
|
|
26
|
+
metadata?: Record<string, unknown>;
|
|
27
|
+
}
|
|
28
|
+
/** Read the `metadata.attempt` convention off an attempt node. */
|
|
29
|
+
export declare function attemptMeta(node: AttemptLike): AttemptMetadata | undefined;
|
|
30
|
+
/** The recorded outcome, if any. */
|
|
31
|
+
export declare function attemptOutcome(node: AttemptLike): AttemptMetadata['outcome'] | undefined;
|
|
32
|
+
/** Actively-in-progress attempts — "what is everyone doing right now". */
|
|
33
|
+
export declare function isInProgress(node: AttemptLike): boolean;
|
|
34
|
+
/** Evidence is checkable when it points somewhere a partner can verify. */
|
|
35
|
+
export declare function isCheckableEvidence(evidence: EvidenceRef | undefined): boolean;
|
|
36
|
+
/** Does any incoming `verifies` edge to this attempt carry verdict=pass? */
|
|
37
|
+
export declare function hasPassingVerification(attemptId: string, edges: EdgeLike[]): boolean;
|
|
38
|
+
/**
|
|
39
|
+
* A checkable success: a successful attempt that a partner can actually verify —
|
|
40
|
+
* either it carries its own checkable evidence, or an independent `verifies/pass`
|
|
41
|
+
* edge points at it. This is the predicate behind "completable".
|
|
42
|
+
*/
|
|
43
|
+
export declare function isCheckableSuccess(node: AttemptLike, edges?: EdgeLike[]): boolean;
|
|
44
|
+
/**
|
|
45
|
+
* Unevidenced completion = a `success` attempt that is NOT checkable (no
|
|
46
|
+
* evidence of its own and no passing verification). The Commitment-failure
|
|
47
|
+
* safety query: completions that nobody can check.
|
|
48
|
+
*/
|
|
49
|
+
export declare function isUnevidencedCompletion(node: AttemptLike, edges?: EdgeLike[]): boolean;
|
|
50
|
+
//# sourceMappingURL=attempts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attempts.d.ts","sourceRoot":"","sources":["../../src/graph/attempts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEvE,4EAA4E;AAC5E,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,sEAAsE;AACtE,MAAM,WAAW,QAAQ;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,kEAAkE;AAClE,wBAAgB,WAAW,CAAC,IAAI,EAAE,WAAW,GAAG,eAAe,GAAG,SAAS,CAE1E;AAED,oCAAoC;AACpC,wBAAgB,cAAc,CAAC,IAAI,EAAE,WAAW,GAAG,eAAe,CAAC,SAAS,CAAC,GAAG,SAAS,CAExF;AAED,0EAA0E;AAC1E,wBAAgB,YAAY,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAEvD;AAED,2EAA2E;AAC3E,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,WAAW,GAAG,SAAS,GAAG,OAAO,CAE9E;AAED,4EAA4E;AAC5E,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,OAAO,CAOpF;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,GAAE,QAAQ,EAAO,GAAG,OAAO,CAGrF;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,GAAE,QAAQ,EAAO,GAAG,OAAO,CAE1F"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Attempt/verify query helpers (step 3 of docs/ATTEMPT-VERIFY-SCHEMA.md §6).
|
|
3
|
+
*
|
|
4
|
+
* Pure predicates over already-fetched nodes + edges. The MCP `list_attempts`
|
|
5
|
+
* tool composes these over `client.query()` results, so no daemon RPC method is
|
|
6
|
+
* needed. They encode the safety properties as queries:
|
|
7
|
+
* - "what is everyone doing now" = in-progress attempts (Expectation fix)
|
|
8
|
+
* - "unevidenced completions" = success attempts that aren't checkable (Commitment fix)
|
|
9
|
+
* - "completable" = a task has a checkable success attempt
|
|
10
|
+
*/
|
|
11
|
+
/** Read the `metadata.attempt` convention off an attempt node. */
|
|
12
|
+
export function attemptMeta(node) {
|
|
13
|
+
return node.metadata?.attempt;
|
|
14
|
+
}
|
|
15
|
+
/** The recorded outcome, if any. */
|
|
16
|
+
export function attemptOutcome(node) {
|
|
17
|
+
return attemptMeta(node)?.outcome;
|
|
18
|
+
}
|
|
19
|
+
/** Actively-in-progress attempts — "what is everyone doing right now". */
|
|
20
|
+
export function isInProgress(node) {
|
|
21
|
+
return node.type === 'attempt' && node.status === 'in_progress';
|
|
22
|
+
}
|
|
23
|
+
/** Evidence is checkable when it points somewhere a partner can verify. */
|
|
24
|
+
export function isCheckableEvidence(evidence) {
|
|
25
|
+
return !!evidence && typeof evidence.ref === 'string' && evidence.ref.length > 0;
|
|
26
|
+
}
|
|
27
|
+
/** Does any incoming `verifies` edge to this attempt carry verdict=pass? */
|
|
28
|
+
export function hasPassingVerification(attemptId, edges) {
|
|
29
|
+
return edges.some((e) => e.type === 'verifies' &&
|
|
30
|
+
e.to_id === attemptId &&
|
|
31
|
+
e.metadata?.verdict === 'pass');
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* A checkable success: a successful attempt that a partner can actually verify —
|
|
35
|
+
* either it carries its own checkable evidence, or an independent `verifies/pass`
|
|
36
|
+
* edge points at it. This is the predicate behind "completable".
|
|
37
|
+
*/
|
|
38
|
+
export function isCheckableSuccess(node, edges = []) {
|
|
39
|
+
if (attemptOutcome(node) !== 'success')
|
|
40
|
+
return false;
|
|
41
|
+
return isCheckableEvidence(attemptMeta(node)?.evidence) || hasPassingVerification(node.id, edges);
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Unevidenced completion = a `success` attempt that is NOT checkable (no
|
|
45
|
+
* evidence of its own and no passing verification). The Commitment-failure
|
|
46
|
+
* safety query: completions that nobody can check.
|
|
47
|
+
*/
|
|
48
|
+
export function isUnevidencedCompletion(node, edges = []) {
|
|
49
|
+
return attemptOutcome(node) === 'success' && !isCheckableSuccess(node, edges);
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=attempts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attempts.js","sourceRoot":"","sources":["../../src/graph/attempts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAsBH,kEAAkE;AAClE,MAAM,UAAU,WAAW,CAAC,IAAiB;IAC3C,OAAO,IAAI,CAAC,QAAQ,EAAE,OAAsC,CAAC;AAC/D,CAAC;AAED,oCAAoC;AACpC,MAAM,UAAU,cAAc,CAAC,IAAiB;IAC9C,OAAO,WAAW,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;AACpC,CAAC;AAED,0EAA0E;AAC1E,MAAM,UAAU,YAAY,CAAC,IAAiB;IAC5C,OAAO,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,KAAK,aAAa,CAAC;AAClE,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,mBAAmB,CAAC,QAAiC;IACnE,OAAO,CAAC,CAAC,QAAQ,IAAI,OAAO,QAAQ,CAAC,GAAG,KAAK,QAAQ,IAAI,QAAQ,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;AACnF,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,sBAAsB,CAAC,SAAiB,EAAE,KAAiB;IACzE,OAAO,KAAK,CAAC,IAAI,CACf,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,IAAI,KAAK,UAAU;QACrB,CAAC,CAAC,KAAK,KAAK,SAAS;QACpB,CAAC,CAAC,QAAQ,EAAE,OAA8B,KAAK,MAAM,CACzD,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAiB,EAAE,QAAoB,EAAE;IAC1E,IAAI,cAAc,CAAC,IAAI,CAAC,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IACrD,OAAO,mBAAmB,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,IAAI,sBAAsB,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;AACpG,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,uBAAuB,CAAC,IAAiB,EAAE,QAAoB,EAAE;IAC/E,OAAO,cAAc,CAAC,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,kBAAkB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AAChF,CAAC"}
|
|
@@ -87,6 +87,8 @@ export interface ClaimInfo {
|
|
|
87
87
|
claimedAt: string;
|
|
88
88
|
/** When the claim expires (soft lock) */
|
|
89
89
|
lockUntil: string;
|
|
90
|
+
/** Fence token for this claim — monotonic per node; guards stale release/renew */
|
|
91
|
+
fence?: number;
|
|
90
92
|
/** Whether the claim is still valid */
|
|
91
93
|
isValid: boolean;
|
|
92
94
|
/** Whether the claim has expired */
|
|
@@ -138,7 +140,7 @@ export interface ClaimManager {
|
|
|
138
140
|
* @param agentId - Agent releasing (must match claim holder)
|
|
139
141
|
* @returns Whether release was successful
|
|
140
142
|
*/
|
|
141
|
-
release(nodeId: string, agentId: string): Promise<boolean>;
|
|
143
|
+
release(nodeId: string, agentId: string, fence?: number): Promise<boolean>;
|
|
142
144
|
/**
|
|
143
145
|
* Renew/extend a claim
|
|
144
146
|
*
|
|
@@ -147,7 +149,7 @@ export interface ClaimManager {
|
|
|
147
149
|
* @param durationMs - New duration from now
|
|
148
150
|
* @returns Updated claim result
|
|
149
151
|
*/
|
|
150
|
-
renew(nodeId: string, agentId: string, durationMs?: number): Promise<ClaimResult>;
|
|
152
|
+
renew(nodeId: string, agentId: string, durationMs?: number, fence?: number): Promise<ClaimResult>;
|
|
151
153
|
/**
|
|
152
154
|
* Get claim information for a node
|
|
153
155
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"coordination.d.ts","sourceRoot":"","sources":["../../src/graph/coordination.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"coordination.d.ts","sourceRoot":"","sources":["../../src/graph/coordination.ts"],"names":[],"mappings":"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"}
|
|
@@ -24,11 +24,44 @@ function nodeToClaimInfo(node) {
|
|
|
24
24
|
agentId: node.claimed_by,
|
|
25
25
|
claimedAt: node.claimed_at,
|
|
26
26
|
lockUntil: node.lock_until,
|
|
27
|
+
fence: node.claim_fence,
|
|
27
28
|
isValid: !isExpired,
|
|
28
29
|
isExpired,
|
|
29
30
|
remainingMs,
|
|
30
31
|
};
|
|
31
32
|
}
|
|
33
|
+
/** Remaining lease time in ms (0 if no/elapsed lease) */
|
|
34
|
+
function computeRemainingMs(lockUntil) {
|
|
35
|
+
if (!lockUntil)
|
|
36
|
+
return 0;
|
|
37
|
+
return Math.max(0, new Date(lockUntil).getTime() - Date.now());
|
|
38
|
+
}
|
|
39
|
+
/** Build ClaimInfo for a claim the caller now holds */
|
|
40
|
+
function toHeldClaim(nodeId, agentId, claimedAt, lockUntil, fence) {
|
|
41
|
+
return {
|
|
42
|
+
nodeId,
|
|
43
|
+
agentId,
|
|
44
|
+
claimedAt: claimedAt ?? new Date().toISOString(),
|
|
45
|
+
lockUntil: lockUntil ?? '',
|
|
46
|
+
fence,
|
|
47
|
+
isValid: true,
|
|
48
|
+
isExpired: false,
|
|
49
|
+
remainingMs: computeRemainingMs(lockUntil),
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
/** Build ClaimInfo describing the existing holder that blocked an operation */
|
|
53
|
+
function toExistingClaim(nodeId, agentId, claimedAt, lockUntil) {
|
|
54
|
+
const remainingMs = computeRemainingMs(lockUntil);
|
|
55
|
+
return {
|
|
56
|
+
nodeId,
|
|
57
|
+
agentId,
|
|
58
|
+
claimedAt: claimedAt ?? '',
|
|
59
|
+
lockUntil: lockUntil ?? '',
|
|
60
|
+
isValid: remainingMs > 0,
|
|
61
|
+
isExpired: remainingMs <= 0,
|
|
62
|
+
remainingMs,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
32
65
|
/**
|
|
33
66
|
* Create a ClaimManager backed by storage
|
|
34
67
|
*/
|
|
@@ -37,95 +70,60 @@ export function createClaimManager(storage) {
|
|
|
37
70
|
async claim(nodeId, agentId, options) {
|
|
38
71
|
const durationMs = options?.durationMs ?? DEFAULT_CLAIM_DURATION_MS;
|
|
39
72
|
const force = options?.force ?? false;
|
|
40
|
-
//
|
|
73
|
+
// Existence check for a precise error message. The claim decision itself
|
|
74
|
+
// is made atomically by storage.claimNode (a single conditional UPDATE),
|
|
75
|
+
// so there is no read-modify-write race — a node deleted between here and
|
|
76
|
+
// the claim simply yields ok:false.
|
|
41
77
|
const node = await storage.getNode(nodeId);
|
|
42
78
|
if (!node) {
|
|
43
79
|
return { success: false, error: `Node not found: ${nodeId}` };
|
|
44
80
|
}
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
}
|
|
56
|
-
// Already claimed by same agent - treat as renew
|
|
57
|
-
return this.renew(nodeId, agentId, durationMs);
|
|
81
|
+
const outcome = await storage.claimNode(nodeId, agentId, { leaseMs: durationMs, force });
|
|
82
|
+
if (!outcome.ok) {
|
|
83
|
+
return {
|
|
84
|
+
success: false,
|
|
85
|
+
error: outcome.claimedBy
|
|
86
|
+
? `Node is claimed by ${outcome.claimedBy}`
|
|
87
|
+
: `Cannot claim node: ${nodeId}`,
|
|
88
|
+
existingClaim: outcome.claimedBy
|
|
89
|
+
? toExistingClaim(nodeId, outcome.claimedBy, outcome.claimedAt, outcome.lockUntil)
|
|
90
|
+
: undefined,
|
|
91
|
+
};
|
|
58
92
|
}
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
await storage.updateNode(nodeId, {
|
|
63
|
-
claimed_by: agentId,
|
|
64
|
-
claimed_at: now.toISOString(),
|
|
65
|
-
lock_until: lockUntil.toISOString(),
|
|
66
|
-
updated_at: now.toISOString(),
|
|
67
|
-
});
|
|
68
|
-
const claim = {
|
|
69
|
-
nodeId,
|
|
70
|
-
agentId,
|
|
71
|
-
claimedAt: now.toISOString(),
|
|
72
|
-
lockUntil: lockUntil.toISOString(),
|
|
73
|
-
isValid: true,
|
|
74
|
-
isExpired: false,
|
|
75
|
-
remainingMs: durationMs,
|
|
93
|
+
return {
|
|
94
|
+
success: true,
|
|
95
|
+
claim: toHeldClaim(nodeId, agentId, outcome.claimedAt, outcome.lockUntil, outcome.fence),
|
|
76
96
|
};
|
|
77
|
-
return { success: true, claim };
|
|
78
97
|
},
|
|
79
|
-
async release(nodeId, agentId) {
|
|
80
|
-
|
|
81
|
-
if (!node) {
|
|
82
|
-
return false;
|
|
83
|
-
}
|
|
84
|
-
// Check if claimed by this agent
|
|
85
|
-
if (node.claimed_by !== agentId) {
|
|
86
|
-
return false;
|
|
87
|
-
}
|
|
88
|
-
// Clear claim fields
|
|
89
|
-
await storage.updateNode(nodeId, {
|
|
90
|
-
claimed_by: undefined,
|
|
91
|
-
claimed_at: undefined,
|
|
92
|
-
lock_until: undefined,
|
|
93
|
-
updated_at: new Date().toISOString(),
|
|
94
|
-
});
|
|
95
|
-
return true;
|
|
98
|
+
async release(nodeId, agentId, fence) {
|
|
99
|
+
return storage.releaseNode(nodeId, agentId, fence != null ? { fence } : undefined);
|
|
96
100
|
},
|
|
97
|
-
async renew(nodeId, agentId, durationMs) {
|
|
101
|
+
async renew(nodeId, agentId, durationMs, fence) {
|
|
98
102
|
const duration = durationMs ?? DEFAULT_CLAIM_DURATION_MS;
|
|
99
|
-
const
|
|
100
|
-
if (!
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
103
|
+
const outcome = await storage.renewNode(nodeId, agentId, { leaseMs: duration, fence });
|
|
104
|
+
if (!outcome.ok) {
|
|
105
|
+
let error;
|
|
106
|
+
if (!outcome.claimedBy) {
|
|
107
|
+
error = 'Node is not claimed';
|
|
108
|
+
}
|
|
109
|
+
else if (outcome.claimedBy === agentId) {
|
|
110
|
+
error = 'Fence token mismatch';
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
error = `Node is claimed by ${outcome.claimedBy}`;
|
|
114
|
+
}
|
|
106
115
|
return {
|
|
107
116
|
success: false,
|
|
108
|
-
error
|
|
109
|
-
existingClaim:
|
|
117
|
+
error,
|
|
118
|
+
existingClaim: outcome.claimedBy
|
|
119
|
+
? toExistingClaim(nodeId, outcome.claimedBy, outcome.claimedAt, outcome.lockUntil)
|
|
120
|
+
: undefined,
|
|
110
121
|
};
|
|
111
122
|
}
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
await storage.updateNode(nodeId, {
|
|
116
|
-
lock_until: lockUntil.toISOString(),
|
|
117
|
-
updated_at: now.toISOString(),
|
|
118
|
-
});
|
|
119
|
-
const claim = {
|
|
120
|
-
nodeId,
|
|
121
|
-
agentId,
|
|
122
|
-
claimedAt: node.claimed_at,
|
|
123
|
-
lockUntil: lockUntil.toISOString(),
|
|
124
|
-
isValid: true,
|
|
125
|
-
isExpired: false,
|
|
126
|
-
remainingMs: duration,
|
|
123
|
+
return {
|
|
124
|
+
success: true,
|
|
125
|
+
claim: toHeldClaim(nodeId, agentId, outcome.claimedAt, outcome.lockUntil, outcome.fence),
|
|
127
126
|
};
|
|
128
|
-
return { success: true, claim };
|
|
129
127
|
},
|
|
130
128
|
async getClaim(nodeId) {
|
|
131
129
|
const node = await storage.getNode(nodeId);
|
|
@@ -164,16 +162,10 @@ export function createClaimManager(storage) {
|
|
|
164
162
|
return expired;
|
|
165
163
|
},
|
|
166
164
|
async cleanupExpired() {
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
claimed_at: undefined,
|
|
172
|
-
lock_until: undefined,
|
|
173
|
-
updated_at: new Date().toISOString(),
|
|
174
|
-
});
|
|
175
|
-
}
|
|
176
|
-
return expired.length;
|
|
165
|
+
// Atomic, per-row guarded clear — never clobbers a freshly re-claimed task
|
|
166
|
+
// (the previous read-then-write version could).
|
|
167
|
+
const cleared = await storage.sweepExpiredClaims();
|
|
168
|
+
return cleared.length;
|
|
177
169
|
},
|
|
178
170
|
};
|
|
179
171
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"coordination.js","sourceRoot":"","sources":["../../src/graph/coordination.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"coordination.js","sourceRoot":"","sources":["../../src/graph/coordination.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"expansion.d.ts","sourceRoot":"","sources":["../../src/graph/expansion.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"expansion.d.ts","sourceRoot":"","sources":["../../src/graph/expansion.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG/C;;GAEG;AACH,MAAM,MAAM,aAAa,GACrB,MAAM,GACN,aAAa,GACb,aAAa,GACb,KAAK,CAAC;AAEV;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,oCAAoC;IACpC,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,sDAAsD;IACtD,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC;IAC1C,uCAAuC;IACvC,kBAAkB,EAAE,UAAU,EAAE,CAAC;IACjC,4BAA4B;IAC5B,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,sCAAsC;IACtC,oBAAoB,EAAE,MAAM,EAAE,CAAC;IAC/B,6BAA6B;IAC7B,YAAY,EAAE,MAAM,GAAG,SAAS,CAAC;CAClC;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,qBAAqB;IACrB,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,0DAA0D;IAC1D,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B;;OAEG;IACH,aAAa,CAAC,OAAO,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IAEnE;;OAEG;IACH,aAAa,CACX,MAAM,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,EAC1C,OAAO,CAAC,EAAE,gBAAgB,GACzB,OAAO,CAAC,cAAc,CAAC,CAAC;CAC5B;AA8FD;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,OAAO,EAChB,YAAY,EAAE,MAAM,EACpB,iBAAiB,EAAE,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,EAChD,YAAY,CAAC,EAAE,YAAY,GAC1B,aAAa,CA6Lf"}
|
package/dist/graph/expansion.js
CHANGED
|
@@ -50,7 +50,7 @@ function getReferencedLocationHashes(edges, localHash) {
|
|
|
50
50
|
/**
|
|
51
51
|
* Find edges that reference nodes in other locations
|
|
52
52
|
*/
|
|
53
|
-
function findCrossLocationEdges(edges, localHash,
|
|
53
|
+
function findCrossLocationEdges(edges, localHash, _connectedHashes) {
|
|
54
54
|
return edges.filter((edge) => {
|
|
55
55
|
for (const field of [edge.from_id, edge.to_id]) {
|
|
56
56
|
if (isOpentasksUri(field)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"expansion.js","sourceRoot":"","sources":["../../src/graph/expansion.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"expansion.js","sourceRoot":"","sources":["../../src/graph/expansion.ts"],"names":[],"mappings":"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"}
|
|
@@ -47,6 +47,23 @@ export interface SyncCycleResult {
|
|
|
47
47
|
pull: PullResult;
|
|
48
48
|
push: PushResult;
|
|
49
49
|
}
|
|
50
|
+
/**
|
|
51
|
+
* Health snapshot exposing the syncer's recent success/failure state.
|
|
52
|
+
* Used by operators to surface "your pushes have been failing for X
|
|
53
|
+
* minutes" in UIs without needing to run `sync.now` to check.
|
|
54
|
+
*/
|
|
55
|
+
export interface SyncerHealth {
|
|
56
|
+
/** Message from the most recent failed op, or null if last op succeeded. */
|
|
57
|
+
lastError: string | null;
|
|
58
|
+
/** ISO timestamp of the most recent failure, or null. */
|
|
59
|
+
lastErrorAt: string | null;
|
|
60
|
+
/** Which operation failed: 'commit' | 'pull' | 'push' | null. */
|
|
61
|
+
lastErrorOp: 'commit' | 'pull' | 'push' | null;
|
|
62
|
+
/** ISO timestamp of the last fully-successful sync cycle. */
|
|
63
|
+
lastSuccessAt: string | null;
|
|
64
|
+
/** Cumulative count of failed ops (commit/pull/push) since process start. */
|
|
65
|
+
errorCount: number;
|
|
66
|
+
}
|
|
50
67
|
export interface GitGraphSyncer {
|
|
51
68
|
/** Commit graph.jsonl if it has uncommitted changes */
|
|
52
69
|
commitIfDirty(): Promise<CommitResult>;
|
|
@@ -64,6 +81,13 @@ export interface GitGraphSyncer {
|
|
|
64
81
|
stopAutoSync(): void;
|
|
65
82
|
/** Whether auto-sync is running */
|
|
66
83
|
isAutoSyncRunning(): boolean;
|
|
84
|
+
/**
|
|
85
|
+
* Snapshot of recent success/failure state. Read-only — updated
|
|
86
|
+
* automatically by commit/pull/push/sync calls (including the auto-
|
|
87
|
+
* sync timer). Surfaces silent failures that would otherwise only
|
|
88
|
+
* appear in stderr.
|
|
89
|
+
*/
|
|
90
|
+
getHealth(): SyncerHealth;
|
|
67
91
|
}
|
|
68
92
|
/**
|
|
69
93
|
* Create a git graph syncer for the given .opentasks directory.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"git-graph-syncer.d.ts","sourceRoot":"","sources":["../../src/graph/git-graph-syncer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAWH,MAAM,WAAW,oBAAoB;IACnC,wCAAwC;IACxC,aAAa,EAAE,MAAM,CAAC;IAEtB,4CAA4C;IAC5C,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAEvB,0CAA0C;IAC1C,UAAU,CAAC,EAAE,OAAO,CAAC;IAErB,yCAAyC;IACzC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB,6DAA6D;IAC7D,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB,iDAAiD;IACjD,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,mCAAmC;IACnC,SAAS,EAAE,OAAO,CAAC;IAEnB,6BAA6B;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,UAAU;IACzB,6BAA6B;IAC7B,MAAM,EAAE,OAAO,CAAC;IAEhB,mCAAmC;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,UAAU;IACzB,6BAA6B;IAC7B,MAAM,EAAE,OAAO,CAAC;IAEhB,wCAAwC;IACxC,UAAU,EAAE,OAAO,CAAC;IAEpB,mCAAmC;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,YAAY,CAAC;IACrB,IAAI,EAAE,UAAU,CAAC;IACjB,IAAI,EAAE,UAAU,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,uDAAuD;IACvD,aAAa,IAAI,OAAO,CAAC,YAAY,CAAC,CAAC;IAEvC,qBAAqB;IACrB,IAAI,IAAI,OAAO,CAAC,UAAU,CAAC,CAAC;IAE5B,uBAAuB;IACvB,IAAI,IAAI,OAAO,CAAC,UAAU,CAAC,CAAC;IAE5B,4CAA4C;IAC5C,IAAI,IAAI,OAAO,CAAC,eAAe,CAAC,CAAC;IAEjC,mDAAmD;IACnD,kBAAkB,IAAI,IAAI,CAAC;IAE3B,qCAAqC;IACrC,aAAa,IAAI,IAAI,CAAC;IAEtB,oCAAoC;IACpC,YAAY,IAAI,IAAI,CAAC;IAErB,mCAAmC;IACnC,iBAAiB,IAAI,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"git-graph-syncer.d.ts","sourceRoot":"","sources":["../../src/graph/git-graph-syncer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAWH,MAAM,WAAW,oBAAoB;IACnC,wCAAwC;IACxC,aAAa,EAAE,MAAM,CAAC;IAEtB,4CAA4C;IAC5C,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAEvB,0CAA0C;IAC1C,UAAU,CAAC,EAAE,OAAO,CAAC;IAErB,yCAAyC;IACzC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB,6DAA6D;IAC7D,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB,iDAAiD;IACjD,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,mCAAmC;IACnC,SAAS,EAAE,OAAO,CAAC;IAEnB,6BAA6B;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,UAAU;IACzB,6BAA6B;IAC7B,MAAM,EAAE,OAAO,CAAC;IAEhB,mCAAmC;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,UAAU;IACzB,6BAA6B;IAC7B,MAAM,EAAE,OAAO,CAAC;IAEhB,wCAAwC;IACxC,UAAU,EAAE,OAAO,CAAC;IAEpB,mCAAmC;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,YAAY,CAAC;IACrB,IAAI,EAAE,UAAU,CAAC;IACjB,IAAI,EAAE,UAAU,CAAC;CAClB;AAED;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC3B,4EAA4E;IAC5E,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAEzB,yDAAyD;IACzD,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAE3B,iEAAiE;IACjE,WAAW,EAAE,QAAQ,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAE/C,6DAA6D;IAC7D,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAE7B,6EAA6E;IAC7E,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,uDAAuD;IACvD,aAAa,IAAI,OAAO,CAAC,YAAY,CAAC,CAAC;IAEvC,qBAAqB;IACrB,IAAI,IAAI,OAAO,CAAC,UAAU,CAAC,CAAC;IAE5B,uBAAuB;IACvB,IAAI,IAAI,OAAO,CAAC,UAAU,CAAC,CAAC;IAE5B,4CAA4C;IAC5C,IAAI,IAAI,OAAO,CAAC,eAAe,CAAC,CAAC;IAEjC,mDAAmD;IACnD,kBAAkB,IAAI,IAAI,CAAC;IAE3B,qCAAqC;IACrC,aAAa,IAAI,IAAI,CAAC;IAEtB,oCAAoC;IACpC,YAAY,IAAI,IAAI,CAAC;IAErB,mCAAmC;IACnC,iBAAiB,IAAI,OAAO,CAAC;IAE7B;;;;;OAKG;IACH,SAAS,IAAI,YAAY,CAAC;CAC3B;AA4CD;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,oBAAoB,GAAG,cAAc,CAyQjF"}
|