@haaaiawd/second-nature 0.1.18 → 0.1.20

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 (190) hide show
  1. package/index.js +911 -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 +224 -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 +67 -58
  24. package/runtime/cli/ops/heartbeat-surface.d.ts +45 -38
  25. package/runtime/cli/ops/heartbeat-surface.js +79 -73
  26. package/runtime/cli/ops/ops-router.d.ts +32 -19
  27. package/runtime/cli/ops/ops-router.js +188 -89
  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 +40 -19
  31. package/runtime/cli/ops/workspace-heartbeat-runner.js +93 -39
  32. package/runtime/cli/read-models/index.d.ts +46 -29
  33. package/runtime/cli/read-models/index.js +391 -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 +129 -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 +162 -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 +47 -47
  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 -20
  114. package/runtime/observability/index.js +19 -19
  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/observability-retention.d.ts +10 -0
  128. package/runtime/observability/services/observability-retention.js +37 -0
  129. package/runtime/observability/services/runtime-decision-recorder.d.ts +29 -29
  130. package/runtime/observability/services/runtime-decision-recorder.js +94 -94
  131. package/runtime/storage/bootstrap/native-sqlite-probe.d.ts +7 -7
  132. package/runtime/storage/bootstrap/native-sqlite-probe.js +28 -28
  133. package/runtime/storage/bootstrap/repair-gate.d.ts +17 -17
  134. package/runtime/storage/bootstrap/repair-gate.js +71 -71
  135. package/runtime/storage/bootstrap/storage-mode-smoke.d.ts +38 -38
  136. package/runtime/storage/bootstrap/storage-mode-smoke.js +85 -85
  137. package/runtime/storage/db/index.js +61 -61
  138. package/runtime/storage/db/schema/delivery-attempts.d.ts +199 -199
  139. package/runtime/storage/db/schema/delivery-attempts.js +13 -13
  140. package/runtime/storage/db/schema/index.d.ts +9 -9
  141. package/runtime/storage/db/schema/index.js +9 -9
  142. package/runtime/storage/db/schema/life-evidence-index.d.ts +161 -161
  143. package/runtime/storage/db/schema/life-evidence-index.js +11 -11
  144. package/runtime/storage/db/schema/operator-fallback-artifacts.d.ts +161 -161
  145. package/runtime/storage/db/schema/operator-fallback-artifacts.js +11 -11
  146. package/runtime/storage/db/schema/policies.d.ts +98 -98
  147. package/runtime/storage/db/schema/policies.js +8 -8
  148. package/runtime/storage/delivery/query-delivery-attempts.d.ts +3 -3
  149. package/runtime/storage/delivery/query-delivery-attempts.js +32 -32
  150. package/runtime/storage/delivery/types.d.ts +27 -27
  151. package/runtime/storage/delivery/types.js +1 -1
  152. package/runtime/storage/delivery/write-delivery-attempt.d.ts +6 -6
  153. package/runtime/storage/delivery/write-delivery-attempt.js +36 -36
  154. package/runtime/storage/fallback/load-operator-fallback.d.ts +14 -14
  155. package/runtime/storage/fallback/load-operator-fallback.js +47 -47
  156. package/runtime/storage/fallback/operator-fallback-types.d.ts +9 -9
  157. package/runtime/storage/fallback/operator-fallback-types.js +1 -1
  158. package/runtime/storage/fallback/operator-fallback-view.d.ts +11 -11
  159. package/runtime/storage/fallback/operator-fallback-view.js +1 -1
  160. package/runtime/storage/fallback/write-operator-fallback.d.ts +6 -6
  161. package/runtime/storage/fallback/write-operator-fallback.js +21 -21
  162. package/runtime/storage/index.d.ts +37 -37
  163. package/runtime/storage/index.js +30 -30
  164. package/runtime/storage/life-evidence/append-life-evidence.d.ts +7 -7
  165. package/runtime/storage/life-evidence/append-life-evidence.js +64 -64
  166. package/runtime/storage/life-evidence/types.d.ts +45 -45
  167. package/runtime/storage/life-evidence/types.js +6 -6
  168. package/runtime/storage/quiet/persist-quiet-artifact.d.ts +7 -7
  169. package/runtime/storage/quiet/persist-quiet-artifact.js +22 -22
  170. package/runtime/storage/quiet/quiet-artifact-types.d.ts +18 -18
  171. package/runtime/storage/quiet/quiet-artifact-types.js +1 -1
  172. package/runtime/storage/quiet/quiet-artifact-writer.d.ts +15 -15
  173. package/runtime/storage/quiet/quiet-artifact-writer.js +56 -56
  174. package/runtime/storage/repositories/credential-repository.js +30 -30
  175. package/runtime/storage/rhythm/rhythm-policy-snapshot.d.ts +10 -10
  176. package/runtime/storage/rhythm/rhythm-policy-snapshot.js +34 -34
  177. package/runtime/storage/services/credential-vault.d.ts +13 -13
  178. package/runtime/storage/services/credential-vault.js +116 -116
  179. package/runtime/storage/snapshots/continuity-snapshot.d.ts +9 -9
  180. package/runtime/storage/snapshots/continuity-snapshot.js +41 -41
  181. package/runtime/storage/snapshots/life-evidence-snapshot.d.ts +6 -6
  182. package/runtime/storage/snapshots/life-evidence-snapshot.js +114 -114
  183. package/runtime/storage/snapshots/types.d.ts +58 -58
  184. package/runtime/storage/snapshots/types.js +1 -1
  185. package/runtime/storage/state-api.js +104 -104
  186. package/runtime/storage/user-interest/load-user-interest-snapshot.d.ts +2 -2
  187. package/runtime/storage/user-interest/load-user-interest-snapshot.js +150 -150
  188. package/runtime/storage/user-interest/types.d.ts +25 -25
  189. package/runtime/storage/user-interest/types.js +1 -1
  190. package/workspace-ops-bridge.js +90 -81
