@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.
- package/index.js +855 -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 +193 -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 +58 -54
- package/runtime/cli/ops/heartbeat-surface.d.ts +38 -35
- package/runtime/cli/ops/heartbeat-surface.js +73 -71
- package/runtime/cli/ops/ops-router.d.ts +19 -16
- package/runtime/cli/ops/ops-router.js +89 -87
- 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 +19 -10
- package/runtime/cli/ops/workspace-heartbeat-runner.js +39 -26
- package/runtime/cli/read-models/index.d.ts +29 -29
- package/runtime/cli/read-models/index.js +256 -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 +79 -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 +139 -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 +124 -124
- 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 -19
- package/runtime/observability/index.js +19 -18
- 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/runtime-decision-recorder.d.ts +29 -0
- package/runtime/observability/services/runtime-decision-recorder.js +94 -0
- 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 +154 -154
- 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 +81 -80
|
@@ -1,47 +1,47 @@
|
|
|
1
|
-
import type { CapabilityIntent, ConnectorRequest, ExecutionPlan } from "./contract.js";
|
|
2
|
-
export type EffectSemanticsClass = "read_only" | "side_effect" | "task_claim" | "keepalive";
|
|
3
|
-
export declare function classifyConnectorIntentEffect(intent: CapabilityIntent): EffectSemanticsClass;
|
|
4
|
-
export interface EffectCommitLedgerPort {
|
|
5
|
-
getOrCreateIntentCommitRecord(input: {
|
|
6
|
-
decisionId: string;
|
|
7
|
-
intentId: string;
|
|
8
|
-
idempotencyKey: string;
|
|
9
|
-
effectClass: string;
|
|
10
|
-
}): Promise<{
|
|
11
|
-
existing: boolean;
|
|
12
|
-
record: {
|
|
13
|
-
id: string;
|
|
14
|
-
state: string;
|
|
15
|
-
outcomeRef?: string;
|
|
16
|
-
};
|
|
17
|
-
}>;
|
|
18
|
-
}
|
|
19
|
-
/** In-memory ledger for tests and offline harnesses. */
|
|
20
|
-
export declare class InMemoryEffectCommitLedger implements EffectCommitLedgerPort {
|
|
21
|
-
private readonly byKey;
|
|
22
|
-
private key;
|
|
23
|
-
getOrCreateIntentCommitRecord(input: {
|
|
24
|
-
decisionId: string;
|
|
25
|
-
intentId: string;
|
|
26
|
-
idempotencyKey: string;
|
|
27
|
-
effectClass: string;
|
|
28
|
-
}): Promise<{
|
|
29
|
-
existing: boolean;
|
|
30
|
-
record: {
|
|
31
|
-
id: string;
|
|
32
|
-
state: string;
|
|
33
|
-
outcomeRef?: string;
|
|
34
|
-
};
|
|
35
|
-
}>;
|
|
36
|
-
/** Test seam: mark a key as already committed with replayable outcome. */
|
|
37
|
-
seedCommitted(decisionId: string, idempotencyKey: string, outcomeRef: string): void;
|
|
38
|
-
markState(decisionId: string, idempotencyKey: string, state: string): void;
|
|
39
|
-
}
|
|
40
|
-
export interface EnforceExecutionPolicyDeps {
|
|
41
|
-
effectCommitLedger?: EffectCommitLedgerPort;
|
|
42
|
-
}
|
|
43
|
-
export declare function enforceExecutionPolicy(plan: ExecutionPlan, intent: CapabilityIntent, request: ConnectorRequest, deps: EnforceExecutionPolicyDeps): Promise<{
|
|
44
|
-
skipAdapter: boolean;
|
|
45
|
-
existingOutcomeRef?: string;
|
|
46
|
-
effectCommitId?: string;
|
|
47
|
-
}>;
|
|
1
|
+
import type { CapabilityIntent, ConnectorRequest, ExecutionPlan } from "./contract.js";
|
|
2
|
+
export type EffectSemanticsClass = "read_only" | "side_effect" | "task_claim" | "keepalive";
|
|
3
|
+
export declare function classifyConnectorIntentEffect(intent: CapabilityIntent): EffectSemanticsClass;
|
|
4
|
+
export interface EffectCommitLedgerPort {
|
|
5
|
+
getOrCreateIntentCommitRecord(input: {
|
|
6
|
+
decisionId: string;
|
|
7
|
+
intentId: string;
|
|
8
|
+
idempotencyKey: string;
|
|
9
|
+
effectClass: string;
|
|
10
|
+
}): Promise<{
|
|
11
|
+
existing: boolean;
|
|
12
|
+
record: {
|
|
13
|
+
id: string;
|
|
14
|
+
state: string;
|
|
15
|
+
outcomeRef?: string;
|
|
16
|
+
};
|
|
17
|
+
}>;
|
|
18
|
+
}
|
|
19
|
+
/** In-memory ledger for tests and offline harnesses. */
|
|
20
|
+
export declare class InMemoryEffectCommitLedger implements EffectCommitLedgerPort {
|
|
21
|
+
private readonly byKey;
|
|
22
|
+
private key;
|
|
23
|
+
getOrCreateIntentCommitRecord(input: {
|
|
24
|
+
decisionId: string;
|
|
25
|
+
intentId: string;
|
|
26
|
+
idempotencyKey: string;
|
|
27
|
+
effectClass: string;
|
|
28
|
+
}): Promise<{
|
|
29
|
+
existing: boolean;
|
|
30
|
+
record: {
|
|
31
|
+
id: string;
|
|
32
|
+
state: string;
|
|
33
|
+
outcomeRef?: string;
|
|
34
|
+
};
|
|
35
|
+
}>;
|
|
36
|
+
/** Test seam: mark a key as already committed with replayable outcome. */
|
|
37
|
+
seedCommitted(decisionId: string, idempotencyKey: string, outcomeRef: string): void;
|
|
38
|
+
markState(decisionId: string, idempotencyKey: string, state: string): void;
|
|
39
|
+
}
|
|
40
|
+
export interface EnforceExecutionPolicyDeps {
|
|
41
|
+
effectCommitLedger?: EffectCommitLedgerPort;
|
|
42
|
+
}
|
|
43
|
+
export declare function enforceExecutionPolicy(plan: ExecutionPlan, intent: CapabilityIntent, request: ConnectorRequest, deps: EnforceExecutionPolicyDeps): Promise<{
|
|
44
|
+
skipAdapter: boolean;
|
|
45
|
+
existingOutcomeRef?: string;
|
|
46
|
+
effectCommitId?: string;
|
|
47
|
+
}>;
|
|
@@ -1,82 +1,82 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Side-effect idempotency + degraded-channel gate + effect commit replay (T3.2.1).
|
|
3
|
-
* Aligns with connector-system.detail §3.6 enforceExecutionPolicy.
|
|
4
|
-
*/
|
|
5
|
-
import * as crypto from "node:crypto";
|
|
6
|
-
import { ConnectorPolicyError } from "./failure-taxonomy.js";
|
|
7
|
-
const READONLY = new Set([
|
|
8
|
-
"feed.read",
|
|
9
|
-
"notification.list",
|
|
10
|
-
"work.discover",
|
|
11
|
-
]);
|
|
12
|
-
export function classifyConnectorIntentEffect(intent) {
|
|
13
|
-
if (intent === "agent.heartbeat")
|
|
14
|
-
return "keepalive";
|
|
15
|
-
if (intent === "task.claim")
|
|
16
|
-
return "task_claim";
|
|
17
|
-
if (READONLY.has(intent))
|
|
18
|
-
return "read_only";
|
|
19
|
-
return "side_effect";
|
|
20
|
-
}
|
|
21
|
-
/** In-memory ledger for tests and offline harnesses. */
|
|
22
|
-
export class InMemoryEffectCommitLedger {
|
|
23
|
-
byKey = new Map();
|
|
24
|
-
key(decisionId, idempotencyKey) {
|
|
25
|
-
return `${decisionId}::${idempotencyKey}`;
|
|
26
|
-
}
|
|
27
|
-
async getOrCreateIntentCommitRecord(input) {
|
|
28
|
-
const k = this.key(input.decisionId, input.idempotencyKey);
|
|
29
|
-
const hit = this.byKey.get(k);
|
|
30
|
-
if (hit) {
|
|
31
|
-
return { existing: true, record: hit };
|
|
32
|
-
}
|
|
33
|
-
const id = crypto.randomUUID();
|
|
34
|
-
const rec = { id, state: "planned", outcomeRef: undefined };
|
|
35
|
-
this.byKey.set(k, rec);
|
|
36
|
-
return { existing: false, record: rec };
|
|
37
|
-
}
|
|
38
|
-
/** Test seam: mark a key as already committed with replayable outcome. */
|
|
39
|
-
seedCommitted(decisionId, idempotencyKey, outcomeRef) {
|
|
40
|
-
const id = crypto.randomUUID();
|
|
41
|
-
this.byKey.set(this.key(decisionId, idempotencyKey), { id, state: "committed", outcomeRef });
|
|
42
|
-
}
|
|
43
|
-
markState(decisionId, idempotencyKey, state) {
|
|
44
|
-
const k = this.key(decisionId, idempotencyKey);
|
|
45
|
-
const cur = this.byKey.get(k);
|
|
46
|
-
if (!cur)
|
|
47
|
-
throw new Error("ledger_seed_missing");
|
|
48
|
-
this.byKey.set(k, { ...cur, state });
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
export async function enforceExecutionPolicy(plan, intent, request, deps) {
|
|
52
|
-
const semantics = classifyConnectorIntentEffect(intent);
|
|
53
|
-
if ((semantics === "side_effect" || semantics === "task_claim") && !plan.idempotencyKey?.trim()) {
|
|
54
|
-
throw new ConnectorPolicyError("permanent_input_error", "side_effect_requires_idempotency_key");
|
|
55
|
-
}
|
|
56
|
-
if (plan.degraded && (semantics === "side_effect" || semantics === "task_claim")) {
|
|
57
|
-
throw new ConnectorPolicyError("semantic_rejection", "degraded_channel_not_allowed_for_side_effect");
|
|
58
|
-
}
|
|
59
|
-
if (plan.idempotencyKey && deps.effectCommitLedger) {
|
|
60
|
-
if (!request.decisionId?.trim() || !request.intentId?.trim()) {
|
|
61
|
-
throw new ConnectorPolicyError("permanent_input_error", "effect_commit_requires_decision_and_intent_id");
|
|
62
|
-
}
|
|
63
|
-
const lookup = await deps.effectCommitLedger.getOrCreateIntentCommitRecord({
|
|
64
|
-
decisionId: request.decisionId,
|
|
65
|
-
intentId: request.intentId,
|
|
66
|
-
idempotencyKey: plan.idempotencyKey,
|
|
67
|
-
effectClass: semantics,
|
|
68
|
-
});
|
|
69
|
-
if (lookup.existing && lookup.record.state === "committed") {
|
|
70
|
-
return {
|
|
71
|
-
skipAdapter: true,
|
|
72
|
-
existingOutcomeRef: lookup.record.outcomeRef,
|
|
73
|
-
effectCommitId: lookup.record.id,
|
|
74
|
-
};
|
|
75
|
-
}
|
|
76
|
-
if (lookup.existing && (lookup.record.state === "dispatched" || lookup.record.state === "reconcile")) {
|
|
77
|
-
throw new ConnectorPolicyError("concurrency_conflict", "effect_commit_requires_reconcile");
|
|
78
|
-
}
|
|
79
|
-
return { skipAdapter: false, effectCommitId: lookup.record.id };
|
|
80
|
-
}
|
|
81
|
-
return { skipAdapter: false };
|
|
82
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* Side-effect idempotency + degraded-channel gate + effect commit replay (T3.2.1).
|
|
3
|
+
* Aligns with connector-system.detail §3.6 enforceExecutionPolicy.
|
|
4
|
+
*/
|
|
5
|
+
import * as crypto from "node:crypto";
|
|
6
|
+
import { ConnectorPolicyError } from "./failure-taxonomy.js";
|
|
7
|
+
const READONLY = new Set([
|
|
8
|
+
"feed.read",
|
|
9
|
+
"notification.list",
|
|
10
|
+
"work.discover",
|
|
11
|
+
]);
|
|
12
|
+
export function classifyConnectorIntentEffect(intent) {
|
|
13
|
+
if (intent === "agent.heartbeat")
|
|
14
|
+
return "keepalive";
|
|
15
|
+
if (intent === "task.claim")
|
|
16
|
+
return "task_claim";
|
|
17
|
+
if (READONLY.has(intent))
|
|
18
|
+
return "read_only";
|
|
19
|
+
return "side_effect";
|
|
20
|
+
}
|
|
21
|
+
/** In-memory ledger for tests and offline harnesses. */
|
|
22
|
+
export class InMemoryEffectCommitLedger {
|
|
23
|
+
byKey = new Map();
|
|
24
|
+
key(decisionId, idempotencyKey) {
|
|
25
|
+
return `${decisionId}::${idempotencyKey}`;
|
|
26
|
+
}
|
|
27
|
+
async getOrCreateIntentCommitRecord(input) {
|
|
28
|
+
const k = this.key(input.decisionId, input.idempotencyKey);
|
|
29
|
+
const hit = this.byKey.get(k);
|
|
30
|
+
if (hit) {
|
|
31
|
+
return { existing: true, record: hit };
|
|
32
|
+
}
|
|
33
|
+
const id = crypto.randomUUID();
|
|
34
|
+
const rec = { id, state: "planned", outcomeRef: undefined };
|
|
35
|
+
this.byKey.set(k, rec);
|
|
36
|
+
return { existing: false, record: rec };
|
|
37
|
+
}
|
|
38
|
+
/** Test seam: mark a key as already committed with replayable outcome. */
|
|
39
|
+
seedCommitted(decisionId, idempotencyKey, outcomeRef) {
|
|
40
|
+
const id = crypto.randomUUID();
|
|
41
|
+
this.byKey.set(this.key(decisionId, idempotencyKey), { id, state: "committed", outcomeRef });
|
|
42
|
+
}
|
|
43
|
+
markState(decisionId, idempotencyKey, state) {
|
|
44
|
+
const k = this.key(decisionId, idempotencyKey);
|
|
45
|
+
const cur = this.byKey.get(k);
|
|
46
|
+
if (!cur)
|
|
47
|
+
throw new Error("ledger_seed_missing");
|
|
48
|
+
this.byKey.set(k, { ...cur, state });
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
export async function enforceExecutionPolicy(plan, intent, request, deps) {
|
|
52
|
+
const semantics = classifyConnectorIntentEffect(intent);
|
|
53
|
+
if ((semantics === "side_effect" || semantics === "task_claim") && !plan.idempotencyKey?.trim()) {
|
|
54
|
+
throw new ConnectorPolicyError("permanent_input_error", "side_effect_requires_idempotency_key");
|
|
55
|
+
}
|
|
56
|
+
if (plan.degraded && (semantics === "side_effect" || semantics === "task_claim")) {
|
|
57
|
+
throw new ConnectorPolicyError("semantic_rejection", "degraded_channel_not_allowed_for_side_effect");
|
|
58
|
+
}
|
|
59
|
+
if (plan.idempotencyKey && deps.effectCommitLedger) {
|
|
60
|
+
if (!request.decisionId?.trim() || !request.intentId?.trim()) {
|
|
61
|
+
throw new ConnectorPolicyError("permanent_input_error", "effect_commit_requires_decision_and_intent_id");
|
|
62
|
+
}
|
|
63
|
+
const lookup = await deps.effectCommitLedger.getOrCreateIntentCommitRecord({
|
|
64
|
+
decisionId: request.decisionId,
|
|
65
|
+
intentId: request.intentId,
|
|
66
|
+
idempotencyKey: plan.idempotencyKey,
|
|
67
|
+
effectClass: semantics,
|
|
68
|
+
});
|
|
69
|
+
if (lookup.existing && lookup.record.state === "committed") {
|
|
70
|
+
return {
|
|
71
|
+
skipAdapter: true,
|
|
72
|
+
existingOutcomeRef: lookup.record.outcomeRef,
|
|
73
|
+
effectCommitId: lookup.record.id,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
if (lookup.existing && (lookup.record.state === "dispatched" || lookup.record.state === "reconcile")) {
|
|
77
|
+
throw new ConnectorPolicyError("concurrency_conflict", "effect_commit_requires_reconcile");
|
|
78
|
+
}
|
|
79
|
+
return { skipAdapter: false, effectCommitId: lookup.record.id };
|
|
80
|
+
}
|
|
81
|
+
return { skipAdapter: false };
|
|
82
|
+
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
export * from "./contract.js";
|
|
2
|
-
export * from "./manifest.js";
|
|
3
|
-
export * from "./map-life-evidence.js";
|
|
4
|
-
export * from "./failure-taxonomy.js";
|
|
5
|
-
export * from "./route-planner.js";
|
|
6
|
-
export * from "./channel-health.js";
|
|
7
|
-
export * from "./policy-layer.js";
|
|
8
|
-
export * from "./execution-policy.js";
|
|
1
|
+
export * from "./contract.js";
|
|
2
|
+
export * from "./manifest.js";
|
|
3
|
+
export * from "./map-life-evidence.js";
|
|
4
|
+
export * from "./failure-taxonomy.js";
|
|
5
|
+
export * from "./route-planner.js";
|
|
6
|
+
export * from "./channel-health.js";
|
|
7
|
+
export * from "./policy-layer.js";
|
|
8
|
+
export * from "./execution-policy.js";
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
export * from "./contract.js";
|
|
2
|
-
export * from "./manifest.js";
|
|
3
|
-
export * from "./map-life-evidence.js";
|
|
4
|
-
export * from "./failure-taxonomy.js";
|
|
5
|
-
export * from "./route-planner.js";
|
|
6
|
-
export * from "./channel-health.js";
|
|
7
|
-
export * from "./policy-layer.js";
|
|
8
|
-
export * from "./execution-policy.js";
|
|
1
|
+
export * from "./contract.js";
|
|
2
|
+
export * from "./manifest.js";
|
|
3
|
+
export * from "./map-life-evidence.js";
|
|
4
|
+
export * from "./failure-taxonomy.js";
|
|
5
|
+
export * from "./route-planner.js";
|
|
6
|
+
export * from "./channel-health.js";
|
|
7
|
+
export * from "./policy-layer.js";
|
|
8
|
+
export * from "./execution-policy.js";
|
|
@@ -1,64 +1,64 @@
|
|
|
1
|
-
import { z } from "zod";
|
|
2
|
-
import { type CapabilityIntent, type ChannelType } from "./contract.js";
|
|
3
|
-
declare const connectorManifestSchema: z.ZodObject<{
|
|
4
|
-
platformId: z.ZodString;
|
|
5
|
-
supportedCapabilities: z.ZodArray<z.ZodEnum<{
|
|
6
|
-
"feed.read": "feed.read";
|
|
7
|
-
"post.publish": "post.publish";
|
|
8
|
-
"comment.reply": "comment.reply";
|
|
9
|
-
"notification.list": "notification.list";
|
|
10
|
-
"message.send": "message.send";
|
|
11
|
-
"agent.register": "agent.register";
|
|
12
|
-
"agent.heartbeat": "agent.heartbeat";
|
|
13
|
-
"work.discover": "work.discover";
|
|
14
|
-
"task.claim": "task.claim";
|
|
15
|
-
}>>;
|
|
16
|
-
channelPriority: z.ZodArray<z.ZodEnum<{
|
|
17
|
-
api_rest: "api_rest";
|
|
18
|
-
api_rpc: "api_rpc";
|
|
19
|
-
a2a: "a2a";
|
|
20
|
-
mcp: "mcp";
|
|
21
|
-
cli: "cli";
|
|
22
|
-
skill: "skill";
|
|
23
|
-
browser: "browser";
|
|
24
|
-
}>>;
|
|
25
|
-
credentialTypes: z.ZodArray<z.ZodString>;
|
|
26
|
-
degradedChannels: z.ZodOptional<z.ZodArray<z.ZodEnum<{
|
|
27
|
-
api_rest: "api_rest";
|
|
28
|
-
api_rpc: "api_rpc";
|
|
29
|
-
a2a: "a2a";
|
|
30
|
-
mcp: "mcp";
|
|
31
|
-
cli: "cli";
|
|
32
|
-
skill: "skill";
|
|
33
|
-
browser: "browser";
|
|
34
|
-
}>>>;
|
|
35
|
-
sourceRefPolicy: z.ZodOptional<z.ZodObject<{
|
|
36
|
-
minSourceRefs: z.ZodDefault<z.ZodNumber>;
|
|
37
|
-
rejectInlineSensitivePayload: z.ZodOptional<z.ZodBoolean>;
|
|
38
|
-
}, z.core.$strip>>;
|
|
39
|
-
}, z.core.$strip>;
|
|
40
|
-
export type ConnectorManifest = z.infer<typeof connectorManifestSchema>;
|
|
41
|
-
export declare class CapabilityContractRegistry {
|
|
42
|
-
private readonly byPlatform;
|
|
43
|
-
register(manifest: ConnectorManifest): void;
|
|
44
|
-
loadManifest(platformId: string): ConnectorManifest;
|
|
45
|
-
listRegisteredPlatformIds(): string[];
|
|
46
|
-
hasCapability(platformId: string, intent: CapabilityIntent): boolean;
|
|
47
|
-
listCapabilities(platformId: string): CapabilityIntent[];
|
|
48
|
-
listChannels(platformId: string): ChannelType[];
|
|
49
|
-
}
|
|
50
|
-
/** T3.1.1 contract name for manifest-first registry. */
|
|
51
|
-
export declare const ConnectorManifestRegistry: typeof CapabilityContractRegistry;
|
|
52
|
-
export type ConnectorManifestRegistry = CapabilityContractRegistry;
|
|
53
|
-
export declare function describeConnector(registry: CapabilityContractRegistry, platformId: string): ConnectorManifest;
|
|
54
|
-
export declare function checkConnector(registry: CapabilityContractRegistry, platformId: string): {
|
|
55
|
-
ok: boolean;
|
|
56
|
-
errors: string[];
|
|
57
|
-
};
|
|
58
|
-
export declare function discoverCapabilities(registry: CapabilityContractRegistry): Array<{
|
|
59
|
-
platformId: string;
|
|
60
|
-
capabilities: CapabilityIntent[];
|
|
61
|
-
degradedChannels?: ChannelType[];
|
|
62
|
-
}>;
|
|
63
|
-
export declare function parseConnectorManifest(input: unknown): ConnectorManifest;
|
|
64
|
-
export {};
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { type CapabilityIntent, type ChannelType } from "./contract.js";
|
|
3
|
+
declare const connectorManifestSchema: z.ZodObject<{
|
|
4
|
+
platformId: z.ZodString;
|
|
5
|
+
supportedCapabilities: z.ZodArray<z.ZodEnum<{
|
|
6
|
+
"feed.read": "feed.read";
|
|
7
|
+
"post.publish": "post.publish";
|
|
8
|
+
"comment.reply": "comment.reply";
|
|
9
|
+
"notification.list": "notification.list";
|
|
10
|
+
"message.send": "message.send";
|
|
11
|
+
"agent.register": "agent.register";
|
|
12
|
+
"agent.heartbeat": "agent.heartbeat";
|
|
13
|
+
"work.discover": "work.discover";
|
|
14
|
+
"task.claim": "task.claim";
|
|
15
|
+
}>>;
|
|
16
|
+
channelPriority: z.ZodArray<z.ZodEnum<{
|
|
17
|
+
api_rest: "api_rest";
|
|
18
|
+
api_rpc: "api_rpc";
|
|
19
|
+
a2a: "a2a";
|
|
20
|
+
mcp: "mcp";
|
|
21
|
+
cli: "cli";
|
|
22
|
+
skill: "skill";
|
|
23
|
+
browser: "browser";
|
|
24
|
+
}>>;
|
|
25
|
+
credentialTypes: z.ZodArray<z.ZodString>;
|
|
26
|
+
degradedChannels: z.ZodOptional<z.ZodArray<z.ZodEnum<{
|
|
27
|
+
api_rest: "api_rest";
|
|
28
|
+
api_rpc: "api_rpc";
|
|
29
|
+
a2a: "a2a";
|
|
30
|
+
mcp: "mcp";
|
|
31
|
+
cli: "cli";
|
|
32
|
+
skill: "skill";
|
|
33
|
+
browser: "browser";
|
|
34
|
+
}>>>;
|
|
35
|
+
sourceRefPolicy: z.ZodOptional<z.ZodObject<{
|
|
36
|
+
minSourceRefs: z.ZodDefault<z.ZodNumber>;
|
|
37
|
+
rejectInlineSensitivePayload: z.ZodOptional<z.ZodBoolean>;
|
|
38
|
+
}, z.core.$strip>>;
|
|
39
|
+
}, z.core.$strip>;
|
|
40
|
+
export type ConnectorManifest = z.infer<typeof connectorManifestSchema>;
|
|
41
|
+
export declare class CapabilityContractRegistry {
|
|
42
|
+
private readonly byPlatform;
|
|
43
|
+
register(manifest: ConnectorManifest): void;
|
|
44
|
+
loadManifest(platformId: string): ConnectorManifest;
|
|
45
|
+
listRegisteredPlatformIds(): string[];
|
|
46
|
+
hasCapability(platformId: string, intent: CapabilityIntent): boolean;
|
|
47
|
+
listCapabilities(platformId: string): CapabilityIntent[];
|
|
48
|
+
listChannels(platformId: string): ChannelType[];
|
|
49
|
+
}
|
|
50
|
+
/** T3.1.1 contract name for manifest-first registry. */
|
|
51
|
+
export declare const ConnectorManifestRegistry: typeof CapabilityContractRegistry;
|
|
52
|
+
export type ConnectorManifestRegistry = CapabilityContractRegistry;
|
|
53
|
+
export declare function describeConnector(registry: CapabilityContractRegistry, platformId: string): ConnectorManifest;
|
|
54
|
+
export declare function checkConnector(registry: CapabilityContractRegistry, platformId: string): {
|
|
55
|
+
ok: boolean;
|
|
56
|
+
errors: string[];
|
|
57
|
+
};
|
|
58
|
+
export declare function discoverCapabilities(registry: CapabilityContractRegistry): Array<{
|
|
59
|
+
platformId: string;
|
|
60
|
+
capabilities: CapabilityIntent[];
|
|
61
|
+
degradedChannels?: ChannelType[];
|
|
62
|
+
}>;
|
|
63
|
+
export declare function parseConnectorManifest(input: unknown): ConnectorManifest;
|
|
64
|
+
export {};
|
|
@@ -1,86 +1,86 @@
|
|
|
1
|
-
import { z } from "zod";
|
|
2
|
-
import { CAPABILITY_INTENTS, CHANNEL_TYPES } from "./contract.js";
|
|
3
|
-
const sourceRefPolicySchema = z
|
|
4
|
-
.object({
|
|
5
|
-
minSourceRefs: z.number().int().min(0).default(1),
|
|
6
|
-
rejectInlineSensitivePayload: z.boolean().optional(),
|
|
7
|
-
})
|
|
8
|
-
.optional();
|
|
9
|
-
const connectorManifestSchema = z.object({
|
|
10
|
-
platformId: z.string().min(1),
|
|
11
|
-
supportedCapabilities: z.array(z.enum(CAPABILITY_INTENTS)).min(1),
|
|
12
|
-
channelPriority: z.array(z.enum(CHANNEL_TYPES)).min(1),
|
|
13
|
-
credentialTypes: z.array(z.string().min(1)).min(1),
|
|
14
|
-
degradedChannels: z.array(z.enum(CHANNEL_TYPES)).optional(),
|
|
15
|
-
sourceRefPolicy: sourceRefPolicySchema,
|
|
16
|
-
});
|
|
17
|
-
export class CapabilityContractRegistry {
|
|
18
|
-
byPlatform = new Map();
|
|
19
|
-
register(manifest) {
|
|
20
|
-
const parsed = connectorManifestSchema.parse(manifest);
|
|
21
|
-
this.byPlatform.set(parsed.platformId, parsed);
|
|
22
|
-
}
|
|
23
|
-
loadManifest(platformId) {
|
|
24
|
-
const found = this.byPlatform.get(platformId);
|
|
25
|
-
if (!found) {
|
|
26
|
-
throw new Error(`connector_manifest_not_found:${platformId}`);
|
|
27
|
-
}
|
|
28
|
-
return found;
|
|
29
|
-
}
|
|
30
|
-
listRegisteredPlatformIds() {
|
|
31
|
-
return [...this.byPlatform.keys()];
|
|
32
|
-
}
|
|
33
|
-
hasCapability(platformId, intent) {
|
|
34
|
-
const manifest = this.loadManifest(platformId);
|
|
35
|
-
return manifest.supportedCapabilities.includes(intent);
|
|
36
|
-
}
|
|
37
|
-
listCapabilities(platformId) {
|
|
38
|
-
return [...this.loadManifest(platformId).supportedCapabilities];
|
|
39
|
-
}
|
|
40
|
-
listChannels(platformId) {
|
|
41
|
-
return [...this.loadManifest(platformId).channelPriority];
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
/** T3.1.1 contract name for manifest-first registry. */
|
|
45
|
-
export const ConnectorManifestRegistry = CapabilityContractRegistry;
|
|
46
|
-
export function describeConnector(registry, platformId) {
|
|
47
|
-
return registry.loadManifest(platformId);
|
|
48
|
-
}
|
|
49
|
-
export function checkConnector(registry, platformId) {
|
|
50
|
-
const errors = [];
|
|
51
|
-
try {
|
|
52
|
-
const manifest = registry.loadManifest(platformId);
|
|
53
|
-
if (manifest.supportedCapabilities.length === 0) {
|
|
54
|
-
errors.push("capability_list_empty");
|
|
55
|
-
}
|
|
56
|
-
if (manifest.channelPriority.length === 0) {
|
|
57
|
-
errors.push("channel_priority_empty");
|
|
58
|
-
}
|
|
59
|
-
if (manifest.credentialTypes.length === 0) {
|
|
60
|
-
errors.push("credential_types_empty");
|
|
61
|
-
}
|
|
62
|
-
const degraded = manifest.degradedChannels ?? [];
|
|
63
|
-
for (const channel of degraded) {
|
|
64
|
-
if (!manifest.channelPriority.includes(channel)) {
|
|
65
|
-
errors.push(`degraded_channel_not_in_priority:${channel}`);
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
catch (error) {
|
|
70
|
-
errors.push(error instanceof Error ? error.message : String(error));
|
|
71
|
-
}
|
|
72
|
-
return { ok: errors.length === 0, errors };
|
|
73
|
-
}
|
|
74
|
-
export function discoverCapabilities(registry) {
|
|
75
|
-
return registry.listRegisteredPlatformIds().map((platformId) => {
|
|
76
|
-
const manifest = registry.loadManifest(platformId);
|
|
77
|
-
return {
|
|
78
|
-
platformId,
|
|
79
|
-
capabilities: [...manifest.supportedCapabilities],
|
|
80
|
-
degradedChannels: manifest.degradedChannels,
|
|
81
|
-
};
|
|
82
|
-
});
|
|
83
|
-
}
|
|
84
|
-
export function parseConnectorManifest(input) {
|
|
85
|
-
return connectorManifestSchema.parse(input);
|
|
86
|
-
}
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { CAPABILITY_INTENTS, CHANNEL_TYPES } from "./contract.js";
|
|
3
|
+
const sourceRefPolicySchema = z
|
|
4
|
+
.object({
|
|
5
|
+
minSourceRefs: z.number().int().min(0).default(1),
|
|
6
|
+
rejectInlineSensitivePayload: z.boolean().optional(),
|
|
7
|
+
})
|
|
8
|
+
.optional();
|
|
9
|
+
const connectorManifestSchema = z.object({
|
|
10
|
+
platformId: z.string().min(1),
|
|
11
|
+
supportedCapabilities: z.array(z.enum(CAPABILITY_INTENTS)).min(1),
|
|
12
|
+
channelPriority: z.array(z.enum(CHANNEL_TYPES)).min(1),
|
|
13
|
+
credentialTypes: z.array(z.string().min(1)).min(1),
|
|
14
|
+
degradedChannels: z.array(z.enum(CHANNEL_TYPES)).optional(),
|
|
15
|
+
sourceRefPolicy: sourceRefPolicySchema,
|
|
16
|
+
});
|
|
17
|
+
export class CapabilityContractRegistry {
|
|
18
|
+
byPlatform = new Map();
|
|
19
|
+
register(manifest) {
|
|
20
|
+
const parsed = connectorManifestSchema.parse(manifest);
|
|
21
|
+
this.byPlatform.set(parsed.platformId, parsed);
|
|
22
|
+
}
|
|
23
|
+
loadManifest(platformId) {
|
|
24
|
+
const found = this.byPlatform.get(platformId);
|
|
25
|
+
if (!found) {
|
|
26
|
+
throw new Error(`connector_manifest_not_found:${platformId}`);
|
|
27
|
+
}
|
|
28
|
+
return found;
|
|
29
|
+
}
|
|
30
|
+
listRegisteredPlatformIds() {
|
|
31
|
+
return [...this.byPlatform.keys()];
|
|
32
|
+
}
|
|
33
|
+
hasCapability(platformId, intent) {
|
|
34
|
+
const manifest = this.loadManifest(platformId);
|
|
35
|
+
return manifest.supportedCapabilities.includes(intent);
|
|
36
|
+
}
|
|
37
|
+
listCapabilities(platformId) {
|
|
38
|
+
return [...this.loadManifest(platformId).supportedCapabilities];
|
|
39
|
+
}
|
|
40
|
+
listChannels(platformId) {
|
|
41
|
+
return [...this.loadManifest(platformId).channelPriority];
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/** T3.1.1 contract name for manifest-first registry. */
|
|
45
|
+
export const ConnectorManifestRegistry = CapabilityContractRegistry;
|
|
46
|
+
export function describeConnector(registry, platformId) {
|
|
47
|
+
return registry.loadManifest(platformId);
|
|
48
|
+
}
|
|
49
|
+
export function checkConnector(registry, platformId) {
|
|
50
|
+
const errors = [];
|
|
51
|
+
try {
|
|
52
|
+
const manifest = registry.loadManifest(platformId);
|
|
53
|
+
if (manifest.supportedCapabilities.length === 0) {
|
|
54
|
+
errors.push("capability_list_empty");
|
|
55
|
+
}
|
|
56
|
+
if (manifest.channelPriority.length === 0) {
|
|
57
|
+
errors.push("channel_priority_empty");
|
|
58
|
+
}
|
|
59
|
+
if (manifest.credentialTypes.length === 0) {
|
|
60
|
+
errors.push("credential_types_empty");
|
|
61
|
+
}
|
|
62
|
+
const degraded = manifest.degradedChannels ?? [];
|
|
63
|
+
for (const channel of degraded) {
|
|
64
|
+
if (!manifest.channelPriority.includes(channel)) {
|
|
65
|
+
errors.push(`degraded_channel_not_in_priority:${channel}`);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
errors.push(error instanceof Error ? error.message : String(error));
|
|
71
|
+
}
|
|
72
|
+
return { ok: errors.length === 0, errors };
|
|
73
|
+
}
|
|
74
|
+
export function discoverCapabilities(registry) {
|
|
75
|
+
return registry.listRegisteredPlatformIds().map((platformId) => {
|
|
76
|
+
const manifest = registry.loadManifest(platformId);
|
|
77
|
+
return {
|
|
78
|
+
platformId,
|
|
79
|
+
capabilities: [...manifest.supportedCapabilities],
|
|
80
|
+
degradedChannels: manifest.degradedChannels,
|
|
81
|
+
};
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
export function parseConnectorManifest(input) {
|
|
85
|
+
return connectorManifestSchema.parse(input);
|
|
86
|
+
}
|
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Maps normalized connector success results to `LifeEvidenceCandidate` (T3.1.2).
|
|
3
|
-
* Returns null when evidence cannot be source-backed (no refs, wrong intent, or failure).
|
|
4
|
-
*/
|
|
5
|
-
import type { CapabilityIntent, ConnectorResult } from "./contract.js";
|
|
6
|
-
import type { LifeEvidenceCandidate, Sensitivity } from "../../storage/life-evidence/types.js";
|
|
7
|
-
/**
|
|
8
|
-
* Produce a single life-evidence candidate from a connector outcome, or null if not mappable.
|
|
9
|
-
*/
|
|
10
|
-
export declare function mapLifeEvidence(input: {
|
|
11
|
-
platformId: string;
|
|
12
|
-
intent: CapabilityIntent;
|
|
13
|
-
result: ConnectorResult<unknown>;
|
|
14
|
-
observedAt?: string;
|
|
15
|
-
sensitivityOverride?: Sensitivity;
|
|
16
|
-
}): LifeEvidenceCandidate | null;
|
|
1
|
+
/**
|
|
2
|
+
* Maps normalized connector success results to `LifeEvidenceCandidate` (T3.1.2).
|
|
3
|
+
* Returns null when evidence cannot be source-backed (no refs, wrong intent, or failure).
|
|
4
|
+
*/
|
|
5
|
+
import type { CapabilityIntent, ConnectorResult } from "./contract.js";
|
|
6
|
+
import type { LifeEvidenceCandidate, Sensitivity } from "../../storage/life-evidence/types.js";
|
|
7
|
+
/**
|
|
8
|
+
* Produce a single life-evidence candidate from a connector outcome, or null if not mappable.
|
|
9
|
+
*/
|
|
10
|
+
export declare function mapLifeEvidence(input: {
|
|
11
|
+
platformId: string;
|
|
12
|
+
intent: CapabilityIntent;
|
|
13
|
+
result: ConnectorResult<unknown>;
|
|
14
|
+
observedAt?: string;
|
|
15
|
+
sensitivityOverride?: Sensitivity;
|
|
16
|
+
}): LifeEvidenceCandidate | null;
|