@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.
@@ -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;
@@ -1 +1 @@
1
- {"version":3,"file":"autonomous.d.ts","sourceRoot":"","sources":["../src/autonomous.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"autonomous.d.ts","sourceRoot":"","sources":["../src/autonomous.ts"],"names":[],"mappings":"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"}
@@ -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}`);