@@ -1,152 +1,152 @@
1
- /**
2
- * T3.3.1 — Near-real connector smoke: sentinel adapters + policy + telemetry + life evidence ingest.
3
- * Uses fixture payloads (no live HTTP); task.claim runs with idempotency key (dry-run style outcome).
4
- */
5
- import { eq } from "drizzle-orm";
6
- import { CapabilityContractRegistry } from "../base/manifest.js";
7
- import { ConnectorRoutePlanner } from "../base/route-planner.js";
8
- import { ChannelHealthStore } from "../base/channel-health.js";
9
- import { createConnectorPolicyLayer } from "../base/policy-layer.js";
10
- import { InMemoryEffectCommitLedger } from "../base/execution-policy.js";
11
- import { mapLifeEvidence } from "../base/map-life-evidence.js";
12
- import { moltbookManifest } from "../social-community/moltbook/manifest.js";
13
- import { evomapManifest } from "../agent-network/evomap/manifest.js";
14
- import { ExecutionTelemetry } from "../../observability/services/execution-telemetry.js";
15
- import { executionAttempts } from "../../observability/db/schema/index.js";
16
- import { appendLifeEvidence } from "../../storage/life-evidence/append-life-evidence.js";
17
- const DECISION_ID = "dec-near-real-smoke";
18
- function smokeRouteContext() {
19
- return {
20
- async loadCredentialState(platformId) {
21
- if (platformId === "moltbook") {
22
- return { platformId, status: "active", credentialType: "api_key" };
23
- }
24
- if (platformId === "evomap") {
25
- return { platformId, status: "active", credentialType: "node_secret" };
26
- }
27
- throw new Error(`near_real_smoke_unsupported_platform:${platformId}`);
28
- },
29
- async loadCooldownState() {
30
- return { blocked: false };
31
- },
32
- };
33
- }
34
- const smokeExecutionRunner = {
35
- async run(plan, request) {
36
- if (plan.platformId === "moltbook" && plan.intent === "feed.read") {
37
- return {
38
- platformId: plan.platformId,
39
- channel: plan.channel,
40
- latencyMs: 2,
41
- success: true,
42
- payload: {
43
- items: [{ id: "mb-smoke-1", title: "near-real fixture post" }],
44
- },
45
- };
46
- }
47
- if (plan.platformId === "evomap" && plan.intent === "work.discover") {
48
- return {
49
- platformId: plan.platformId,
50
- channel: plan.channel,
51
- latencyMs: 3,
52
- success: true,
53
- payload: {
54
- items: [{ id: "ev-task-smoke-1", title: "fixture agent task" }],
55
- },
56
- };
57
- }
58
- if (plan.platformId === "evomap" && plan.intent === "task.claim") {
59
- return {
60
- platformId: plan.platformId,
61
- channel: plan.channel,
62
- latencyMs: 1,
63
- success: true,
64
- degraded: plan.degraded,
65
- payload: {
66
- dryRun: true,
67
- taskId: typeof request.payload.taskId === "string" ? request.payload.taskId : "unknown",
68
- note: "near_real_smoke_no_external_side_effect",
69
- },
70
- };
71
- }
72
- throw new Error(`near_real_smoke_unhandled:${plan.platformId}:${plan.intent}`);
73
- },
74
- };
75
- export async function runNearRealConnectorSmoke(input) {
76
- const ledger = new InMemoryEffectCommitLedger();
77
- const registry = new CapabilityContractRegistry();
78
- registry.register({ ...moltbookManifest });
79
- registry.register({ ...evomapManifest });
80
- const planner = new ConnectorRoutePlanner(registry, smokeRouteContext(), new ChannelHealthStore());
81
- const telemetry = new ExecutionTelemetry(input.observabilityDb);
82
- const policy = createConnectorPolicyLayer({
83
- routePlanner: planner,
84
- executionRunner: smokeExecutionRunner,
85
- telemetry,
86
- effectCommitLedger: ledger,
87
- retryPolicy: { maxRetries: 1, jitter: false },
88
- });
89
- const base = {
90
- decisionId: DECISION_ID,
91
- payload: {},
92
- };
93
- const feedResult = await policy.executeWithPolicy("feed.read", {
94
- platformId: "moltbook",
95
- intent: "feed.read",
96
- ...base,
97
- intentId: "intent-smoke-feed-read",
98
- payload: {},
99
- });
100
- let feedReadEvidenceId;
101
- const feedCand = mapLifeEvidence({
102
- platformId: "moltbook",
103
- intent: "feed.read",
104
- result: feedResult,
105
- });
106
- if (feedCand) {
107
- const ack = await appendLifeEvidence(input.state, input.workspaceRoot, feedCand);
108
- feedReadEvidenceId = ack.evidenceId;
109
- }
110
- const workResult = await policy.executeWithPolicy("work.discover", {
111
- platformId: "evomap",
112
- intent: "work.discover",
113
- ...base,
114
- intentId: "intent-smoke-work-discover",
115
- payload: {},
116
- });
117
- let workDiscoverEvidenceId;
118
- const workCand = mapLifeEvidence({
119
- platformId: "evomap",
120
- intent: "work.discover",
121
- result: workResult,
122
- });
123
- if (workCand) {
124
- const ack = await appendLifeEvidence(input.state, input.workspaceRoot, workCand);
125
- workDiscoverEvidenceId = ack.evidenceId;
126
- }
127
- const claimResult = await policy.executeWithPolicy("task.claim", {
128
- platformId: "evomap",
129
- intent: "task.claim",
130
- ...base,
131
- intentId: "intent-smoke-task-claim",
132
- payload: { taskId: "ev-task-smoke-1" },
133
- idempotencyKey: "idem-near-real-task-claim-smoke",
134
- });
135
- const claimPayload = claimResult.status === "success" && claimResult.data && typeof claimResult.data === "object"
136
- ? claimResult.data
137
- : undefined;
138
- const attemptRows = await input.observabilityDb.db
139
- .select()
140
- .from(executionAttempts)
141
- .where(eq(executionAttempts.decisionId, DECISION_ID));
142
- return {
143
- generatedAt: new Date().toISOString(),
144
- platforms: { social: "moltbook", agentNetwork: "evomap" },
145
- feedReadEvidenceId,
146
- workDiscoverEvidenceId,
147
- taskClaimDryRunOk: claimResult.status === "success" &&
148
- claimPayload?.dryRun === true &&
149
- claimPayload?.note === "near_real_smoke_no_external_side_effect",
150
- executionAttemptRowsForDecision: attemptRows.length,
151
- };
152
- }
1
+ /**
2
+ * T3.3.1 — Near-real connector smoke: sentinel adapters + policy + telemetry + life evidence ingest.
3
+ * Uses fixture payloads (no live HTTP); task.claim runs with idempotency key (dry-run style outcome).
4
+ */
5
+ import { eq } from "drizzle-orm";
6
+ import { CapabilityContractRegistry } from "../base/manifest.js";
7
+ import { ConnectorRoutePlanner } from "../base/route-planner.js";
8
+ import { ChannelHealthStore } from "../base/channel-health.js";
9
+ import { createConnectorPolicyLayer } from "../base/policy-layer.js";
10
+ import { InMemoryEffectCommitLedger } from "../base/execution-policy.js";
11
+ import { mapLifeEvidence } from "../base/map-life-evidence.js";
12
+ import { moltbookManifest } from "../social-community/moltbook/manifest.js";
13
+ import { evomapManifest } from "../agent-network/evomap/manifest.js";
14
+ import { ExecutionTelemetry } from "../../observability/services/execution-telemetry.js";
15
+ import { executionAttempts } from "../../observability/db/schema/index.js";
16
+ import { appendLifeEvidence } from "../../storage/life-evidence/append-life-evidence.js";
17
+ const DECISION_ID = "dec-near-real-smoke";
18
+ function smokeRouteContext() {
19
+ return {
20
+ async loadCredentialState(platformId) {
21
+ if (platformId === "moltbook") {
22
+ return { platformId, status: "active", credentialType: "api_key" };
23
+ }
24
+ if (platformId === "evomap") {
25
+ return { platformId, status: "active", credentialType: "node_secret" };
26
+ }
27
+ throw new Error(`near_real_smoke_unsupported_platform:${platformId}`);
28
+ },
29
+ async loadCooldownState() {
30
+ return { blocked: false };
31
+ },
32
+ };
33
+ }
34
+ const smokeExecutionRunner = {
35
+ async run(plan, request) {
36
+ if (plan.platformId === "moltbook" && plan.intent === "feed.read") {
37
+ return {
38
+ platformId: plan.platformId,
39
+ channel: plan.channel,
40
+ latencyMs: 2,
41
+ success: true,
42
+ payload: {
43
+ items: [{ id: "mb-smoke-1", title: "near-real fixture post" }],
44
+ },
45
+ };
46
+ }
47
+ if (plan.platformId === "evomap" && plan.intent === "work.discover") {
48
+ return {
49
+ platformId: plan.platformId,
50
+ channel: plan.channel,
51
+ latencyMs: 3,
52
+ success: true,
53
+ payload: {
54
+ items: [{ id: "ev-task-smoke-1", title: "fixture agent task" }],
55
+ },
56
+ };
57
+ }
58
+ if (plan.platformId === "evomap" && plan.intent === "task.claim") {
59
+ return {
60
+ platformId: plan.platformId,
61
+ channel: plan.channel,
62
+ latencyMs: 1,
63
+ success: true,
64
+ degraded: plan.degraded,
65
+ payload: {
66
+ dryRun: true,
67
+ taskId: typeof request.payload.taskId === "string" ? request.payload.taskId : "unknown",
68
+ note: "near_real_smoke_no_external_side_effect",
69
+ },
70
+ };
71
+ }
72
+ throw new Error(`near_real_smoke_unhandled:${plan.platformId}:${plan.intent}`);
73
+ },
74
+ };
75
+ export async function runNearRealConnectorSmoke(input) {
76
+ const ledger = new InMemoryEffectCommitLedger();
77
+ const registry = new CapabilityContractRegistry();
78
+ registry.register({ ...moltbookManifest });
79
+ registry.register({ ...evomapManifest });
80
+ const planner = new ConnectorRoutePlanner(registry, smokeRouteContext(), new ChannelHealthStore());
81
+ const telemetry = new ExecutionTelemetry(input.observabilityDb);
82
+ const policy = createConnectorPolicyLayer({
83
+ routePlanner: planner,
84
+ executionRunner: smokeExecutionRunner,
85
+ telemetry,
86
+ effectCommitLedger: ledger,
87
+ retryPolicy: { maxRetries: 1, jitter: false },
88
+ });
89
+ const base = {
90
+ decisionId: DECISION_ID,
91
+ payload: {},
92
+ };
93
+ const feedResult = await policy.executeWithPolicy("feed.read", {
94
+ platformId: "moltbook",
95
+ intent: "feed.read",
96
+ ...base,
97
+ intentId: "intent-smoke-feed-read",
98
+ payload: {},
99
+ });
100
+ let feedReadEvidenceId;
101
+ const feedCand = mapLifeEvidence({
102
+ platformId: "moltbook",
103
+ intent: "feed.read",
104
+ result: feedResult,
105
+ });
106
+ if (feedCand) {
107
+ const ack = await appendLifeEvidence(input.state, input.workspaceRoot, feedCand);
108
+ feedReadEvidenceId = ack.evidenceId;
109
+ }
110
+ const workResult = await policy.executeWithPolicy("work.discover", {
111
+ platformId: "evomap",
112
+ intent: "work.discover",
113
+ ...base,
114
+ intentId: "intent-smoke-work-discover",
115
+ payload: {},
116
+ });
117
+ let workDiscoverEvidenceId;
118
+ const workCand = mapLifeEvidence({
119
+ platformId: "evomap",
120
+ intent: "work.discover",
121
+ result: workResult,
122
+ });
123
+ if (workCand) {
124
+ const ack = await appendLifeEvidence(input.state, input.workspaceRoot, workCand);
125
+ workDiscoverEvidenceId = ack.evidenceId;
126
+ }
127
+ const claimResult = await policy.executeWithPolicy("task.claim", {
128
+ platformId: "evomap",
129
+ intent: "task.claim",
130
+ ...base,
131
+ intentId: "intent-smoke-task-claim",
132
+ payload: { taskId: "ev-task-smoke-1" },
133
+ idempotencyKey: "idem-near-real-task-claim-smoke",
134
+ });
135
+ const claimPayload = claimResult.status === "success" && claimResult.data && typeof claimResult.data === "object"
136
+ ? claimResult.data
137
+ : undefined;
138
+ const attemptRows = await input.observabilityDb.db
139
+ .select()
140
+ .from(executionAttempts)
141
+ .where(eq(executionAttempts.decisionId, DECISION_ID));
142
+ return {
143
+ generatedAt: new Date().toISOString(),
144
+ platforms: { social: "moltbook", agentNetwork: "evomap" },
145
+ feedReadEvidenceId,
146
+ workDiscoverEvidenceId,
147
+ taskClaimDryRunOk: claimResult.status === "success" &&
148
+ claimPayload?.dryRun === true &&
149
+ claimPayload?.note === "near_real_smoke_no_external_side_effect",
150
+ executionAttemptRowsForDecision: attemptRows.length,
151
+ };
152
+ }
@@ -1,114 +1,114 @@
1
- import { EffectDispatcher, buildDecisionContext } from "../orchestrator/effect-dispatcher.js";
2
- /**
3
- * Map an intent kind to its guidance scene type.
4
- * Only generative scenes (social, outreach, explain) request guidance.
5
- * Maintenance, reflection, and work do not request guidance.
6
- */
7
- function intentKindToScene(kind) {
8
- switch (kind) {
9
- case "social":
10
- return "social";
11
- case "outreach":
12
- return "outreach";
13
- case "exploration":
14
- return "explain";
15
- case "quiet":
16
- return null;
17
- default:
18
- return null;
19
- }
20
- }
21
- /**
22
- * Build a scene context from an allowed intent and runtime mode.
23
- *
24
- * Mode comes from the actual runtime context (active/quiet/maintenance_only/paused_for_interrupt),
25
- * not hardcoded.
26
- */
27
- function buildSceneContext(intent, mode) {
28
- return {
29
- sceneType: intentKindToScene(intent.kind) ?? "explain",
30
- mode,
31
- sceneSummary: intent.summary,
32
- };
33
- }
34
- /**
35
- * Request guidance for a selected intent.
36
- *
37
- * Guidance is only requested when:
38
- * - The intent kind maps to a generative scene (social, outreach, explain)
39
- * - Maintenance, reflection, and work do not request guidance
40
- *
41
- * The guidance payload is used for context assembly within control-plane.
42
- * It does NOT cross the connector execution boundary.
43
- */
44
- export async function requestGuidanceForIntent(intent, mode, deps) {
45
- const sceneType = intentKindToScene(intent.kind);
46
- if (!sceneType) {
47
- // Non-generative intents don't request guidance
48
- return { intent };
49
- }
50
- const sceneContext = buildSceneContext(intent, mode);
51
- const guidanceResult = await deps.requestGuidance({ sceneContext });
52
- const appliedContext = deps.applyGuidance(guidanceResult.guidance);
53
- return {
54
- intent,
55
- guidanceResult,
56
- appliedContext,
57
- };
58
- }
59
- /**
60
- * Dispatch effects for an allowed intent.
61
- *
62
- * This function enforces the allow-only boundary:
63
- * - Only called when guard verdict is "allow"
64
- * - Creates a decision context and dispatches through EffectDispatcher
65
- * - Guidance context stays within control-plane and is NOT passed to connector executor
66
- *
67
- * The connector executor receives the original intent payload without any
68
- * guidance-derived fields. Guidance participates in control-plane context
69
- * assembly but does not leak into the connector execution boundary.
70
- */
71
- export async function dispatchAllowedEffect(intent, deps) {
72
- const dispatcher = new EffectDispatcher(deps.leaseManager, deps.commitPort, deps.connectorExecutor, deps.checkpointPort, deps.memoryPort, deps.reflectionPort);
73
- const decisionContext = buildDecisionContext({
74
- tickId: `tick:${Date.now()}`,
75
- intentId: intent.id,
76
- });
77
- // Dispatch with the original intent payload.
78
- // Guidance context (if any) remains within control-plane boundary
79
- // and is NOT embedded in the connector payload.
80
- return dispatcher.dispatchEffect(intent, decisionContext);
81
- }
82
- /**
83
- * Full heartbeat execution: guidance bridge + allow-only effect dispatch.
84
- *
85
- * Flow:
86
- * 1. Check guard verdict — non-allow paths skip guidance entirely
87
- * 2. For allow verdict: request guidance (if generative scene), then dispatch effect
88
- * 3. Return execution result with guidance and dispatch info
89
- *
90
- * Per T2.2.2 boundaries:
91
- * - Guidance is NOT requested for deny/defer verdicts
92
- * - Guidance payload does NOT cross into connector execution boundary
93
- * - External effects only occur under allow verdict
94
- */
95
- export async function executeHeartbeatCycle(intent, guardVerdict, mode, deps) {
96
- // Non-allow verdicts: skip guidance entirely, no effect dispatch
97
- if (guardVerdict !== "allow") {
98
- return {
99
- decisionId: `decision:${intent.id}:${Date.now()}`,
100
- intentId: intent.id,
101
- guardVerdict,
102
- };
103
- }
104
- // Allow verdict: request guidance for generative scenes, then dispatch
105
- const guidance = await requestGuidanceForIntent(intent, mode, deps.guidance);
106
- const dispatch = await dispatchAllowedEffect(intent, deps.effects);
107
- return {
108
- decisionId: `decision:${intent.id}:${Date.now()}`,
109
- intentId: intent.id,
110
- guardVerdict,
111
- guidance,
112
- dispatch,
113
- };
114
- }
1
+ import { EffectDispatcher, buildDecisionContext } from "../orchestrator/effect-dispatcher.js";
2
+ /**
3
+ * Map an intent kind to its guidance scene type.
4
+ * Only generative scenes (social, outreach, explain) request guidance.
5
+ * Maintenance, reflection, and work do not request guidance.
6
+ */
7
+ function intentKindToScene(kind) {
8
+ switch (kind) {
9
+ case "social":
10
+ return "social";
11
+ case "outreach":
12
+ return "outreach";
13
+ case "exploration":
14
+ return "explain";
15
+ case "quiet":
16
+ return null;
17
+ default:
18
+ return null;
19
+ }
20
+ }
21
+ /**
22
+ * Build a scene context from an allowed intent and runtime mode.
23
+ *
24
+ * Mode comes from the actual runtime context (active/quiet/maintenance_only/paused_for_interrupt),
25
+ * not hardcoded.
26
+ */
27
+ function buildSceneContext(intent, mode) {
28
+ return {
29
+ sceneType: intentKindToScene(intent.kind) ?? "explain",
30
+ mode,
31
+ sceneSummary: intent.summary,
32
+ };
33
+ }
34
+ /**
35
+ * Request guidance for a selected intent.
36
+ *
37
+ * Guidance is only requested when:
38
+ * - The intent kind maps to a generative scene (social, outreach, explain)
39
+ * - Maintenance, reflection, and work do not request guidance
40
+ *
41
+ * The guidance payload is used for context assembly within control-plane.
42
+ * It does NOT cross the connector execution boundary.
43
+ */
44
+ export async function requestGuidanceForIntent(intent, mode, deps) {
45
+ const sceneType = intentKindToScene(intent.kind);
46
+ if (!sceneType) {
47
+ // Non-generative intents don't request guidance
48
+ return { intent };
49
+ }
50
+ const sceneContext = buildSceneContext(intent, mode);
51
+ const guidanceResult = await deps.requestGuidance({ sceneContext });
52
+ const appliedContext = deps.applyGuidance(guidanceResult.guidance);
53
+ return {
54
+ intent,
55
+ guidanceResult,
56
+ appliedContext,
57
+ };
58
+ }
59
+ /**
60
+ * Dispatch effects for an allowed intent.
61
+ *
62
+ * This function enforces the allow-only boundary:
63
+ * - Only called when guard verdict is "allow"
64
+ * - Creates a decision context and dispatches through EffectDispatcher
65
+ * - Guidance context stays within control-plane and is NOT passed to connector executor
66
+ *
67
+ * The connector executor receives the original intent payload without any
68
+ * guidance-derived fields. Guidance participates in control-plane context
69
+ * assembly but does not leak into the connector execution boundary.
70
+ */
71
+ export async function dispatchAllowedEffect(intent, deps) {
72
+ const dispatcher = new EffectDispatcher(deps.leaseManager, deps.commitPort, deps.connectorExecutor, deps.checkpointPort, deps.memoryPort, deps.reflectionPort);
73
+ const decisionContext = buildDecisionContext({
74
+ tickId: `tick:${Date.now()}`,
75
+ intentId: intent.id,
76
+ });
77
+ // Dispatch with the original intent payload.
78
+ // Guidance context (if any) remains within control-plane boundary
79
+ // and is NOT embedded in the connector payload.
80
+ return dispatcher.dispatchEffect(intent, decisionContext);
81
+ }
82
+ /**
83
+ * Full heartbeat execution: guidance bridge + allow-only effect dispatch.
84
+ *
85
+ * Flow:
86
+ * 1. Check guard verdict — non-allow paths skip guidance entirely
87
+ * 2. For allow verdict: request guidance (if generative scene), then dispatch effect
88
+ * 3. Return execution result with guidance and dispatch info
89
+ *
90
+ * Per T2.2.2 boundaries:
91
+ * - Guidance is NOT requested for deny/defer verdicts
92
+ * - Guidance payload does NOT cross into connector execution boundary
93
+ * - External effects only occur under allow verdict
94
+ */
95
+ export async function executeHeartbeatCycle(intent, guardVerdict, mode, deps) {
96
+ // Non-allow verdicts: skip guidance entirely, no effect dispatch
97
+ if (guardVerdict !== "allow") {
98
+ return {
99
+ decisionId: `decision:${intent.id}:${Date.now()}`,
100
+ intentId: intent.id,
101
+ guardVerdict,
102
+ };
103
+ }
104
+ // Allow verdict: request guidance for generative scenes, then dispatch
105
+ const guidance = await requestGuidanceForIntent(intent, mode, deps.guidance);
106
+ const dispatch = await dispatchAllowedEffect(intent, deps.effects);
107
+ return {
108
+ decisionId: `decision:${intent.id}:${Date.now()}`,
109
+ intentId: intent.id,
110
+ guardVerdict,
111
+ guidance,
112
+ dispatch,
113
+ };
114
+ }