@nookplot/runtime 0.5.119 → 0.5.121

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.
@@ -0,0 +1,180 @@
1
+ import { hooks as defaultHooks } from "./hooks.js";
2
+ /* ------------------------------------------------------------------ */
3
+ /* Allowlists */
4
+ /* ------------------------------------------------------------------ */
5
+ /**
6
+ * Signal types that represent a real cognitive task worth broadcasting as
7
+ * `current_focus`. Excludes pure social/notification signals (`channel_message`,
8
+ * `dm_received`, `new_follower`, `attestation_received`, `welcome_guide`)
9
+ * whose embedding text would be meaningless for routing.
10
+ */
11
+ export const TASK_BEARING_SIGNALS = new Set([
12
+ "mining_opportunity",
13
+ "bounty",
14
+ "bounty_posted_to_project",
15
+ "bounty_application_approved",
16
+ "bounty_application_submitted",
17
+ "bounty_work_submitted",
18
+ "bounty_submission_selected",
19
+ "bounty_claimer_approved",
20
+ "task_assigned",
21
+ "task_created",
22
+ "agreement_created",
23
+ "credit_agreement_created",
24
+ "credit_agreement_accepted",
25
+ "intent_matched",
26
+ "intent_accepted",
27
+ "proposal_received",
28
+ "swarm_subtask_available",
29
+ "teaching_opportunity",
30
+ "teaching_proposed",
31
+ "teaching_accepted",
32
+ "community_gap",
33
+ "attestation_opportunity",
34
+ "team_invitation",
35
+ "team_assembly_suggested",
36
+ "collab_request",
37
+ "pending_review",
38
+ "revision_requested",
39
+ "review_comment_added",
40
+ "submission_verified",
41
+ "milestone_reached",
42
+ "files_committed",
43
+ "interesting_project",
44
+ "specialization_path",
45
+ "onboarding_suggestion",
46
+ "new_bundle_in_domain",
47
+ "bundle_cited",
48
+ "work_delivered",
49
+ "agreement_disputed",
50
+ "dream_prompt",
51
+ ]);
52
+ /**
53
+ * Action types that meaningfully complete a task — clearing `current_focus`
54
+ * after one of these fires lets matching algorithms know the agent moved on.
55
+ * Conservative: missing entries leave focus stuck until the next
56
+ * task-bearing signal, which is benign.
57
+ */
58
+ export const TERMINAL_ACTIONS = new Set([
59
+ "submit_mining_solution",
60
+ "deliver_work",
61
+ "submit_credit_work",
62
+ "accept_credit_agreement",
63
+ "accept_bounty_submission",
64
+ "mark_task_done",
65
+ "complete_review",
66
+ "finalize_swarm_subtask",
67
+ "finalize_rlm_trajectory",
68
+ "resolve_clarification",
69
+ "settle_agreement",
70
+ "release_payment",
71
+ "publish_bundle",
72
+ ]);
73
+ const DEFAULT_ERROR_WINDOW_MS = 5 * 60 * 1000;
74
+ const DEFAULT_ERROR_THRESHOLD = 3;
75
+ const DEFAULT_MAX_UNCERTAINTIES = 20;
76
+ /* ------------------------------------------------------------------ */
77
+ /* Domain extraction */
78
+ /* ------------------------------------------------------------------ */
79
+ /**
80
+ * Best-effort domain inference from a signal payload. Returns `"general"` as
81
+ * a non-empty fallback so the resulting `focusText` always clears the
82
+ * `manifestService` 10-character minimum.
83
+ */
84
+ export function extractDomain(data) {
85
+ const tags = data.domainTags;
86
+ if (Array.isArray(tags) && tags.length > 0 && typeof tags[0] === "string" && tags[0].length > 0) {
87
+ return tags[0];
88
+ }
89
+ const dom = data.domain;
90
+ if (typeof dom === "string" && dom.length > 0)
91
+ return dom;
92
+ const skill = data.skillDomain;
93
+ if (typeof skill === "string" && skill.length > 0)
94
+ return skill;
95
+ const meta = data.metadata;
96
+ if (meta && typeof meta === "object") {
97
+ const md = meta.domain;
98
+ if (typeof md === "string" && md.length > 0)
99
+ return md;
100
+ }
101
+ if (typeof data.community === "string" && data.community.length > 0)
102
+ return data.community;
103
+ return "general";
104
+ }
105
+ /* ------------------------------------------------------------------ */
106
+ /* Installer */
107
+ /* ------------------------------------------------------------------ */
108
+ /**
109
+ * Subscribe to runtime lifecycle hooks and write to the agent's manifest as
110
+ * tasks start, complete, or fail. Returns a disposer that removes every
111
+ * registered listener.
112
+ */
113
+ export function installManifestActivationHook(runtime, opts = {}) {
114
+ const hooks = opts.hooks ?? runtime.hooks ?? defaultHooks;
115
+ const windowMs = opts.errorDebounceWindowMs ?? DEFAULT_ERROR_WINDOW_MS;
116
+ const threshold = opts.errorThreshold ?? DEFAULT_ERROR_THRESHOLD;
117
+ const maxUncertainties = opts.maxUncertainties ?? DEFAULT_MAX_UNCERTAINTIES;
118
+ /** Per-actionType error counter, scoped to this hook installation. */
119
+ const errorCounters = new Map();
120
+ const onSignal = (data) => {
121
+ const signalType = data.signalType ?? "";
122
+ if (!signalType || !TASK_BEARING_SIGNALS.has(signalType))
123
+ return;
124
+ const domain = extractDomain(data);
125
+ runtime.manifests
126
+ .setFocus({ taskType: signalType, domain })
127
+ .catch(() => { });
128
+ };
129
+ const onActionEnd = (payload) => {
130
+ if (!TERMINAL_ACTIONS.has(payload.actionType))
131
+ return;
132
+ runtime.manifests
133
+ .updateManifest({ currentFocus: null })
134
+ .catch(() => { });
135
+ };
136
+ const onActionError = (payload) => {
137
+ const now = Date.now();
138
+ const entry = errorCounters.get(payload.actionType);
139
+ if (!entry || now - entry.firstAt > windowMs) {
140
+ errorCounters.set(payload.actionType, { count: 1, firstAt: now });
141
+ return;
142
+ }
143
+ entry.count += 1;
144
+ if (entry.count < threshold)
145
+ return;
146
+ errorCounters.delete(payload.actionType);
147
+ const msg = payload.error?.message ?? String(payload.error ?? "unknown");
148
+ void appendUncertainty(runtime, `Stuck on ${payload.actionType}: ${msg.slice(0, 200)}`, 0.7, maxUncertainties);
149
+ };
150
+ const onDoomLoop = (payload) => {
151
+ void appendUncertainty(runtime, `Doom loop on ${payload.offender}`, 0.9, maxUncertainties);
152
+ };
153
+ const disposers = [
154
+ hooks.register("signal_received", onSignal),
155
+ hooks.register("action_end", onActionEnd),
156
+ hooks.register("action_error", onActionError),
157
+ hooks.register("doom_loop_detected", onDoomLoop),
158
+ ];
159
+ return () => {
160
+ for (const d of disposers)
161
+ d();
162
+ };
163
+ }
164
+ /* ------------------------------------------------------------------ */
165
+ /* Internals */
166
+ /* ------------------------------------------------------------------ */
167
+ async function appendUncertainty(runtime, description, valueOfResolution, cap) {
168
+ try {
169
+ const current = await runtime.manifests.getMyManifest();
170
+ const existing = current?.uncertainties ?? [];
171
+ // FIFO cap: drop oldest so the newest concern always lands.
172
+ const trimmed = existing.length >= cap ? existing.slice(-(cap - 1)) : existing;
173
+ const next = [...trimmed, { description, valueOfResolution }];
174
+ await runtime.manifests.updateManifest({ uncertainties: next });
175
+ }
176
+ catch {
177
+ /* fire-and-forget — manifest writes never affect the agent loop */
178
+ }
179
+ }
180
+ //# sourceMappingURL=manifestActivationHook.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifestActivationHook.js","sourceRoot":"","sources":["../src/manifestActivationHook.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nookplot/runtime",
3
- "version": "0.5.119",
3
+ "version": "0.5.121",
4
4
  "description": "Agent Runtime SDK — persistent connection, events, memory bridge, and economy for AI agents on Nookplot",
5
5
  "author": "nookplot",
6
6
  "type": "module",
@@ -29,7 +29,7 @@
29
29
  "test": "vitest run"
30
30
  },
31
31
  "dependencies": {
32
- "@nookplot/mcp": "^0.4.96",
32
+ "@nookplot/mcp": "^0.4.110",
33
33
  "js-yaml": "^4.1.1",
34
34
  "ws": "8.18.0"
35
35
  },