@haaaiawd/second-nature 0.1.17 → 0.1.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (188) hide show
  1. package/index.js +855 -855
  2. package/openclaw.plugin.json +29 -29
  3. package/package.json +52 -52
  4. package/runtime/cli/commands/index.d.ts +14 -14
  5. package/runtime/cli/commands/index.js +193 -193
  6. package/runtime/cli/explain/explain-surface-subject.d.ts +8 -8
  7. package/runtime/cli/explain/explain-surface-subject.js +9 -9
  8. package/runtime/cli/explain/format-explanation.d.ts +12 -12
  9. package/runtime/cli/explain/format-explanation.js +12 -12
  10. package/runtime/cli/explain/resolve-subject.js +41 -41
  11. package/runtime/cli/host-capability/classify-delivery.d.ts +14 -14
  12. package/runtime/cli/host-capability/classify-delivery.js +20 -20
  13. package/runtime/cli/host-capability/probe-host-capability.d.ts +2 -2
  14. package/runtime/cli/host-capability/probe-host-capability.js +58 -58
  15. package/runtime/cli/host-capability/record-host-capability.d.ts +6 -6
  16. package/runtime/cli/host-capability/record-host-capability.js +14 -14
  17. package/runtime/cli/host-capability/types.d.ts +71 -71
  18. package/runtime/cli/host-capability/types.js +6 -6
  19. package/runtime/cli/host-smoke/run-host-smoke.d.ts +2 -2
  20. package/runtime/cli/host-smoke/run-host-smoke.js +40 -40
  21. package/runtime/cli/host-smoke/types.d.ts +35 -35
  22. package/runtime/cli/host-smoke/types.js +6 -6
  23. package/runtime/cli/index.js +58 -54
  24. package/runtime/cli/ops/heartbeat-surface.d.ts +38 -35
  25. package/runtime/cli/ops/heartbeat-surface.js +73 -71
  26. package/runtime/cli/ops/ops-router.d.ts +19 -16
  27. package/runtime/cli/ops/ops-router.js +89 -87
  28. package/runtime/cli/ops/show-operator-fallback.d.ts +13 -13
  29. package/runtime/cli/ops/show-operator-fallback.js +22 -22
  30. package/runtime/cli/ops/workspace-heartbeat-runner.d.ts +19 -10
  31. package/runtime/cli/ops/workspace-heartbeat-runner.js +39 -26
  32. package/runtime/cli/read-models/index.d.ts +29 -29
  33. package/runtime/cli/read-models/index.js +256 -256
  34. package/runtime/cli/read-models/operator-explain-map.d.ts +6 -6
  35. package/runtime/cli/read-models/operator-explain-map.js +10 -10
  36. package/runtime/cli/read-models/types.d.ts +79 -79
  37. package/runtime/cli/runtime/runtime-artifact-boundary.d.ts +28 -28
  38. package/runtime/cli/runtime/runtime-artifact-boundary.js +94 -94
  39. package/runtime/connectors/base/contract.d.ts +87 -87
  40. package/runtime/connectors/base/execution-policy.d.ts +47 -47
  41. package/runtime/connectors/base/execution-policy.js +82 -82
  42. package/runtime/connectors/base/index.d.ts +8 -8
  43. package/runtime/connectors/base/index.js +8 -8
  44. package/runtime/connectors/base/manifest.d.ts +64 -64
  45. package/runtime/connectors/base/manifest.js +86 -86
  46. package/runtime/connectors/base/map-life-evidence.d.ts +16 -16
  47. package/runtime/connectors/base/map-life-evidence.js +79 -79
  48. package/runtime/connectors/base/policy-layer.d.ts +29 -29
  49. package/runtime/connectors/base/policy-layer.js +198 -198
  50. package/runtime/connectors/base/route-planner.js +99 -99
  51. package/runtime/connectors/index.d.ts +5 -5
  52. package/runtime/connectors/index.js +5 -5
  53. package/runtime/connectors/near-real/near-real-connector-smoke.d.ts +19 -19
  54. package/runtime/connectors/near-real/near-real-connector-smoke.js +152 -152
  55. package/runtime/core/second-nature/heartbeat/heartbeat-executor.js +114 -114
  56. package/runtime/core/second-nature/heartbeat/heartbeat-loop.d.ts +63 -63
  57. package/runtime/core/second-nature/heartbeat/heartbeat-loop.js +139 -139
  58. package/runtime/core/second-nature/heartbeat/index.d.ts +8 -8
  59. package/runtime/core/second-nature/heartbeat/index.js +7 -7
  60. package/runtime/core/second-nature/heartbeat/run-heartbeat-cycle.d.ts +21 -21
  61. package/runtime/core/second-nature/heartbeat/run-heartbeat-cycle.js +35 -35
  62. package/runtime/core/second-nature/heartbeat/runtime-snapshot.d.ts +28 -28
  63. package/runtime/core/second-nature/heartbeat/runtime-snapshot.js +35 -35
  64. package/runtime/core/second-nature/heartbeat/signal.d.ts +42 -42
  65. package/runtime/core/second-nature/heartbeat/snapshot-builder.d.ts +51 -51
  66. package/runtime/core/second-nature/index.d.ts +22 -22
  67. package/runtime/core/second-nature/index.js +22 -22
  68. package/runtime/core/second-nature/orchestrator/effect-dispatcher.d.ts +100 -100
  69. package/runtime/core/second-nature/orchestrator/effect-dispatcher.js +144 -144
  70. package/runtime/core/second-nature/orchestrator/guard-layer.d.ts +8 -8
  71. package/runtime/core/second-nature/orchestrator/guard-layer.js +110 -110
  72. package/runtime/core/second-nature/orchestrator/intent-planner.d.ts +13 -13
  73. package/runtime/core/second-nature/orchestrator/intent-planner.js +199 -199
  74. package/runtime/core/second-nature/orchestrator/lease-manager.d.ts +14 -14
  75. package/runtime/core/second-nature/orchestrator/lease-manager.js +58 -58
  76. package/runtime/core/second-nature/outreach/build-outreach-draft-request.d.ts +6 -6
  77. package/runtime/core/second-nature/outreach/build-outreach-draft-request.js +63 -63
  78. package/runtime/core/second-nature/outreach/delivery-target.d.ts +26 -26
  79. package/runtime/core/second-nature/outreach/delivery-target.js +70 -70
  80. package/runtime/core/second-nature/outreach/dispatch-user-outreach.d.ts +38 -38
  81. package/runtime/core/second-nature/outreach/dispatch-user-outreach.js +119 -119
  82. package/runtime/core/second-nature/outreach/judge-input-from-snapshot.d.ts +7 -7
  83. package/runtime/core/second-nature/outreach/judge-input-from-snapshot.js +45 -45
  84. package/runtime/core/second-nature/outreach/judge-outreach.d.ts +40 -40
  85. package/runtime/core/second-nature/outreach/judge-outreach.js +121 -121
  86. package/runtime/core/second-nature/quiet/run-source-backed-quiet.d.ts +21 -21
  87. package/runtime/core/second-nature/quiet/run-source-backed-quiet.js +123 -123
  88. package/runtime/core/second-nature/rhythm/planner-rhythm-window.d.ts +15 -15
  89. package/runtime/core/second-nature/rhythm/planner-rhythm-window.js +52 -52
  90. package/runtime/core/second-nature/rhythm/policy-bridge.d.ts +19 -19
  91. package/runtime/core/second-nature/rhythm/policy-bridge.js +34 -34
  92. package/runtime/core/second-nature/runtime/service-entry.js +45 -45
  93. package/runtime/core/second-nature/types.d.ts +51 -51
  94. package/runtime/guidance/draft-outreach-message.d.ts +7 -7
  95. package/runtime/guidance/draft-outreach-message.js +42 -42
  96. package/runtime/guidance/evidence-guidance.d.ts +40 -40
  97. package/runtime/guidance/evidence-guidance.js +52 -52
  98. package/runtime/guidance/index.d.ts +11 -11
  99. package/runtime/guidance/index.js +11 -11
  100. package/runtime/guidance/outreach-draft-schema.d.ts +228 -228
  101. package/runtime/guidance/outreach-draft-schema.js +80 -80
  102. package/runtime/observability/audit/append-only-audit-store.d.ts +14 -14
  103. package/runtime/observability/audit/append-only-audit-store.js +21 -21
  104. package/runtime/observability/audit/audit-envelope.d.ts +51 -51
  105. package/runtime/observability/audit/audit-envelope.js +130 -130
  106. package/runtime/observability/audit/verify-audit-hash-chain.d.ts +23 -23
  107. package/runtime/observability/audit/verify-audit-hash-chain.js +83 -83
  108. package/runtime/observability/db/index.js +124 -124
  109. package/runtime/observability/db/schema/host-capability-reports.d.ts +180 -180
  110. package/runtime/observability/db/schema/host-capability-reports.js +12 -12
  111. package/runtime/observability/db/schema/index.d.ts +947 -947
  112. package/runtime/observability/db/schema/index.js +71 -71
  113. package/runtime/observability/index.d.ts +20 -19
  114. package/runtime/observability/index.js +19 -18
  115. package/runtime/observability/query/explain-query.d.ts +48 -48
  116. package/runtime/observability/query/explain-query.js +114 -114
  117. package/runtime/observability/query/export-audit-bundle.d.ts +22 -22
  118. package/runtime/observability/query/export-audit-bundle.js +27 -27
  119. package/runtime/observability/services/decision-ledger.d.ts +46 -46
  120. package/runtime/observability/services/decision-ledger.js +161 -161
  121. package/runtime/observability/services/governance-audit.d.ts +41 -41
  122. package/runtime/observability/services/governance-audit.js +163 -163
  123. package/runtime/observability/services/governance-plane-recorder.d.ts +47 -47
  124. package/runtime/observability/services/governance-plane-recorder.js +55 -55
  125. package/runtime/observability/services/lived-experience-audit.d.ts +97 -97
  126. package/runtime/observability/services/lived-experience-audit.js +162 -162
  127. package/runtime/observability/services/runtime-decision-recorder.d.ts +29 -0
  128. package/runtime/observability/services/runtime-decision-recorder.js +94 -0
  129. package/runtime/storage/bootstrap/native-sqlite-probe.d.ts +7 -7
  130. package/runtime/storage/bootstrap/native-sqlite-probe.js +28 -28
  131. package/runtime/storage/bootstrap/repair-gate.d.ts +17 -17
  132. package/runtime/storage/bootstrap/repair-gate.js +71 -71
  133. package/runtime/storage/bootstrap/storage-mode-smoke.d.ts +38 -38
  134. package/runtime/storage/bootstrap/storage-mode-smoke.js +85 -85
  135. package/runtime/storage/db/index.js +154 -154
  136. package/runtime/storage/db/schema/delivery-attempts.d.ts +199 -199
  137. package/runtime/storage/db/schema/delivery-attempts.js +13 -13
  138. package/runtime/storage/db/schema/index.d.ts +9 -9
  139. package/runtime/storage/db/schema/index.js +9 -9
  140. package/runtime/storage/db/schema/life-evidence-index.d.ts +161 -161
  141. package/runtime/storage/db/schema/life-evidence-index.js +11 -11
  142. package/runtime/storage/db/schema/operator-fallback-artifacts.d.ts +161 -161
  143. package/runtime/storage/db/schema/operator-fallback-artifacts.js +11 -11
  144. package/runtime/storage/db/schema/policies.d.ts +98 -98
  145. package/runtime/storage/db/schema/policies.js +8 -8
  146. package/runtime/storage/delivery/query-delivery-attempts.d.ts +3 -3
  147. package/runtime/storage/delivery/query-delivery-attempts.js +32 -32
  148. package/runtime/storage/delivery/types.d.ts +27 -27
  149. package/runtime/storage/delivery/types.js +1 -1
  150. package/runtime/storage/delivery/write-delivery-attempt.d.ts +6 -6
  151. package/runtime/storage/delivery/write-delivery-attempt.js +36 -36
  152. package/runtime/storage/fallback/load-operator-fallback.d.ts +14 -14
  153. package/runtime/storage/fallback/load-operator-fallback.js +47 -47
  154. package/runtime/storage/fallback/operator-fallback-types.d.ts +9 -9
  155. package/runtime/storage/fallback/operator-fallback-types.js +1 -1
  156. package/runtime/storage/fallback/operator-fallback-view.d.ts +11 -11
  157. package/runtime/storage/fallback/operator-fallback-view.js +1 -1
  158. package/runtime/storage/fallback/write-operator-fallback.d.ts +6 -6
  159. package/runtime/storage/fallback/write-operator-fallback.js +21 -21
  160. package/runtime/storage/index.d.ts +37 -37
  161. package/runtime/storage/index.js +30 -30
  162. package/runtime/storage/life-evidence/append-life-evidence.d.ts +7 -7
  163. package/runtime/storage/life-evidence/append-life-evidence.js +64 -64
  164. package/runtime/storage/life-evidence/types.d.ts +45 -45
  165. package/runtime/storage/life-evidence/types.js +6 -6
  166. package/runtime/storage/quiet/persist-quiet-artifact.d.ts +7 -7
  167. package/runtime/storage/quiet/persist-quiet-artifact.js +22 -22
  168. package/runtime/storage/quiet/quiet-artifact-types.d.ts +18 -18
  169. package/runtime/storage/quiet/quiet-artifact-types.js +1 -1
  170. package/runtime/storage/quiet/quiet-artifact-writer.d.ts +15 -15
  171. package/runtime/storage/quiet/quiet-artifact-writer.js +56 -56
  172. package/runtime/storage/repositories/credential-repository.js +30 -30
  173. package/runtime/storage/rhythm/rhythm-policy-snapshot.d.ts +10 -10
  174. package/runtime/storage/rhythm/rhythm-policy-snapshot.js +34 -34
  175. package/runtime/storage/services/credential-vault.d.ts +13 -13
  176. package/runtime/storage/services/credential-vault.js +116 -116
  177. package/runtime/storage/snapshots/continuity-snapshot.d.ts +9 -9
  178. package/runtime/storage/snapshots/continuity-snapshot.js +41 -41
  179. package/runtime/storage/snapshots/life-evidence-snapshot.d.ts +6 -6
  180. package/runtime/storage/snapshots/life-evidence-snapshot.js +114 -114
  181. package/runtime/storage/snapshots/types.d.ts +58 -58
  182. package/runtime/storage/snapshots/types.js +1 -1
  183. package/runtime/storage/state-api.js +104 -104
  184. package/runtime/storage/user-interest/load-user-interest-snapshot.d.ts +2 -2
  185. package/runtime/storage/user-interest/load-user-interest-snapshot.js +150 -150
  186. package/runtime/storage/user-interest/types.d.ts +25 -25
  187. package/runtime/storage/user-interest/types.js +1 -1
  188. package/workspace-ops-bridge.js +81 -80
