@haaaiawd/second-nature 0.1.16 → 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 -851
- 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,52 +1,52 @@
|
|
|
1
|
-
import { selectRhythmWindow } from "./select-window.js";
|
|
2
|
-
const ALL_INTENT_KINDS = [
|
|
3
|
-
"work",
|
|
4
|
-
"exploration",
|
|
5
|
-
"social",
|
|
6
|
-
"quiet",
|
|
7
|
-
"reflection",
|
|
8
|
-
"outreach",
|
|
9
|
-
"maintenance",
|
|
10
|
-
];
|
|
11
|
-
function allowedForPaused() {
|
|
12
|
-
return ["maintenance"];
|
|
13
|
-
}
|
|
14
|
-
function allowedForMaintenanceOnly() {
|
|
15
|
-
return ["work", "maintenance"];
|
|
16
|
-
}
|
|
17
|
-
function allowedForActiveWindow(windowId) {
|
|
18
|
-
if (windowId.includes("work")) {
|
|
19
|
-
return ["work", "exploration", "maintenance", "reflection", "outreach", "social", "quiet"];
|
|
20
|
-
}
|
|
21
|
-
if (windowId.includes("social")) {
|
|
22
|
-
return ["social", "exploration", "work", "maintenance", "reflection", "outreach", "quiet"];
|
|
23
|
-
}
|
|
24
|
-
if (windowId.includes("reflection")) {
|
|
25
|
-
return ["reflection", "work", "maintenance", "exploration", "social", "outreach", "quiet"];
|
|
26
|
-
}
|
|
27
|
-
return ALL_INTENT_KINDS;
|
|
28
|
-
}
|
|
29
|
-
function mergeQuietBias(decision, continuity, windowIsQuiet) {
|
|
30
|
-
return windowIsQuiet || decision.topLevelMode === "quiet" || continuity.mode === "quiet";
|
|
31
|
-
}
|
|
32
|
-
/**
|
|
33
|
-
* Derive allowed intent kinds and quiet bias for candidate planning.
|
|
34
|
-
*/
|
|
35
|
-
export function buildPlannerRhythmWindow(now, continuity, policy) {
|
|
36
|
-
const decision = selectRhythmWindow(now, continuity, policy);
|
|
37
|
-
const window = policy.windows.find((w) => w.id === decision.windowId) ?? policy.windows[0];
|
|
38
|
-
const windowIsQuiet = window.mode === "quiet";
|
|
39
|
-
const quietBias = mergeQuietBias(decision, continuity, windowIsQuiet);
|
|
40
|
-
let allowed;
|
|
41
|
-
if (decision.topLevelMode === "paused_for_interrupt") {
|
|
42
|
-
allowed = allowedForPaused();
|
|
43
|
-
}
|
|
44
|
-
else if (decision.topLevelMode === "maintenance_only") {
|
|
45
|
-
allowed = allowedForMaintenanceOnly();
|
|
46
|
-
}
|
|
47
|
-
else {
|
|
48
|
-
/** Calendar quiet sets `quietBias` only; candidate kinds stay window-biased (guards enforce quiet suppression). */
|
|
49
|
-
allowed = allowedForActiveWindow(window.id);
|
|
50
|
-
}
|
|
51
|
-
return { windowId: decision.windowId, allowedIntentKinds: allowed, quietBias };
|
|
52
|
-
}
|
|
1
|
+
import { selectRhythmWindow } from "./select-window.js";
|
|
2
|
+
const ALL_INTENT_KINDS = [
|
|
3
|
+
"work",
|
|
4
|
+
"exploration",
|
|
5
|
+
"social",
|
|
6
|
+
"quiet",
|
|
7
|
+
"reflection",
|
|
8
|
+
"outreach",
|
|
9
|
+
"maintenance",
|
|
10
|
+
];
|
|
11
|
+
function allowedForPaused() {
|
|
12
|
+
return ["maintenance"];
|
|
13
|
+
}
|
|
14
|
+
function allowedForMaintenanceOnly() {
|
|
15
|
+
return ["work", "maintenance"];
|
|
16
|
+
}
|
|
17
|
+
function allowedForActiveWindow(windowId) {
|
|
18
|
+
if (windowId.includes("work")) {
|
|
19
|
+
return ["work", "exploration", "maintenance", "reflection", "outreach", "social", "quiet"];
|
|
20
|
+
}
|
|
21
|
+
if (windowId.includes("social")) {
|
|
22
|
+
return ["social", "exploration", "work", "maintenance", "reflection", "outreach", "quiet"];
|
|
23
|
+
}
|
|
24
|
+
if (windowId.includes("reflection")) {
|
|
25
|
+
return ["reflection", "work", "maintenance", "exploration", "social", "outreach", "quiet"];
|
|
26
|
+
}
|
|
27
|
+
return ALL_INTENT_KINDS;
|
|
28
|
+
}
|
|
29
|
+
function mergeQuietBias(decision, continuity, windowIsQuiet) {
|
|
30
|
+
return windowIsQuiet || decision.topLevelMode === "quiet" || continuity.mode === "quiet";
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Derive allowed intent kinds and quiet bias for candidate planning.
|
|
34
|
+
*/
|
|
35
|
+
export function buildPlannerRhythmWindow(now, continuity, policy) {
|
|
36
|
+
const decision = selectRhythmWindow(now, continuity, policy);
|
|
37
|
+
const window = policy.windows.find((w) => w.id === decision.windowId) ?? policy.windows[0];
|
|
38
|
+
const windowIsQuiet = window.mode === "quiet";
|
|
39
|
+
const quietBias = mergeQuietBias(decision, continuity, windowIsQuiet);
|
|
40
|
+
let allowed;
|
|
41
|
+
if (decision.topLevelMode === "paused_for_interrupt") {
|
|
42
|
+
allowed = allowedForPaused();
|
|
43
|
+
}
|
|
44
|
+
else if (decision.topLevelMode === "maintenance_only") {
|
|
45
|
+
allowed = allowedForMaintenanceOnly();
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
/** Calendar quiet sets `quietBias` only; candidate kinds stay window-biased (guards enforce quiet suppression). */
|
|
49
|
+
allowed = allowedForActiveWindow(window.id);
|
|
50
|
+
}
|
|
51
|
+
return { windowId: decision.windowId, allowedIntentKinds: allowed, quietBias };
|
|
52
|
+
}
|
|
@@ -1,19 +1,19 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Bridges state-system RhythmPolicySnapshot fields into control-plane RhythmPolicy (T2.1.2).
|
|
3
|
-
*
|
|
4
|
-
* State never emits window decisions or allowedIntentKinds; control-plane owns
|
|
5
|
-
* window geometry used by selectRhythmWindow(). Callers pass a pick of the DB read model.
|
|
6
|
-
*/
|
|
7
|
-
import type { RhythmPolicy } from "./rhythm-policy.js";
|
|
8
|
-
/** Subset of `RhythmPolicySnapshot` used for window derivation (no storage import from core). */
|
|
9
|
-
export interface RhythmPolicySnapshotBridgeInput {
|
|
10
|
-
quietEnabled: boolean;
|
|
11
|
-
}
|
|
12
|
-
/**
|
|
13
|
-
* Reject drifted snapshot shapes that smuggle control-plane decision fields.
|
|
14
|
-
*/
|
|
15
|
-
export declare function assertRhythmPolicySnapshotContract(snapshot: Record<string, unknown>): void;
|
|
16
|
-
/**
|
|
17
|
-
* Deterministic default windows from policy knobs (quiet hour tail when quietEnabled).
|
|
18
|
-
*/
|
|
19
|
-
export declare function rhythmPolicySnapshotToRhythmPolicy(snapshot: RhythmPolicySnapshotBridgeInput): RhythmPolicy;
|
|
1
|
+
/**
|
|
2
|
+
* Bridges state-system RhythmPolicySnapshot fields into control-plane RhythmPolicy (T2.1.2).
|
|
3
|
+
*
|
|
4
|
+
* State never emits window decisions or allowedIntentKinds; control-plane owns
|
|
5
|
+
* window geometry used by selectRhythmWindow(). Callers pass a pick of the DB read model.
|
|
6
|
+
*/
|
|
7
|
+
import type { RhythmPolicy } from "./rhythm-policy.js";
|
|
8
|
+
/** Subset of `RhythmPolicySnapshot` used for window derivation (no storage import from core). */
|
|
9
|
+
export interface RhythmPolicySnapshotBridgeInput {
|
|
10
|
+
quietEnabled: boolean;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Reject drifted snapshot shapes that smuggle control-plane decision fields.
|
|
14
|
+
*/
|
|
15
|
+
export declare function assertRhythmPolicySnapshotContract(snapshot: Record<string, unknown>): void;
|
|
16
|
+
/**
|
|
17
|
+
* Deterministic default windows from policy knobs (quiet hour tail when quietEnabled).
|
|
18
|
+
*/
|
|
19
|
+
export declare function rhythmPolicySnapshotToRhythmPolicy(snapshot: RhythmPolicySnapshotBridgeInput): RhythmPolicy;
|
|
@@ -1,34 +1,34 @@
|
|
|
1
|
-
const FORBIDDEN_SNAPSHOT_KEYS = ["allowedIntentKinds", "windowDecision", "rhythmWindow"];
|
|
2
|
-
/**
|
|
3
|
-
* Reject drifted snapshot shapes that smuggle control-plane decision fields.
|
|
4
|
-
*/
|
|
5
|
-
export function assertRhythmPolicySnapshotContract(snapshot) {
|
|
6
|
-
for (const key of FORBIDDEN_SNAPSHOT_KEYS) {
|
|
7
|
-
if (key in snapshot) {
|
|
8
|
-
throw new Error(`rhythm_policy_snapshot_field_drift:${key}`);
|
|
9
|
-
}
|
|
10
|
-
}
|
|
11
|
-
}
|
|
12
|
-
/**
|
|
13
|
-
* Deterministic default windows from policy knobs (quiet hour tail when quietEnabled).
|
|
14
|
-
*/
|
|
15
|
-
export function rhythmPolicySnapshotToRhythmPolicy(snapshot) {
|
|
16
|
-
assertRhythmPolicySnapshotContract(snapshot);
|
|
17
|
-
if (snapshot.quietEnabled) {
|
|
18
|
-
return {
|
|
19
|
-
timezone: "UTC",
|
|
20
|
-
quietSuppressionEnabled: true,
|
|
21
|
-
windows: [
|
|
22
|
-
{ id: "w-work", startMinute: 0, endMinute: 480, mode: "active" },
|
|
23
|
-
{ id: "w-social", startMinute: 480, endMinute: 960, mode: "active" },
|
|
24
|
-
{ id: "w-reflection", startMinute: 960, endMinute: 1200, mode: "active" },
|
|
25
|
-
{ id: "w-quiet", startMinute: 1200, endMinute: 1440, mode: "quiet" },
|
|
26
|
-
],
|
|
27
|
-
};
|
|
28
|
-
}
|
|
29
|
-
return {
|
|
30
|
-
timezone: "UTC",
|
|
31
|
-
quietSuppressionEnabled: false,
|
|
32
|
-
windows: [{ id: "w-open", startMinute: 0, endMinute: 1440, mode: "active" }],
|
|
33
|
-
};
|
|
34
|
-
}
|
|
1
|
+
const FORBIDDEN_SNAPSHOT_KEYS = ["allowedIntentKinds", "windowDecision", "rhythmWindow"];
|
|
2
|
+
/**
|
|
3
|
+
* Reject drifted snapshot shapes that smuggle control-plane decision fields.
|
|
4
|
+
*/
|
|
5
|
+
export function assertRhythmPolicySnapshotContract(snapshot) {
|
|
6
|
+
for (const key of FORBIDDEN_SNAPSHOT_KEYS) {
|
|
7
|
+
if (key in snapshot) {
|
|
8
|
+
throw new Error(`rhythm_policy_snapshot_field_drift:${key}`);
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Deterministic default windows from policy knobs (quiet hour tail when quietEnabled).
|
|
14
|
+
*/
|
|
15
|
+
export function rhythmPolicySnapshotToRhythmPolicy(snapshot) {
|
|
16
|
+
assertRhythmPolicySnapshotContract(snapshot);
|
|
17
|
+
if (snapshot.quietEnabled) {
|
|
18
|
+
return {
|
|
19
|
+
timezone: "UTC",
|
|
20
|
+
quietSuppressionEnabled: true,
|
|
21
|
+
windows: [
|
|
22
|
+
{ id: "w-work", startMinute: 0, endMinute: 480, mode: "active" },
|
|
23
|
+
{ id: "w-social", startMinute: 480, endMinute: 960, mode: "active" },
|
|
24
|
+
{ id: "w-reflection", startMinute: 960, endMinute: 1200, mode: "active" },
|
|
25
|
+
{ id: "w-quiet", startMinute: 1200, endMinute: 1440, mode: "quiet" },
|
|
26
|
+
],
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
return {
|
|
30
|
+
timezone: "UTC",
|
|
31
|
+
quietSuppressionEnabled: false,
|
|
32
|
+
windows: [{ id: "w-open", startMinute: 0, endMinute: 1440, mode: "active" }],
|
|
33
|
+
};
|
|
34
|
+
}
|
|
@@ -1,45 +1,45 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Second Nature Runtime Service Entry
|
|
3
|
-
*
|
|
4
|
-
* This module provides the actual implementation for the `second-nature-runtime` service.
|
|
5
|
-
* It serves as the heartbeat host bridge candidate carrier and initializes the
|
|
6
|
-
* minimal runtime state needed for the plugin to function.
|
|
7
|
-
*
|
|
8
|
-
* Per ADR-005: heartbeat is the free-rhythm main entry; this service provides
|
|
9
|
-
* the stable runtime state that heartbeat rounds will interact with.
|
|
10
|
-
*/
|
|
11
|
-
let activeHandle = null;
|
|
12
|
-
/**
|
|
13
|
-
* Start the Second Nature runtime service.
|
|
14
|
-
*
|
|
15
|
-
* This is the non-empty implementation that replaces the previous `start() { return; }` shell.
|
|
16
|
-
* It initializes the minimal runtime state and returns a handle that can be used
|
|
17
|
-
* by the heartbeat host bridge.
|
|
18
|
-
*/
|
|
19
|
-
export function startRuntimeService(ctx) {
|
|
20
|
-
if (activeHandle?.ready) {
|
|
21
|
-
return activeHandle;
|
|
22
|
-
}
|
|
23
|
-
// Initialize minimal runtime state
|
|
24
|
-
// In future iterations, this will connect to:
|
|
25
|
-
// - state-system (SQLite database initialization)
|
|
26
|
-
// - observability-system (event store setup)
|
|
27
|
-
// - control-plane-system (heartbeat bridge preparation)
|
|
28
|
-
const workspaceRoot = ctx?.workspaceRoot ?? process.cwd();
|
|
29
|
-
/** Keep in sync with `plugin/package.json` when cutting releases. */
|
|
30
|
-
const version = "0.1.
|
|
31
|
-
activeHandle = {
|
|
32
|
-
ready: true,
|
|
33
|
-
version,
|
|
34
|
-
close() {
|
|
35
|
-
activeHandle = null;
|
|
36
|
-
},
|
|
37
|
-
};
|
|
38
|
-
return activeHandle;
|
|
39
|
-
}
|
|
40
|
-
/**
|
|
41
|
-
* Get the current runtime service handle, or null if not started.
|
|
42
|
-
*/
|
|
43
|
-
export function getRuntimeHandle() {
|
|
44
|
-
return activeHandle;
|
|
45
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* Second Nature Runtime Service Entry
|
|
3
|
+
*
|
|
4
|
+
* This module provides the actual implementation for the `second-nature-runtime` service.
|
|
5
|
+
* It serves as the heartbeat host bridge candidate carrier and initializes the
|
|
6
|
+
* minimal runtime state needed for the plugin to function.
|
|
7
|
+
*
|
|
8
|
+
* Per ADR-005: heartbeat is the free-rhythm main entry; this service provides
|
|
9
|
+
* the stable runtime state that heartbeat rounds will interact with.
|
|
10
|
+
*/
|
|
11
|
+
let activeHandle = null;
|
|
12
|
+
/**
|
|
13
|
+
* Start the Second Nature runtime service.
|
|
14
|
+
*
|
|
15
|
+
* This is the non-empty implementation that replaces the previous `start() { return; }` shell.
|
|
16
|
+
* It initializes the minimal runtime state and returns a handle that can be used
|
|
17
|
+
* by the heartbeat host bridge.
|
|
18
|
+
*/
|
|
19
|
+
export function startRuntimeService(ctx) {
|
|
20
|
+
if (activeHandle?.ready) {
|
|
21
|
+
return activeHandle;
|
|
22
|
+
}
|
|
23
|
+
// Initialize minimal runtime state
|
|
24
|
+
// In future iterations, this will connect to:
|
|
25
|
+
// - state-system (SQLite database initialization)
|
|
26
|
+
// - observability-system (event store setup)
|
|
27
|
+
// - control-plane-system (heartbeat bridge preparation)
|
|
28
|
+
const workspaceRoot = ctx?.workspaceRoot ?? process.cwd();
|
|
29
|
+
/** Keep in sync with `plugin/package.json` when cutting releases. */
|
|
30
|
+
const version = "0.1.18";
|
|
31
|
+
activeHandle = {
|
|
32
|
+
ready: true,
|
|
33
|
+
version,
|
|
34
|
+
close() {
|
|
35
|
+
activeHandle = null;
|
|
36
|
+
},
|
|
37
|
+
};
|
|
38
|
+
return activeHandle;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Get the current runtime service handle, or null if not started.
|
|
42
|
+
*/
|
|
43
|
+
export function getRuntimeHandle() {
|
|
44
|
+
return activeHandle;
|
|
45
|
+
}
|
|
@@ -1,51 +1,51 @@
|
|
|
1
|
-
export type TopLevelMode = "active" | "quiet" | "maintenance_only" | "paused_for_interrupt";
|
|
2
|
-
/** Control-plane candidate kinds; includes `quiet` for quiet-window–biased intents (L0 alignment). */
|
|
3
|
-
export type IntentKind = "work" | "exploration" | "social" | "quiet" | "reflection" | "outreach" | "maintenance";
|
|
4
|
-
export type DecisionBasis = "rule_only" | "score_based" | "model_assisted";
|
|
5
|
-
export type GuardVerdict = "allow" | "defer" | "deny" | "escalate";
|
|
6
|
-
/** Minimal source ref for planner / guards (matches state-system `SourceRef` subset). */
|
|
7
|
-
export interface ControlPlaneSourceRef {
|
|
8
|
-
id: string;
|
|
9
|
-
kind: "platform_item" | "workspace_artifact" | "decision_record" | "user_anchor" | "connector_result" | "host_report" | "fallback_artifact";
|
|
10
|
-
uri: string;
|
|
11
|
-
excerptHash?: string;
|
|
12
|
-
observedAt?: string;
|
|
13
|
-
}
|
|
14
|
-
export interface ContinuitySnapshot {
|
|
15
|
-
mode: TopLevelMode;
|
|
16
|
-
currentWindowId: string;
|
|
17
|
-
pendingObligations: string[];
|
|
18
|
-
recentOutreachHashes: string[];
|
|
19
|
-
deniedIntents: Array<{
|
|
20
|
-
intentHash: string;
|
|
21
|
-
reason: string;
|
|
22
|
-
at: string;
|
|
23
|
-
}>;
|
|
24
|
-
budgets?: {
|
|
25
|
-
socialUsed: number;
|
|
26
|
-
socialLimit: number;
|
|
27
|
-
};
|
|
28
|
-
awaitingUserInput?: boolean;
|
|
29
|
-
riskSuppressed?: boolean;
|
|
30
|
-
}
|
|
31
|
-
export type CandidateEffectClass = "external_platform_action" | "connector_action" | "memory_curation" | "narrative_reflection" | "user_outreach" | "maintenance" | "no_effect";
|
|
32
|
-
export interface CandidateIntent {
|
|
33
|
-
id: string;
|
|
34
|
-
kind: IntentKind;
|
|
35
|
-
priority: number;
|
|
36
|
-
source: "tick" | "interrupt" | "obligation" | "quiet_plan";
|
|
37
|
-
platformId?: string;
|
|
38
|
-
summary: string;
|
|
39
|
-
effectClass: CandidateEffectClass;
|
|
40
|
-
/** Required for source-backed guard; may be empty when planner expects hard-guard deny. */
|
|
41
|
-
sourceRefs: ControlPlaneSourceRef[];
|
|
42
|
-
/** Dedupe / cooldown key; defaults to stable fingerprint in guard layer when omitted. */
|
|
43
|
-
idempotencyKey?: string;
|
|
44
|
-
}
|
|
45
|
-
export interface GuardEvaluation {
|
|
46
|
-
verdict: GuardVerdict;
|
|
47
|
-
reasons: string[];
|
|
48
|
-
quietSuppressed: boolean;
|
|
49
|
-
leaseRequired: boolean;
|
|
50
|
-
requiresCheckpoint: boolean;
|
|
51
|
-
}
|
|
1
|
+
export type TopLevelMode = "active" | "quiet" | "maintenance_only" | "paused_for_interrupt";
|
|
2
|
+
/** Control-plane candidate kinds; includes `quiet` for quiet-window–biased intents (L0 alignment). */
|
|
3
|
+
export type IntentKind = "work" | "exploration" | "social" | "quiet" | "reflection" | "outreach" | "maintenance";
|
|
4
|
+
export type DecisionBasis = "rule_only" | "score_based" | "model_assisted";
|
|
5
|
+
export type GuardVerdict = "allow" | "defer" | "deny" | "escalate";
|
|
6
|
+
/** Minimal source ref for planner / guards (matches state-system `SourceRef` subset). */
|
|
7
|
+
export interface ControlPlaneSourceRef {
|
|
8
|
+
id: string;
|
|
9
|
+
kind: "platform_item" | "workspace_artifact" | "decision_record" | "user_anchor" | "connector_result" | "host_report" | "fallback_artifact";
|
|
10
|
+
uri: string;
|
|
11
|
+
excerptHash?: string;
|
|
12
|
+
observedAt?: string;
|
|
13
|
+
}
|
|
14
|
+
export interface ContinuitySnapshot {
|
|
15
|
+
mode: TopLevelMode;
|
|
16
|
+
currentWindowId: string;
|
|
17
|
+
pendingObligations: string[];
|
|
18
|
+
recentOutreachHashes: string[];
|
|
19
|
+
deniedIntents: Array<{
|
|
20
|
+
intentHash: string;
|
|
21
|
+
reason: string;
|
|
22
|
+
at: string;
|
|
23
|
+
}>;
|
|
24
|
+
budgets?: {
|
|
25
|
+
socialUsed: number;
|
|
26
|
+
socialLimit: number;
|
|
27
|
+
};
|
|
28
|
+
awaitingUserInput?: boolean;
|
|
29
|
+
riskSuppressed?: boolean;
|
|
30
|
+
}
|
|
31
|
+
export type CandidateEffectClass = "external_platform_action" | "connector_action" | "memory_curation" | "narrative_reflection" | "user_outreach" | "maintenance" | "no_effect";
|
|
32
|
+
export interface CandidateIntent {
|
|
33
|
+
id: string;
|
|
34
|
+
kind: IntentKind;
|
|
35
|
+
priority: number;
|
|
36
|
+
source: "tick" | "interrupt" | "obligation" | "quiet_plan";
|
|
37
|
+
platformId?: string;
|
|
38
|
+
summary: string;
|
|
39
|
+
effectClass: CandidateEffectClass;
|
|
40
|
+
/** Required for source-backed guard; may be empty when planner expects hard-guard deny. */
|
|
41
|
+
sourceRefs: ControlPlaneSourceRef[];
|
|
42
|
+
/** Dedupe / cooldown key; defaults to stable fingerprint in guard layer when omitted. */
|
|
43
|
+
idempotencyKey?: string;
|
|
44
|
+
}
|
|
45
|
+
export interface GuardEvaluation {
|
|
46
|
+
verdict: GuardVerdict;
|
|
47
|
+
reasons: string[];
|
|
48
|
+
quietSuppressed: boolean;
|
|
49
|
+
leaseRequired: boolean;
|
|
50
|
+
requiresCheckpoint: boolean;
|
|
51
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Deterministic GuidanceDraftPort implementation for contract tests and packaged runtime.
|
|
3
|
-
* Does not claim user-visible delivery when wordingMode is not_sent_fallback_candidate (T6.2.1 / ADR-004).
|
|
4
|
-
*/
|
|
5
|
-
import { type GuidanceDraftPort, type OutreachDraftRequest } from "./outreach-draft-schema.js";
|
|
6
|
-
export declare function draftOutreachMessage(request: OutreachDraftRequest): ReturnType<GuidanceDraftPort["draftOutreachMessage"]>;
|
|
7
|
-
export declare function createDraftOutreachMessagePort(): GuidanceDraftPort;
|
|
1
|
+
/**
|
|
2
|
+
* Deterministic GuidanceDraftPort implementation for contract tests and packaged runtime.
|
|
3
|
+
* Does not claim user-visible delivery when wordingMode is not_sent_fallback_candidate (T6.2.1 / ADR-004).
|
|
4
|
+
*/
|
|
5
|
+
import { type GuidanceDraftPort, type OutreachDraftRequest } from "./outreach-draft-schema.js";
|
|
6
|
+
export declare function draftOutreachMessage(request: OutreachDraftRequest): ReturnType<GuidanceDraftPort["draftOutreachMessage"]>;
|
|
7
|
+
export declare function createDraftOutreachMessagePort(): GuidanceDraftPort;
|
|
@@ -1,42 +1,42 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Deterministic GuidanceDraftPort implementation for contract tests and packaged runtime.
|
|
3
|
-
* Does not claim user-visible delivery when wordingMode is not_sent_fallback_candidate (T6.2.1 / ADR-004).
|
|
4
|
-
*/
|
|
5
|
-
import { safeParseOutreachDraftRequest } from "./outreach-draft-schema.js";
|
|
6
|
-
function baseDraftText(request) {
|
|
7
|
-
const ids = request.sourceRefs.map((s) => s.id).join(",");
|
|
8
|
-
return `draft:${request.candidateId}:grounded:${ids}`;
|
|
9
|
-
}
|
|
10
|
-
export async function draftOutreachMessage(request) {
|
|
11
|
-
const parsed = safeParseOutreachDraftRequest(request);
|
|
12
|
-
if (!parsed.success) {
|
|
13
|
-
return { status: "unavailable", reasons: ["outreach_draft_schema_invalid"] };
|
|
14
|
-
}
|
|
15
|
-
const r = parsed.data;
|
|
16
|
-
if (r.judgmentVerdict !== "allow") {
|
|
17
|
-
return { status: "unavailable", reasons: ["hard_decision_not_allow"] };
|
|
18
|
-
}
|
|
19
|
-
if (r.sourceRefs.length === 0) {
|
|
20
|
-
return { status: "unavailable", reasons: ["missing_resolved_source_refs"] };
|
|
21
|
-
}
|
|
22
|
-
const wording = r.deliveryContext.wordingMode;
|
|
23
|
-
if (wording === "sendable") {
|
|
24
|
-
return {
|
|
25
|
-
status: "ready",
|
|
26
|
-
draft: {
|
|
27
|
-
text: `${baseDraftText(r)};wording=sendable`,
|
|
28
|
-
deliveryWording: "sendable",
|
|
29
|
-
},
|
|
30
|
-
};
|
|
31
|
-
}
|
|
32
|
-
return {
|
|
33
|
-
status: "ready",
|
|
34
|
-
draft: {
|
|
35
|
-
text: `Not sent to the user (candidate only). Delivery state: ${r.deliveryContext.deliveryVerdict}. ${baseDraftText(r)}`,
|
|
36
|
-
deliveryWording: "not_sent_fallback_candidate",
|
|
37
|
-
},
|
|
38
|
-
};
|
|
39
|
-
}
|
|
40
|
-
export function createDraftOutreachMessagePort() {
|
|
41
|
-
return { draftOutreachMessage };
|
|
42
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* Deterministic GuidanceDraftPort implementation for contract tests and packaged runtime.
|
|
3
|
+
* Does not claim user-visible delivery when wordingMode is not_sent_fallback_candidate (T6.2.1 / ADR-004).
|
|
4
|
+
*/
|
|
5
|
+
import { safeParseOutreachDraftRequest } from "./outreach-draft-schema.js";
|
|
6
|
+
function baseDraftText(request) {
|
|
7
|
+
const ids = request.sourceRefs.map((s) => s.id).join(",");
|
|
8
|
+
return `draft:${request.candidateId}:grounded:${ids}`;
|
|
9
|
+
}
|
|
10
|
+
export async function draftOutreachMessage(request) {
|
|
11
|
+
const parsed = safeParseOutreachDraftRequest(request);
|
|
12
|
+
if (!parsed.success) {
|
|
13
|
+
return { status: "unavailable", reasons: ["outreach_draft_schema_invalid"] };
|
|
14
|
+
}
|
|
15
|
+
const r = parsed.data;
|
|
16
|
+
if (r.judgmentVerdict !== "allow") {
|
|
17
|
+
return { status: "unavailable", reasons: ["hard_decision_not_allow"] };
|
|
18
|
+
}
|
|
19
|
+
if (r.sourceRefs.length === 0) {
|
|
20
|
+
return { status: "unavailable", reasons: ["missing_resolved_source_refs"] };
|
|
21
|
+
}
|
|
22
|
+
const wording = r.deliveryContext.wordingMode;
|
|
23
|
+
if (wording === "sendable") {
|
|
24
|
+
return {
|
|
25
|
+
status: "ready",
|
|
26
|
+
draft: {
|
|
27
|
+
text: `${baseDraftText(r)};wording=sendable`,
|
|
28
|
+
deliveryWording: "sendable",
|
|
29
|
+
},
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
return {
|
|
33
|
+
status: "ready",
|
|
34
|
+
draft: {
|
|
35
|
+
text: `Not sent to the user (candidate only). Delivery state: ${r.deliveryContext.deliveryVerdict}. ${baseDraftText(r)}`,
|
|
36
|
+
deliveryWording: "not_sent_fallback_candidate",
|
|
37
|
+
},
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
export function createDraftOutreachMessagePort() {
|
|
41
|
+
return { draftOutreachMessage };
|
|
42
|
+
}
|
|
@@ -1,40 +1,40 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Evidence pack assembly, interest-basis selection, and Quiet narrative gate (T6.1.2 / ADR-004).
|
|
3
|
-
* Guidance does not own delivery or judgment; callers pass already-resolved refs.
|
|
4
|
-
*/
|
|
5
|
-
import type { GuidanceSourceRef } from "./outreach-draft-schema.js";
|
|
6
|
-
import type { UserInterestStaleness } from "../storage/user-interest/types.js";
|
|
7
|
-
import type { SourceCoverage } from "../storage/snapshots/types.js";
|
|
8
|
-
export type SourceCoveragePolicy = "strict" | "lenient";
|
|
9
|
-
export interface EvidencePack {
|
|
10
|
-
groundedRefs: GuidanceSourceRef[];
|
|
11
|
-
unresolvedIds: string[];
|
|
12
|
-
sensitiveBlocked: boolean;
|
|
13
|
-
policy: SourceCoveragePolicy;
|
|
14
|
-
}
|
|
15
|
-
export declare function buildEvidencePack(refs: GuidanceSourceRef[], opts?: {
|
|
16
|
-
policy?: SourceCoveragePolicy;
|
|
17
|
-
}): {
|
|
18
|
-
ok: true;
|
|
19
|
-
pack: EvidencePack;
|
|
20
|
-
} | {
|
|
21
|
-
ok: false;
|
|
22
|
-
reasons: string[];
|
|
23
|
-
};
|
|
24
|
-
export type InterestBasisMode = "evidence_only" | "interest_augmented" | "unavailable";
|
|
25
|
-
export declare function selectInterestBasis(input: {
|
|
26
|
-
staleness: UserInterestStaleness;
|
|
27
|
-
confidence: number;
|
|
28
|
-
signalCount: number;
|
|
29
|
-
}): InterestBasisMode;
|
|
30
|
-
export declare function buildQuietNarrativeGuidance(input: {
|
|
31
|
-
interestBasis: InterestBasisMode;
|
|
32
|
-
sourceCoverage: Pick<SourceCoverage, "coverageRatio" | "unsupportedClaims">;
|
|
33
|
-
outline: string[];
|
|
34
|
-
}): {
|
|
35
|
-
status: "ready";
|
|
36
|
-
hints: string[];
|
|
37
|
-
} | {
|
|
38
|
-
status: "unavailable";
|
|
39
|
-
reasons: string[];
|
|
40
|
-
};
|
|
1
|
+
/**
|
|
2
|
+
* Evidence pack assembly, interest-basis selection, and Quiet narrative gate (T6.1.2 / ADR-004).
|
|
3
|
+
* Guidance does not own delivery or judgment; callers pass already-resolved refs.
|
|
4
|
+
*/
|
|
5
|
+
import type { GuidanceSourceRef } from "./outreach-draft-schema.js";
|
|
6
|
+
import type { UserInterestStaleness } from "../storage/user-interest/types.js";
|
|
7
|
+
import type { SourceCoverage } from "../storage/snapshots/types.js";
|
|
8
|
+
export type SourceCoveragePolicy = "strict" | "lenient";
|
|
9
|
+
export interface EvidencePack {
|
|
10
|
+
groundedRefs: GuidanceSourceRef[];
|
|
11
|
+
unresolvedIds: string[];
|
|
12
|
+
sensitiveBlocked: boolean;
|
|
13
|
+
policy: SourceCoveragePolicy;
|
|
14
|
+
}
|
|
15
|
+
export declare function buildEvidencePack(refs: GuidanceSourceRef[], opts?: {
|
|
16
|
+
policy?: SourceCoveragePolicy;
|
|
17
|
+
}): {
|
|
18
|
+
ok: true;
|
|
19
|
+
pack: EvidencePack;
|
|
20
|
+
} | {
|
|
21
|
+
ok: false;
|
|
22
|
+
reasons: string[];
|
|
23
|
+
};
|
|
24
|
+
export type InterestBasisMode = "evidence_only" | "interest_augmented" | "unavailable";
|
|
25
|
+
export declare function selectInterestBasis(input: {
|
|
26
|
+
staleness: UserInterestStaleness;
|
|
27
|
+
confidence: number;
|
|
28
|
+
signalCount: number;
|
|
29
|
+
}): InterestBasisMode;
|
|
30
|
+
export declare function buildQuietNarrativeGuidance(input: {
|
|
31
|
+
interestBasis: InterestBasisMode;
|
|
32
|
+
sourceCoverage: Pick<SourceCoverage, "coverageRatio" | "unsupportedClaims">;
|
|
33
|
+
outline: string[];
|
|
34
|
+
}): {
|
|
35
|
+
status: "ready";
|
|
36
|
+
hints: string[];
|
|
37
|
+
} | {
|
|
38
|
+
status: "unavailable";
|
|
39
|
+
reasons: string[];
|
|
40
|
+
};
|