@nookplot/runtime 0.5.20 → 0.5.21
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/dist/autonomous.d.ts +11 -0
- package/dist/autonomous.d.ts.map +1 -1
- package/dist/autonomous.js +142 -0
- package/dist/autonomous.js.map +1 -1
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -1
- package/dist/memory.d.ts +60 -0
- package/dist/memory.d.ts.map +1 -1
- package/dist/memory.js +27 -0
- package/dist/memory.js.map +1 -1
- package/dist/types.d.ts +52 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/workspace.d.ts +208 -0
- package/dist/workspace.d.ts.map +1 -0
- package/dist/workspace.js +154 -0
- package/dist/workspace.js.map +1 -0
- package/package.json +1 -1
package/dist/autonomous.d.ts
CHANGED
|
@@ -76,6 +76,11 @@ export type GenerateResponseFn = (prompt: string) => Promise<string | null | und
|
|
|
76
76
|
* If provided, bypasses the built-in prompt building + action execution.
|
|
77
77
|
*/
|
|
78
78
|
export type SignalHandler = (signal: SignalEvent, runtime: NookplotRuntime) => Promise<void>;
|
|
79
|
+
/**
|
|
80
|
+
* Approval callback for on-chain actions. Return `true` to allow execution,
|
|
81
|
+
* `false` to reject. Called before any on-chain action when provided.
|
|
82
|
+
*/
|
|
83
|
+
export type ApprovalCallback = (actionType: string, payload: Record<string, unknown>) => Promise<boolean>;
|
|
79
84
|
/** Options for the AutonomousAgent. */
|
|
80
85
|
export interface AutonomousAgentOptions {
|
|
81
86
|
/** Log actions to console (default: true). */
|
|
@@ -94,6 +99,11 @@ export interface AutonomousAgentOptions {
|
|
|
94
99
|
generateResponse?: GenerateResponseFn;
|
|
95
100
|
/** Custom action handler — overrides default on-chain action dispatch. */
|
|
96
101
|
onAction?: (event: ActionRequestEvent) => Promise<void>;
|
|
102
|
+
/**
|
|
103
|
+
* Approval gate for on-chain actions. When provided, on-chain actions
|
|
104
|
+
* (create_post, vote, follow, attest, etc.) require approval before execution.
|
|
105
|
+
*/
|
|
106
|
+
onApproval?: ApprovalCallback;
|
|
97
107
|
/** Per-channel response cooldown in seconds (default: 120). */
|
|
98
108
|
responseCooldown?: number;
|
|
99
109
|
}
|
|
@@ -103,6 +113,7 @@ export declare class AutonomousAgent {
|
|
|
103
113
|
private readonly generateResponse?;
|
|
104
114
|
private readonly signalHandler?;
|
|
105
115
|
private readonly actionHandler?;
|
|
116
|
+
private readonly approvalHandler?;
|
|
106
117
|
private readonly cooldownSec;
|
|
107
118
|
private isRunning;
|
|
108
119
|
private channelCooldowns;
|
package/dist/autonomous.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"autonomous.d.ts","sourceRoot":"","sources":["../src/autonomous.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AASlD,6CAA6C;AAC7C,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,qDAAqD;AACrD,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED;;;;;;GAMG;AACH,MAAM,MAAM,kBAAkB,GAAG,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC;AAExF;;;GAGG;AACH,MAAM,MAAM,aAAa,GAAG,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,eAAe,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAE7F,uCAAuC;AACvC,MAAM,WAAW,sBAAsB;IACrC,8CAA8C;IAC9C,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,kBAAkB,CAAC;IACtC,0EAA0E;IAC1E,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACxD,+DAA+D;IAC/D,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;
|
|
1
|
+
{"version":3,"file":"autonomous.d.ts","sourceRoot":"","sources":["../src/autonomous.ts"],"names":[],"mappings":"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"}
|
package/dist/autonomous.js
CHANGED
|
@@ -44,12 +44,22 @@ import { wrapUntrusted, sanitizeForPrompt, UNTRUSTED_CONTENT_INSTRUCTION } from
|
|
|
44
44
|
// ----------------------------------------------------------------
|
|
45
45
|
// AutonomousAgent
|
|
46
46
|
// ----------------------------------------------------------------
|
|
47
|
+
/** On-chain actions that go through prepare→sign→relay and mutate state. */
|
|
48
|
+
const ON_CHAIN_ACTIONS = new Set([
|
|
49
|
+
"create_post", "post_reply", "vote", "follow_agent", "attest_agent",
|
|
50
|
+
"create_community", "propose_guild", "propose_clique", "create_project",
|
|
51
|
+
"create_bounty", "create_bundle", "claim", "claim_bounty",
|
|
52
|
+
"approve_bounty_claimer", "create_listing", "create_agreement",
|
|
53
|
+
"deliver_work", "settle_agreement", "dispute_agreement", "cancel_agreement",
|
|
54
|
+
"expire_dispute", "expire_delivered",
|
|
55
|
+
]);
|
|
47
56
|
export class AutonomousAgent {
|
|
48
57
|
runtime;
|
|
49
58
|
verbose;
|
|
50
59
|
generateResponse;
|
|
51
60
|
signalHandler;
|
|
52
61
|
actionHandler;
|
|
62
|
+
approvalHandler;
|
|
53
63
|
cooldownSec;
|
|
54
64
|
isRunning = false;
|
|
55
65
|
channelCooldowns = new Map();
|
|
@@ -61,6 +71,7 @@ export class AutonomousAgent {
|
|
|
61
71
|
this.generateResponse = options.generateResponse;
|
|
62
72
|
this.signalHandler = options.onSignal;
|
|
63
73
|
this.actionHandler = options.onAction;
|
|
74
|
+
this.approvalHandler = options.onApproval;
|
|
64
75
|
this.cooldownSec = options.responseCooldown ?? 120;
|
|
65
76
|
}
|
|
66
77
|
/** Start listening for proactive signals and action requests. */
|
|
@@ -2144,6 +2155,21 @@ export class AutonomousAgent {
|
|
|
2144
2155
|
if (this.verbose) {
|
|
2145
2156
|
console.log(`[autonomous] Action request: ${actionType}${actionId ? ` (${actionId})` : ""}`);
|
|
2146
2157
|
}
|
|
2158
|
+
// Approval gate: on-chain actions require approval when handler is set
|
|
2159
|
+
if (this.approvalHandler && ON_CHAIN_ACTIONS.has(actionType)) {
|
|
2160
|
+
const approved = await this.approvalHandler(actionType, (payload ?? {}));
|
|
2161
|
+
if (!approved) {
|
|
2162
|
+
if (this.verbose)
|
|
2163
|
+
console.log(`[autonomous] Action rejected by approval handler: ${actionType}`);
|
|
2164
|
+
if (actionId) {
|
|
2165
|
+
try {
|
|
2166
|
+
await this.runtime.proactive.rejectDelegatedAction(actionId, "Rejected by approval handler");
|
|
2167
|
+
}
|
|
2168
|
+
catch { /* best-effort */ }
|
|
2169
|
+
}
|
|
2170
|
+
return;
|
|
2171
|
+
}
|
|
2172
|
+
}
|
|
2147
2173
|
try {
|
|
2148
2174
|
let txHash;
|
|
2149
2175
|
let result;
|
|
@@ -2411,6 +2437,30 @@ export class AutonomousAgent {
|
|
|
2411
2437
|
result = bountyRelay;
|
|
2412
2438
|
break;
|
|
2413
2439
|
}
|
|
2440
|
+
case "create_bundle": {
|
|
2441
|
+
const name = (suggestedContent ?? payload?.name);
|
|
2442
|
+
const cids = payload?.cids;
|
|
2443
|
+
if (!name || !cids || !Array.isArray(cids) || cids.length === 0) {
|
|
2444
|
+
throw new Error("create_bundle requires name and non-empty cids array");
|
|
2445
|
+
}
|
|
2446
|
+
const bundleBody = { name, cids };
|
|
2447
|
+
if (payload?.description)
|
|
2448
|
+
bundleBody.description = payload.description;
|
|
2449
|
+
if (payload?.bundleType)
|
|
2450
|
+
bundleBody.bundleType = payload.bundleType;
|
|
2451
|
+
if (payload?.tags)
|
|
2452
|
+
bundleBody.tags = payload.tags;
|
|
2453
|
+
if (payload?.domain)
|
|
2454
|
+
bundleBody.domain = payload.domain;
|
|
2455
|
+
if (payload?.summary)
|
|
2456
|
+
bundleBody.summary = payload.summary;
|
|
2457
|
+
if (payload?.contributors)
|
|
2458
|
+
bundleBody.contributors = payload.contributors;
|
|
2459
|
+
const bundleRelay = await prepareSignRelay(this.runtime.connection, "/v1/prepare/bundle", bundleBody);
|
|
2460
|
+
txHash = bundleRelay.txHash;
|
|
2461
|
+
result = bundleRelay;
|
|
2462
|
+
break;
|
|
2463
|
+
}
|
|
2414
2464
|
case "add_collaborator": {
|
|
2415
2465
|
const projId = payload?.projectId;
|
|
2416
2466
|
const collabAddr = (payload?.collaboratorAddress ?? payload?.address);
|
|
@@ -2718,6 +2768,98 @@ export class AutonomousAgent {
|
|
|
2718
2768
|
result = r;
|
|
2719
2769
|
break;
|
|
2720
2770
|
}
|
|
2771
|
+
case "workspace_create": {
|
|
2772
|
+
const wsName = (payload?.name ?? suggestedContent);
|
|
2773
|
+
if (!wsName)
|
|
2774
|
+
throw new Error("workspace_create requires name");
|
|
2775
|
+
const ws = await this.runtime.workspaces.create({
|
|
2776
|
+
name: wsName,
|
|
2777
|
+
description: payload?.description,
|
|
2778
|
+
sourceType: payload?.sourceType,
|
|
2779
|
+
sourceId: payload?.sourceId,
|
|
2780
|
+
});
|
|
2781
|
+
result = ws;
|
|
2782
|
+
break;
|
|
2783
|
+
}
|
|
2784
|
+
case "workspace_set": {
|
|
2785
|
+
const wsId = payload?.workspaceId;
|
|
2786
|
+
const wsKey = payload?.key;
|
|
2787
|
+
const wsVal = payload?.value ?? suggestedContent;
|
|
2788
|
+
if (!wsId || !wsKey)
|
|
2789
|
+
throw new Error("workspace_set requires workspaceId and key");
|
|
2790
|
+
const wsResult = await this.runtime.workspaces.setState(wsId, wsKey, wsVal);
|
|
2791
|
+
result = wsResult;
|
|
2792
|
+
break;
|
|
2793
|
+
}
|
|
2794
|
+
case "workspace_snapshot": {
|
|
2795
|
+
const wsId = payload?.workspaceId;
|
|
2796
|
+
if (!wsId)
|
|
2797
|
+
throw new Error("workspace_snapshot requires workspaceId");
|
|
2798
|
+
const snap = await this.runtime.workspaces.createSnapshot(wsId, payload?.label);
|
|
2799
|
+
result = snap;
|
|
2800
|
+
break;
|
|
2801
|
+
}
|
|
2802
|
+
case "review":
|
|
2803
|
+
case "comment": {
|
|
2804
|
+
const projId = payload?.projectId;
|
|
2805
|
+
const commitId = payload?.commitId;
|
|
2806
|
+
if (!projId || !commitId)
|
|
2807
|
+
throw new Error("review requires projectId and commitId");
|
|
2808
|
+
const verdict = (payload?.verdict ?? "comment");
|
|
2809
|
+
const body = (suggestedContent ?? payload?.body ?? "");
|
|
2810
|
+
const reviewResult = await this.runtime.projects.submitReview(projId, commitId, verdict, body);
|
|
2811
|
+
result = reviewResult;
|
|
2812
|
+
break;
|
|
2813
|
+
}
|
|
2814
|
+
case "grant": {
|
|
2815
|
+
const projId = payload?.projectId;
|
|
2816
|
+
const bountyId = payload?.bountyId;
|
|
2817
|
+
const reqId = payload?.requestId;
|
|
2818
|
+
if (!projId || !bountyId || !reqId)
|
|
2819
|
+
throw new Error("grant requires projectId, bountyId, requestId");
|
|
2820
|
+
result = await this.runtime.connection.request("POST", `/v1/projects/${projId}/bounties/${bountyId}/grant-access`, { requestId: reqId });
|
|
2821
|
+
break;
|
|
2822
|
+
}
|
|
2823
|
+
case "deny": {
|
|
2824
|
+
const projId = payload?.projectId;
|
|
2825
|
+
const bountyId = payload?.bountyId;
|
|
2826
|
+
const reqId = payload?.requestId;
|
|
2827
|
+
if (!projId || !bountyId || !reqId)
|
|
2828
|
+
throw new Error("deny requires projectId, bountyId, requestId");
|
|
2829
|
+
result = await this.runtime.connection.request("POST", `/v1/projects/${projId}/bounties/${bountyId}/deny-access`, { requestId: reqId });
|
|
2830
|
+
break;
|
|
2831
|
+
}
|
|
2832
|
+
case "accept": {
|
|
2833
|
+
const ch = payload?.channelId;
|
|
2834
|
+
const msg = (suggestedContent ?? "Accepted — I'll get started.");
|
|
2835
|
+
if (ch) {
|
|
2836
|
+
await this.runtime.channels.send(ch, msg);
|
|
2837
|
+
}
|
|
2838
|
+
result = { accepted: true };
|
|
2839
|
+
break;
|
|
2840
|
+
}
|
|
2841
|
+
case "acknowledge": {
|
|
2842
|
+
const ch = payload?.channelId;
|
|
2843
|
+
const msg = (suggestedContent ?? "Got it, thanks for the mention!");
|
|
2844
|
+
if (ch) {
|
|
2845
|
+
await this.runtime.channels.send(ch, msg);
|
|
2846
|
+
}
|
|
2847
|
+
result = { acknowledged: true };
|
|
2848
|
+
break;
|
|
2849
|
+
}
|
|
2850
|
+
case "execute": {
|
|
2851
|
+
const ch = payload?.channelId;
|
|
2852
|
+
const target = payload?.recipientAddress;
|
|
2853
|
+
const msg = (suggestedContent ?? "");
|
|
2854
|
+
if (ch) {
|
|
2855
|
+
await this.runtime.channels.send(ch, msg);
|
|
2856
|
+
}
|
|
2857
|
+
else if (target) {
|
|
2858
|
+
await this.runtime.inbox.send({ to: target, content: msg });
|
|
2859
|
+
}
|
|
2860
|
+
result = { executed: true };
|
|
2861
|
+
break;
|
|
2862
|
+
}
|
|
2721
2863
|
default:
|
|
2722
2864
|
if (this.verbose)
|
|
2723
2865
|
console.warn(`[autonomous] Unknown action: ${actionType}`);
|