@@ -1,100 +1,100 @@
1
- import type { ConnectorResult, CapabilityIntent } from "../../../connectors/base/contract.js";
2
- import { LeaseManager, type EffectClass } from "./lease-manager.js";
3
- export interface AllowedIntent {
4
- id: string;
5
- kind: "work" | "exploration" | "social" | "quiet" | "reflection" | "outreach" | "maintenance";
6
- summary: string;
7
- effectClass: EffectClass;
8
- platformId?: string;
9
- payload?: Record<string, unknown>;
10
- }
11
- export interface DecisionContext {
12
- decisionId: string;
13
- intentId: string;
14
- tickId: string;
15
- checkpointId: string;
16
- traceId: string;
17
- }
18
- export interface IntentCommitPort {
19
- createIntentCommitRecord(input: {
20
- intentId: string;
21
- decisionId: string;
22
- checkpointId?: string;
23
- state: "planned" | "dispatched" | "externally_acknowledged" | "committed" | "reconcile" | "aborted";
24
- }): Promise<{
25
- id: string;
26
- }>;
27
- advanceIntentCommitState(id: string, state: "planned" | "dispatched" | "externally_acknowledged" | "committed" | "reconcile" | "aborted", metadata?: Record<string, unknown>): Promise<void>;
28
- commitIntentOutcome(id: string, outcome: {
29
- traceId: string;
30
- outcomeRef: string;
31
- }): Promise<void>;
32
- abortIntentCommit(id: string, reason: string): Promise<void>;
33
- }
34
- export interface ConnectorExecutor {
35
- executeEffect(input: {
36
- platformId: string;
37
- intent: CapabilityIntent;
38
- payload: Record<string, unknown>;
39
- decisionId: string;
40
- intentId: string;
41
- idempotencyKey: string;
42
- }): Promise<ConnectorResult<unknown>>;
43
- }
44
- export interface CheckpointPort {
45
- saveCheckpoint(input: {
46
- id: string;
47
- tickId: string;
48
- intentId: string;
49
- phase: "before_effect" | "before_quiet_write";
50
- snapshotRef: string;
51
- }): Promise<void>;
52
- }
53
- export interface MemoryPort {
54
- persistCurationResult(input: {
55
- summary: string;
56
- sourceRefs: string[];
57
- traceId: string;
58
- }): Promise<void>;
59
- }
60
- export interface ReflectionPort {
61
- runNarrativeReflection(input: {
62
- decisionId: string;
63
- intentId: string;
64
- traceId: string;
65
- }): Promise<{
66
- outcomeRef: string;
67
- }>;
68
- }
69
- export type DispatchResult = {
70
- status: "deferred";
71
- reason: string;
72
- } | {
73
- status: "effect_executed";
74
- result: ConnectorResult<unknown>;
75
- commitId: string;
76
- } | {
77
- status: "curated";
78
- commitId: string;
79
- } | {
80
- status: "reflected";
81
- commitId: string;
82
- } | {
83
- status: "maintenance_done";
84
- commitId: string;
85
- };
86
- export declare class EffectDispatcher {
87
- private readonly leaseManager;
88
- private readonly commitPort;
89
- private readonly connectorExecutor;
90
- private readonly checkpointPort;
91
- private readonly memoryPort;
92
- private readonly reflectionPort;
93
- constructor(leaseManager: LeaseManager, commitPort: IntentCommitPort, connectorExecutor: ConnectorExecutor, checkpointPort: CheckpointPort, memoryPort: MemoryPort, reflectionPort: ReflectionPort);
94
- dispatchEffect(intent: AllowedIntent, decision: DecisionContext): Promise<DispatchResult>;
95
- }
96
- export declare function buildDecisionContext(input: {
97
- tickId: string;
98
- decisionId?: string;
99
- intentId: string;
100
- }): DecisionContext;
1
+ import type { ConnectorResult, CapabilityIntent } from "../../../connectors/base/contract.js";
2
+ import { LeaseManager, type EffectClass } from "./lease-manager.js";
3
+ export interface AllowedIntent {
4
+ id: string;
5
+ kind: "work" | "exploration" | "social" | "quiet" | "reflection" | "outreach" | "maintenance";
6
+ summary: string;
7
+ effectClass: EffectClass;
8
+ platformId?: string;
9
+ payload?: Record<string, unknown>;
10
+ }
11
+ export interface DecisionContext {
12
+ decisionId: string;
13
+ intentId: string;
14
+ tickId: string;
15
+ checkpointId: string;
16
+ traceId: string;
17
+ }
18
+ export interface IntentCommitPort {
19
+ createIntentCommitRecord(input: {
20
+ intentId: string;
21
+ decisionId: string;
22
+ checkpointId?: string;
23
+ state: "planned" | "dispatched" | "externally_acknowledged" | "committed" | "reconcile" | "aborted";
24
+ }): Promise<{
25
+ id: string;
26
+ }>;
27
+ advanceIntentCommitState(id: string, state: "planned" | "dispatched" | "externally_acknowledged" | "committed" | "reconcile" | "aborted", metadata?: Record<string, unknown>): Promise<void>;
28
+ commitIntentOutcome(id: string, outcome: {
29
+ traceId: string;
30
+ outcomeRef: string;
31
+ }): Promise<void>;
32
+ abortIntentCommit(id: string, reason: string): Promise<void>;
33
+ }
34
+ export interface ConnectorExecutor {
35
+ executeEffect(input: {
36
+ platformId: string;
37
+ intent: CapabilityIntent;
38
+ payload: Record<string, unknown>;
39
+ decisionId: string;
40
+ intentId: string;
41
+ idempotencyKey: string;
42
+ }): Promise<ConnectorResult<unknown>>;
43
+ }
44
+ export interface CheckpointPort {
45
+ saveCheckpoint(input: {
46
+ id: string;
47
+ tickId: string;
48
+ intentId: string;
49
+ phase: "before_effect" | "before_quiet_write";
50
+ snapshotRef: string;
51
+ }): Promise<void>;
52
+ }
53
+ export interface MemoryPort {
54
+ persistCurationResult(input: {
55
+ summary: string;
56
+ sourceRefs: string[];
57
+ traceId: string;
58
+ }): Promise<void>;
59
+ }
60
+ export interface ReflectionPort {
61
+ runNarrativeReflection(input: {
62
+ decisionId: string;
63
+ intentId: string;
64
+ traceId: string;
65
+ }): Promise<{
66
+ outcomeRef: string;
67
+ }>;
68
+ }
69
+ export type DispatchResult = {
70
+ status: "deferred";
71
+ reason: string;
72
+ } | {
73
+ status: "effect_executed";
74
+ result: ConnectorResult<unknown>;
75
+ commitId: string;
76
+ } | {
77
+ status: "curated";
78
+ commitId: string;
79
+ } | {
80
+ status: "reflected";
81
+ commitId: string;
82
+ } | {
83
+ status: "maintenance_done";
84
+ commitId: string;
85
+ };
86
+ export declare class EffectDispatcher {
87
+ private readonly leaseManager;
88
+ private readonly commitPort;
89
+ private readonly connectorExecutor;
90
+ private readonly checkpointPort;
91
+ private readonly memoryPort;
92
+ private readonly reflectionPort;
93
+ constructor(leaseManager: LeaseManager, commitPort: IntentCommitPort, connectorExecutor: ConnectorExecutor, checkpointPort: CheckpointPort, memoryPort: MemoryPort, reflectionPort: ReflectionPort);
94
+ dispatchEffect(intent: AllowedIntent, decision: DecisionContext): Promise<DispatchResult>;
95
+ }
96
+ export declare function buildDecisionContext(input: {
97
+ tickId: string;
98
+ decisionId?: string;
99
+ intentId: string;
100
+ }): DecisionContext;
@@ -1,144 +1,144 @@
1
- import * as crypto from "crypto";
2
- function needsLease(effectClass) {
3
- return effectClass === "external_platform_action" || effectClass === "connector_action" || effectClass === "user_outreach";
4
- }
5
- function needsCheckpoint(effectClass) {
6
- return effectClass !== "maintenance" && effectClass !== "no_effect";
7
- }
8
- function isConnectorEffect(effectClass) {
9
- return effectClass === "external_platform_action" || effectClass === "connector_action";
10
- }
11
- function toCapabilityIntent(intent) {
12
- if (intent.kind === "work")
13
- return "work.discover";
14
- if (intent.kind === "exploration")
15
- return "feed.read";
16
- if (intent.kind === "social")
17
- return "comment.reply";
18
- if (intent.kind === "outreach")
19
- return "message.send";
20
- if (intent.kind === "quiet")
21
- return "feed.read";
22
- return "feed.read";
23
- }
24
- export class EffectDispatcher {
25
- leaseManager;
26
- commitPort;
27
- connectorExecutor;
28
- checkpointPort;
29
- memoryPort;
30
- reflectionPort;
31
- constructor(leaseManager, commitPort, connectorExecutor, checkpointPort, memoryPort, reflectionPort) {
32
- this.leaseManager = leaseManager;
33
- this.commitPort = commitPort;
34
- this.connectorExecutor = connectorExecutor;
35
- this.checkpointPort = checkpointPort;
36
- this.memoryPort = memoryPort;
37
- this.reflectionPort = reflectionPort;
38
- }
39
- async dispatchEffect(intent, decision) {
40
- const lease = needsLease(intent.effectClass)
41
- ? await this.leaseManager.acquire(intent.effectClass, intent.platformId ?? intent.id)
42
- : await this.leaseManager.acquire("maintenance");
43
- if (!lease.granted) {
44
- return { status: "deferred", reason: "lease_unavailable" };
45
- }
46
- if (needsCheckpoint(intent.effectClass)) {
47
- await this.checkpointPort.saveCheckpoint({
48
- id: decision.checkpointId,
49
- tickId: decision.tickId,
50
- intentId: decision.intentId,
51
- phase: isConnectorEffect(intent.effectClass) ? "before_effect" : "before_quiet_write",
52
- snapshotRef: decision.traceId,
53
- });
54
- }
55
- const commit = await this.commitPort.createIntentCommitRecord({
56
- intentId: decision.intentId,
57
- decisionId: decision.decisionId,
58
- checkpointId: decision.checkpointId,
59
- state: "planned",
60
- });
61
- try {
62
- if (isConnectorEffect(intent.effectClass)) {
63
- await this.commitPort.advanceIntentCommitState(commit.id, "dispatched");
64
- const result = await this.connectorExecutor.executeEffect({
65
- platformId: intent.platformId ?? "unknown",
66
- intent: toCapabilityIntent(intent),
67
- payload: intent.payload ?? {},
68
- decisionId: decision.decisionId,
69
- intentId: decision.intentId,
70
- idempotencyKey: `idem:${decision.decisionId}:${decision.intentId}`,
71
- });
72
- if (result.status === "success") {
73
- await this.commitPort.advanceIntentCommitState(commit.id, "externally_acknowledged", {
74
- outcomeRef: result.metadata.platformId,
75
- });
76
- await this.commitPort.commitIntentOutcome(commit.id, {
77
- traceId: decision.traceId,
78
- outcomeRef: result.metadata.platformId,
79
- });
80
- }
81
- else {
82
- if (result.status === "retryable_failure") {
83
- await this.commitPort.advanceIntentCommitState(commit.id, "reconcile", {
84
- failureClass: result.failureClass,
85
- });
86
- }
87
- else {
88
- await this.commitPort.abortIntentCommit(commit.id, result.failureClass ?? "external_effect_failed");
89
- }
90
- }
91
- return { status: "effect_executed", result, commitId: commit.id };
92
- }
93
- if (intent.effectClass === "memory_curation") {
94
- await this.commitPort.advanceIntentCommitState(commit.id, "dispatched");
95
- await this.memoryPort.persistCurationResult({
96
- summary: intent.summary,
97
- sourceRefs: [decision.traceId],
98
- traceId: decision.traceId,
99
- });
100
- await this.commitPort.commitIntentOutcome(commit.id, {
101
- traceId: decision.traceId,
102
- outcomeRef: "memory_curation",
103
- });
104
- return { status: "curated", commitId: commit.id };
105
- }
106
- if (intent.effectClass === "narrative_reflection") {
107
- await this.commitPort.advanceIntentCommitState(commit.id, "dispatched");
108
- const reflection = await this.reflectionPort.runNarrativeReflection({
109
- decisionId: decision.decisionId,
110
- intentId: decision.intentId,
111
- traceId: decision.traceId,
112
- });
113
- await this.commitPort.commitIntentOutcome(commit.id, {
114
- traceId: decision.traceId,
115
- outcomeRef: reflection.outcomeRef,
116
- });
117
- return { status: "reflected", commitId: commit.id };
118
- }
119
- await this.commitPort.advanceIntentCommitState(commit.id, "dispatched");
120
- await this.commitPort.commitIntentOutcome(commit.id, {
121
- traceId: decision.traceId,
122
- outcomeRef: "maintenance",
123
- });
124
- return { status: "maintenance_done", commitId: commit.id };
125
- }
126
- catch (error) {
127
- await this.commitPort.abortIntentCommit(commit.id, String(error));
128
- throw error;
129
- }
130
- finally {
131
- await lease.release();
132
- }
133
- }
134
- }
135
- export function buildDecisionContext(input) {
136
- const decisionId = input.decisionId ?? crypto.randomUUID();
137
- return {
138
- decisionId,
139
- intentId: input.intentId,
140
- tickId: input.tickId,
141
- checkpointId: `checkpoint:${input.intentId}:${Date.now()}`,
142
- traceId: `trace:${decisionId}`,
143
- };
144
- }
1
+ import * as crypto from "crypto";
2
+ function needsLease(effectClass) {
3
+ return effectClass === "external_platform_action" || effectClass === "connector_action" || effectClass === "user_outreach";
4
+ }
5
+ function needsCheckpoint(effectClass) {
6
+ return effectClass !== "maintenance" && effectClass !== "no_effect";
7
+ }
8
+ function isConnectorEffect(effectClass) {
9
+ return effectClass === "external_platform_action" || effectClass === "connector_action";
10
+ }
11
+ function toCapabilityIntent(intent) {
12
+ if (intent.kind === "work")
13
+ return "work.discover";
14
+ if (intent.kind === "exploration")
15
+ return "feed.read";
16
+ if (intent.kind === "social")
17
+ return "comment.reply";
18
+ if (intent.kind === "outreach")
19
+ return "message.send";
20
+ if (intent.kind === "quiet")
21
+ return "feed.read";
22
+ return "feed.read";
23
+ }
24
+ export class EffectDispatcher {
25
+ leaseManager;
26
+ commitPort;
27
+ connectorExecutor;
28
+ checkpointPort;
29
+ memoryPort;
30
+ reflectionPort;
31
+ constructor(leaseManager, commitPort, connectorExecutor, checkpointPort, memoryPort, reflectionPort) {
32
+ this.leaseManager = leaseManager;
33
+ this.commitPort = commitPort;
34
+ this.connectorExecutor = connectorExecutor;
35
+ this.checkpointPort = checkpointPort;
36
+ this.memoryPort = memoryPort;
37
+ this.reflectionPort = reflectionPort;
38
+ }
39
+ async dispatchEffect(intent, decision) {
40
+ const lease = needsLease(intent.effectClass)
41
+ ? await this.leaseManager.acquire(intent.effectClass, intent.platformId ?? intent.id)
42
+ : await this.leaseManager.acquire("maintenance");
43
+ if (!lease.granted) {
44
+ return { status: "deferred", reason: "lease_unavailable" };
45
+ }
46
+ if (needsCheckpoint(intent.effectClass)) {
47
+ await this.checkpointPort.saveCheckpoint({
48
+ id: decision.checkpointId,
49
+ tickId: decision.tickId,
50
+ intentId: decision.intentId,
51
+ phase: isConnectorEffect(intent.effectClass) ? "before_effect" : "before_quiet_write",
52
+ snapshotRef: decision.traceId,
53
+ });
54
+ }
55
+ const commit = await this.commitPort.createIntentCommitRecord({
56
+ intentId: decision.intentId,
57
+ decisionId: decision.decisionId,
58
+ checkpointId: decision.checkpointId,
59
+ state: "planned",
60
+ });
61
+ try {
62
+ if (isConnectorEffect(intent.effectClass)) {
63
+ await this.commitPort.advanceIntentCommitState(commit.id, "dispatched");
64
+ const result = await this.connectorExecutor.executeEffect({
65
+ platformId: intent.platformId ?? "unknown",
66
+ intent: toCapabilityIntent(intent),
67
+ payload: intent.payload ?? {},
68
+ decisionId: decision.decisionId,
69
+ intentId: decision.intentId,
70
+ idempotencyKey: `idem:${decision.decisionId}:${decision.intentId}`,
71
+ });
72
+ if (result.status === "success") {
73
+ await this.commitPort.advanceIntentCommitState(commit.id, "externally_acknowledged", {
74
+ outcomeRef: result.metadata.platformId,
75
+ });
76
+ await this.commitPort.commitIntentOutcome(commit.id, {
77
+ traceId: decision.traceId,
78
+ outcomeRef: result.metadata.platformId,
79
+ });
80
+ }
81
+ else {
82
+ if (result.status === "retryable_failure") {
83
+ await this.commitPort.advanceIntentCommitState(commit.id, "reconcile", {
84
+ failureClass: result.failureClass,
85
+ });
86
+ }
87
+ else {
88
+ await this.commitPort.abortIntentCommit(commit.id, result.failureClass ?? "external_effect_failed");
89
+ }
90
+ }
91
+ return { status: "effect_executed", result, commitId: commit.id };
92
+ }
93
+ if (intent.effectClass === "memory_curation") {
94
+ await this.commitPort.advanceIntentCommitState(commit.id, "dispatched");
95
+ await this.memoryPort.persistCurationResult({
96
+ summary: intent.summary,
97
+ sourceRefs: [decision.traceId],
98
+ traceId: decision.traceId,
99
+ });
100
+ await this.commitPort.commitIntentOutcome(commit.id, {
101
+ traceId: decision.traceId,
102
+ outcomeRef: "memory_curation",
103
+ });
104
+ return { status: "curated", commitId: commit.id };
105
+ }
106
+ if (intent.effectClass === "narrative_reflection") {
107
+ await this.commitPort.advanceIntentCommitState(commit.id, "dispatched");
108
+ const reflection = await this.reflectionPort.runNarrativeReflection({
109
+ decisionId: decision.decisionId,
110
+ intentId: decision.intentId,
111
+ traceId: decision.traceId,
112
+ });
113
+ await this.commitPort.commitIntentOutcome(commit.id, {
114
+ traceId: decision.traceId,
115
+ outcomeRef: reflection.outcomeRef,
116
+ });
117
+ return { status: "reflected", commitId: commit.id };
118
+ }
119
+ await this.commitPort.advanceIntentCommitState(commit.id, "dispatched");
120
+ await this.commitPort.commitIntentOutcome(commit.id, {
121
+ traceId: decision.traceId,
122
+ outcomeRef: "maintenance",
123
+ });
124
+ return { status: "maintenance_done", commitId: commit.id };
125
+ }
126
+ catch (error) {
127
+ await this.commitPort.abortIntentCommit(commit.id, String(error));
128
+ throw error;
129
+ }
130
+ finally {
131
+ await lease.release();
132
+ }
133
+ }
134
+ }
135
+ export function buildDecisionContext(input) {
136
+ const decisionId = input.decisionId ?? crypto.randomUUID();
137
+ return {
138
+ decisionId,
139
+ intentId: input.intentId,
140
+ tickId: input.tickId,
141
+ checkpointId: `checkpoint:${input.intentId}:${Date.now()}`,
142
+ traceId: `trace:${decisionId}`,
143
+ };
144
+ }
@@ -1,8 +1,8 @@
1
- import type { CandidateIntent, ContinuitySnapshot, GuardEvaluation } from "../types.js";
2
- import type { HeartbeatRuntimeSnapshot } from "../heartbeat/runtime-snapshot.js";
3
- /**
4
- * Hard guard evaluation (T2.1.3): source, dedupe, cooldown, quiet bias, budget, risk, awaiting user.
5
- */
6
- export declare function evaluateHardGuards(intent: CandidateIntent, runtime: HeartbeatRuntimeSnapshot): GuardEvaluation;
7
- /** Continuity-only guard path for legacy call sites; builds a minimal runtime snapshot. */
8
- export declare function evaluateGuards(intent: CandidateIntent, snapshot: ContinuitySnapshot): GuardEvaluation;
1
+ import type { CandidateIntent, ContinuitySnapshot, GuardEvaluation } from "../types.js";
2
+ import type { HeartbeatRuntimeSnapshot } from "../heartbeat/runtime-snapshot.js";
3
+ /**
4
+ * Hard guard evaluation (T2.1.3): source, dedupe, cooldown, quiet bias, budget, risk, awaiting user.
5
+ */
6
+ export declare function evaluateHardGuards(intent: CandidateIntent, runtime: HeartbeatRuntimeSnapshot): GuardEvaluation;
7
+ /** Continuity-only guard path for legacy call sites; builds a minimal runtime snapshot. */
8
+ export declare function evaluateGuards(intent: CandidateIntent, snapshot: ContinuitySnapshot): GuardEvaluation;