@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.
- package/index.js +911 -855
- package/openclaw.plugin.json +29 -29
- package/package.json +52 -52
- package/runtime/cli/commands/index.d.ts +14 -14
- package/runtime/cli/commands/index.js +224 -193
- package/runtime/cli/explain/explain-surface-subject.d.ts +8 -8
- package/runtime/cli/explain/explain-surface-subject.js +9 -9
- package/runtime/cli/explain/format-explanation.d.ts +12 -12
- package/runtime/cli/explain/format-explanation.js +12 -12
- package/runtime/cli/explain/resolve-subject.js +41 -41
- package/runtime/cli/host-capability/classify-delivery.d.ts +14 -14
- package/runtime/cli/host-capability/classify-delivery.js +20 -20
- package/runtime/cli/host-capability/probe-host-capability.d.ts +2 -2
- package/runtime/cli/host-capability/probe-host-capability.js +58 -58
- package/runtime/cli/host-capability/record-host-capability.d.ts +6 -6
- package/runtime/cli/host-capability/record-host-capability.js +14 -14
- package/runtime/cli/host-capability/types.d.ts +71 -71
- package/runtime/cli/host-capability/types.js +6 -6
- package/runtime/cli/host-smoke/run-host-smoke.d.ts +2 -2
- package/runtime/cli/host-smoke/run-host-smoke.js +40 -40
- package/runtime/cli/host-smoke/types.d.ts +35 -35
- package/runtime/cli/host-smoke/types.js +6 -6
- package/runtime/cli/index.js +67 -58
- package/runtime/cli/ops/heartbeat-surface.d.ts +45 -38
- package/runtime/cli/ops/heartbeat-surface.js +79 -73
- package/runtime/cli/ops/ops-router.d.ts +32 -19
- package/runtime/cli/ops/ops-router.js +188 -89
- package/runtime/cli/ops/show-operator-fallback.d.ts +13 -13
- package/runtime/cli/ops/show-operator-fallback.js +22 -22
- package/runtime/cli/ops/workspace-heartbeat-runner.d.ts +40 -19
- package/runtime/cli/ops/workspace-heartbeat-runner.js +93 -39
- package/runtime/cli/read-models/index.d.ts +46 -29
- package/runtime/cli/read-models/index.js +391 -256
- package/runtime/cli/read-models/operator-explain-map.d.ts +6 -6
- package/runtime/cli/read-models/operator-explain-map.js +10 -10
- package/runtime/cli/read-models/types.d.ts +129 -79
- package/runtime/cli/runtime/runtime-artifact-boundary.d.ts +28 -28
- package/runtime/cli/runtime/runtime-artifact-boundary.js +94 -94
- package/runtime/connectors/base/contract.d.ts +87 -87
- package/runtime/connectors/base/execution-policy.d.ts +47 -47
- package/runtime/connectors/base/execution-policy.js +82 -82
- package/runtime/connectors/base/index.d.ts +8 -8
- package/runtime/connectors/base/index.js +8 -8
- package/runtime/connectors/base/manifest.d.ts +64 -64
- package/runtime/connectors/base/manifest.js +86 -86
- package/runtime/connectors/base/map-life-evidence.d.ts +16 -16
- package/runtime/connectors/base/map-life-evidence.js +79 -79
- package/runtime/connectors/base/policy-layer.d.ts +29 -29
- package/runtime/connectors/base/policy-layer.js +198 -198
- package/runtime/connectors/base/route-planner.js +99 -99
- package/runtime/connectors/index.d.ts +5 -5
- package/runtime/connectors/index.js +5 -5
- package/runtime/connectors/near-real/near-real-connector-smoke.d.ts +19 -19
- package/runtime/connectors/near-real/near-real-connector-smoke.js +152 -152
- package/runtime/core/second-nature/heartbeat/heartbeat-executor.js +114 -114
- package/runtime/core/second-nature/heartbeat/heartbeat-loop.d.ts +63 -63
- package/runtime/core/second-nature/heartbeat/heartbeat-loop.js +162 -139
- package/runtime/core/second-nature/heartbeat/index.d.ts +8 -8
- package/runtime/core/second-nature/heartbeat/index.js +7 -7
- package/runtime/core/second-nature/heartbeat/run-heartbeat-cycle.d.ts +21 -21
- package/runtime/core/second-nature/heartbeat/run-heartbeat-cycle.js +35 -35
- package/runtime/core/second-nature/heartbeat/runtime-snapshot.d.ts +28 -28
- package/runtime/core/second-nature/heartbeat/runtime-snapshot.js +35 -35
- package/runtime/core/second-nature/heartbeat/signal.d.ts +42 -42
- package/runtime/core/second-nature/heartbeat/snapshot-builder.d.ts +51 -51
- package/runtime/core/second-nature/index.d.ts +22 -22
- package/runtime/core/second-nature/index.js +22 -22
- package/runtime/core/second-nature/orchestrator/effect-dispatcher.d.ts +100 -100
- package/runtime/core/second-nature/orchestrator/effect-dispatcher.js +144 -144
- package/runtime/core/second-nature/orchestrator/guard-layer.d.ts +8 -8
- package/runtime/core/second-nature/orchestrator/guard-layer.js +110 -110
- package/runtime/core/second-nature/orchestrator/intent-planner.d.ts +13 -13
- package/runtime/core/second-nature/orchestrator/intent-planner.js +199 -199
- package/runtime/core/second-nature/orchestrator/lease-manager.d.ts +14 -14
- package/runtime/core/second-nature/orchestrator/lease-manager.js +58 -58
- package/runtime/core/second-nature/outreach/build-outreach-draft-request.d.ts +6 -6
- package/runtime/core/second-nature/outreach/build-outreach-draft-request.js +63 -63
- package/runtime/core/second-nature/outreach/delivery-target.d.ts +26 -26
- package/runtime/core/second-nature/outreach/delivery-target.js +70 -70
- package/runtime/core/second-nature/outreach/dispatch-user-outreach.d.ts +38 -38
- package/runtime/core/second-nature/outreach/dispatch-user-outreach.js +119 -119
- package/runtime/core/second-nature/outreach/judge-input-from-snapshot.d.ts +7 -7
- package/runtime/core/second-nature/outreach/judge-input-from-snapshot.js +45 -45
- package/runtime/core/second-nature/outreach/judge-outreach.d.ts +40 -40
- package/runtime/core/second-nature/outreach/judge-outreach.js +121 -121
- package/runtime/core/second-nature/quiet/run-source-backed-quiet.d.ts +21 -21
- package/runtime/core/second-nature/quiet/run-source-backed-quiet.js +123 -123
- package/runtime/core/second-nature/rhythm/planner-rhythm-window.d.ts +15 -15
- package/runtime/core/second-nature/rhythm/planner-rhythm-window.js +52 -52
- package/runtime/core/second-nature/rhythm/policy-bridge.d.ts +19 -19
- package/runtime/core/second-nature/rhythm/policy-bridge.js +34 -34
- package/runtime/core/second-nature/runtime/service-entry.js +45 -45
- package/runtime/core/second-nature/types.d.ts +51 -51
- package/runtime/guidance/draft-outreach-message.d.ts +7 -7
- package/runtime/guidance/draft-outreach-message.js +42 -42
- package/runtime/guidance/evidence-guidance.d.ts +40 -40
- package/runtime/guidance/evidence-guidance.js +52 -52
- package/runtime/guidance/index.d.ts +11 -11
- package/runtime/guidance/index.js +11 -11
- package/runtime/guidance/outreach-draft-schema.d.ts +228 -228
- package/runtime/guidance/outreach-draft-schema.js +80 -80
- package/runtime/observability/audit/append-only-audit-store.d.ts +14 -14
- package/runtime/observability/audit/append-only-audit-store.js +21 -21
- package/runtime/observability/audit/audit-envelope.d.ts +51 -51
- package/runtime/observability/audit/audit-envelope.js +130 -130
- package/runtime/observability/audit/verify-audit-hash-chain.d.ts +23 -23
- package/runtime/observability/audit/verify-audit-hash-chain.js +83 -83
- package/runtime/observability/db/index.js +47 -47
- package/runtime/observability/db/schema/host-capability-reports.d.ts +180 -180
- package/runtime/observability/db/schema/host-capability-reports.js +12 -12
- package/runtime/observability/db/schema/index.d.ts +947 -947
- package/runtime/observability/db/schema/index.js +71 -71
- package/runtime/observability/index.d.ts +20 -20
- package/runtime/observability/index.js +19 -19
- package/runtime/observability/query/explain-query.d.ts +48 -48
- package/runtime/observability/query/explain-query.js +114 -114
- package/runtime/observability/query/export-audit-bundle.d.ts +22 -22
- package/runtime/observability/query/export-audit-bundle.js +27 -27
- package/runtime/observability/services/decision-ledger.d.ts +46 -46
- package/runtime/observability/services/decision-ledger.js +161 -161
- package/runtime/observability/services/governance-audit.d.ts +41 -41
- package/runtime/observability/services/governance-audit.js +163 -163
- package/runtime/observability/services/governance-plane-recorder.d.ts +47 -47
- package/runtime/observability/services/governance-plane-recorder.js +55 -55
- package/runtime/observability/services/lived-experience-audit.d.ts +97 -97
- package/runtime/observability/services/lived-experience-audit.js +162 -162
- package/runtime/observability/services/observability-retention.d.ts +10 -0
- package/runtime/observability/services/observability-retention.js +37 -0
- package/runtime/observability/services/runtime-decision-recorder.d.ts +29 -29
- package/runtime/observability/services/runtime-decision-recorder.js +94 -94
- package/runtime/storage/bootstrap/native-sqlite-probe.d.ts +7 -7
- package/runtime/storage/bootstrap/native-sqlite-probe.js +28 -28
- package/runtime/storage/bootstrap/repair-gate.d.ts +17 -17
- package/runtime/storage/bootstrap/repair-gate.js +71 -71
- package/runtime/storage/bootstrap/storage-mode-smoke.d.ts +38 -38
- package/runtime/storage/bootstrap/storage-mode-smoke.js +85 -85
- package/runtime/storage/db/index.js +61 -61
- package/runtime/storage/db/schema/delivery-attempts.d.ts +199 -199
- package/runtime/storage/db/schema/delivery-attempts.js +13 -13
- package/runtime/storage/db/schema/index.d.ts +9 -9
- package/runtime/storage/db/schema/index.js +9 -9
- package/runtime/storage/db/schema/life-evidence-index.d.ts +161 -161
- package/runtime/storage/db/schema/life-evidence-index.js +11 -11
- package/runtime/storage/db/schema/operator-fallback-artifacts.d.ts +161 -161
- package/runtime/storage/db/schema/operator-fallback-artifacts.js +11 -11
- package/runtime/storage/db/schema/policies.d.ts +98 -98
- package/runtime/storage/db/schema/policies.js +8 -8
- package/runtime/storage/delivery/query-delivery-attempts.d.ts +3 -3
- package/runtime/storage/delivery/query-delivery-attempts.js +32 -32
- package/runtime/storage/delivery/types.d.ts +27 -27
- package/runtime/storage/delivery/types.js +1 -1
- package/runtime/storage/delivery/write-delivery-attempt.d.ts +6 -6
- package/runtime/storage/delivery/write-delivery-attempt.js +36 -36
- package/runtime/storage/fallback/load-operator-fallback.d.ts +14 -14
- package/runtime/storage/fallback/load-operator-fallback.js +47 -47
- package/runtime/storage/fallback/operator-fallback-types.d.ts +9 -9
- package/runtime/storage/fallback/operator-fallback-types.js +1 -1
- package/runtime/storage/fallback/operator-fallback-view.d.ts +11 -11
- package/runtime/storage/fallback/operator-fallback-view.js +1 -1
- package/runtime/storage/fallback/write-operator-fallback.d.ts +6 -6
- package/runtime/storage/fallback/write-operator-fallback.js +21 -21
- package/runtime/storage/index.d.ts +37 -37
- package/runtime/storage/index.js +30 -30
- package/runtime/storage/life-evidence/append-life-evidence.d.ts +7 -7
- package/runtime/storage/life-evidence/append-life-evidence.js +64 -64
- package/runtime/storage/life-evidence/types.d.ts +45 -45
- package/runtime/storage/life-evidence/types.js +6 -6
- package/runtime/storage/quiet/persist-quiet-artifact.d.ts +7 -7
- package/runtime/storage/quiet/persist-quiet-artifact.js +22 -22
- package/runtime/storage/quiet/quiet-artifact-types.d.ts +18 -18
- package/runtime/storage/quiet/quiet-artifact-types.js +1 -1
- package/runtime/storage/quiet/quiet-artifact-writer.d.ts +15 -15
- package/runtime/storage/quiet/quiet-artifact-writer.js +56 -56
- package/runtime/storage/repositories/credential-repository.js +30 -30
- package/runtime/storage/rhythm/rhythm-policy-snapshot.d.ts +10 -10
- package/runtime/storage/rhythm/rhythm-policy-snapshot.js +34 -34
- package/runtime/storage/services/credential-vault.d.ts +13 -13
- package/runtime/storage/services/credential-vault.js +116 -116
- package/runtime/storage/snapshots/continuity-snapshot.d.ts +9 -9
- package/runtime/storage/snapshots/continuity-snapshot.js +41 -41
- package/runtime/storage/snapshots/life-evidence-snapshot.d.ts +6 -6
- package/runtime/storage/snapshots/life-evidence-snapshot.js +114 -114
- package/runtime/storage/snapshots/types.d.ts +58 -58
- package/runtime/storage/snapshots/types.js +1 -1
- package/runtime/storage/state-api.js +104 -104
- package/runtime/storage/user-interest/load-user-interest-snapshot.d.ts +2 -2
- package/runtime/storage/user-interest/load-user-interest-snapshot.js +150 -150
- package/runtime/storage/user-interest/types.d.ts +25 -25
- package/runtime/storage/user-interest/types.js +1 -1
- 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
|
+
}
|