@nookplot/runtime 0.5.131 → 0.5.132
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/__tests__/apiMarketplace.test.d.ts +2 -0
- package/dist/__tests__/apiMarketplace.test.d.ts.map +1 -0
- package/dist/__tests__/apiMarketplace.test.js +102 -0
- package/dist/__tests__/apiMarketplace.test.js.map +1 -0
- package/dist/__tests__/autonomous.actionDispatch.test.d.ts +2 -0
- package/dist/__tests__/autonomous.actionDispatch.test.d.ts.map +1 -0
- package/dist/__tests__/autonomous.actionDispatch.test.js +287 -0
- package/dist/__tests__/autonomous.actionDispatch.test.js.map +1 -0
- package/dist/__tests__/autonomous.dedup.test.d.ts +2 -0
- package/dist/__tests__/autonomous.dedup.test.d.ts.map +1 -0
- package/dist/__tests__/autonomous.dedup.test.js +125 -0
- package/dist/__tests__/autonomous.dedup.test.js.map +1 -0
- package/dist/__tests__/autonomous.doomLoop.test.d.ts +2 -0
- package/dist/__tests__/autonomous.doomLoop.test.d.ts.map +1 -0
- package/dist/__tests__/autonomous.doomLoop.test.js +126 -0
- package/dist/__tests__/autonomous.doomLoop.test.js.map +1 -0
- package/dist/__tests__/autonomous.getAvailableActions.test.d.ts +2 -0
- package/dist/__tests__/autonomous.getAvailableActions.test.d.ts.map +1 -0
- package/dist/__tests__/autonomous.getAvailableActions.test.js +233 -0
- package/dist/__tests__/autonomous.getAvailableActions.test.js.map +1 -0
- package/dist/__tests__/autonomous.guardrails.test.d.ts +2 -0
- package/dist/__tests__/autonomous.guardrails.test.d.ts.map +1 -0
- package/dist/__tests__/autonomous.guardrails.test.js +215 -0
- package/dist/__tests__/autonomous.guardrails.test.js.map +1 -0
- package/dist/__tests__/autonomous.hooks.test.d.ts +2 -0
- package/dist/__tests__/autonomous.hooks.test.d.ts.map +1 -0
- package/dist/__tests__/autonomous.hooks.test.js +107 -0
- package/dist/__tests__/autonomous.hooks.test.js.map +1 -0
- package/dist/__tests__/autonomous.latentSpace.test.d.ts +2 -0
- package/dist/__tests__/autonomous.latentSpace.test.d.ts.map +1 -0
- package/dist/__tests__/autonomous.latentSpace.test.js +224 -0
- package/dist/__tests__/autonomous.latentSpace.test.js.map +1 -0
- package/dist/__tests__/autonomous.lifecycle.test.d.ts +2 -0
- package/dist/__tests__/autonomous.lifecycle.test.d.ts.map +1 -0
- package/dist/__tests__/autonomous.lifecycle.test.js +147 -0
- package/dist/__tests__/autonomous.lifecycle.test.js.map +1 -0
- package/dist/__tests__/autonomous.loadedSkillRefs.test.d.ts +2 -0
- package/dist/__tests__/autonomous.loadedSkillRefs.test.d.ts.map +1 -0
- package/dist/__tests__/autonomous.loadedSkillRefs.test.js +150 -0
- package/dist/__tests__/autonomous.loadedSkillRefs.test.js.map +1 -0
- package/dist/__tests__/chatEngine.episodicHook.test.d.ts +2 -0
- package/dist/__tests__/chatEngine.episodicHook.test.d.ts.map +1 -0
- package/dist/__tests__/chatEngine.episodicHook.test.js +160 -0
- package/dist/__tests__/chatEngine.episodicHook.test.js.map +1 -0
- package/dist/__tests__/chatEngine.test.d.ts +2 -0
- package/dist/__tests__/chatEngine.test.d.ts.map +1 -0
- package/dist/__tests__/chatEngine.test.js +482 -0
- package/dist/__tests__/chatEngine.test.js.map +1 -0
- package/dist/__tests__/codegen-drift.test.d.ts +23 -0
- package/dist/__tests__/codegen-drift.test.d.ts.map +1 -0
- package/dist/__tests__/codegen-drift.test.js +185 -0
- package/dist/__tests__/codegen-drift.test.js.map +1 -0
- package/dist/__tests__/contentSafety.test.d.ts +2 -0
- package/dist/__tests__/contentSafety.test.d.ts.map +1 -0
- package/dist/__tests__/contentSafety.test.js +90 -0
- package/dist/__tests__/contentSafety.test.js.map +1 -0
- package/dist/__tests__/conversation/compactionMemory.test.d.ts +2 -0
- package/dist/__tests__/conversation/compactionMemory.test.d.ts.map +1 -0
- package/dist/__tests__/conversation/compactionMemory.test.js +447 -0
- package/dist/__tests__/conversation/compactionMemory.test.js.map +1 -0
- package/dist/__tests__/conversation/modelThresholdsParity.test.d.ts +2 -0
- package/dist/__tests__/conversation/modelThresholdsParity.test.d.ts.map +1 -0
- package/dist/__tests__/conversation/modelThresholdsParity.test.js +79 -0
- package/dist/__tests__/conversation/modelThresholdsParity.test.js.map +1 -0
- package/dist/__tests__/doomLoop.test.d.ts +6 -0
- package/dist/__tests__/doomLoop.test.d.ts.map +1 -0
- package/dist/__tests__/doomLoop.test.js +144 -0
- package/dist/__tests__/doomLoop.test.js.map +1 -0
- package/dist/__tests__/guardrails.test.d.ts +2 -0
- package/dist/__tests__/guardrails.test.d.ts.map +1 -0
- package/dist/__tests__/guardrails.test.js +236 -0
- package/dist/__tests__/guardrails.test.js.map +1 -0
- package/dist/__tests__/helpers/mockRuntime.d.ts +11 -0
- package/dist/__tests__/helpers/mockRuntime.d.ts.map +1 -0
- package/dist/__tests__/helpers/mockRuntime.js +146 -0
- package/dist/__tests__/helpers/mockRuntime.js.map +1 -0
- package/dist/__tests__/hooks.test.d.ts +9 -0
- package/dist/__tests__/hooks.test.d.ts.map +1 -0
- package/dist/__tests__/hooks.test.js +192 -0
- package/dist/__tests__/hooks.test.js.map +1 -0
- package/dist/__tests__/manifestActivationHook.test.d.ts +2 -0
- package/dist/__tests__/manifestActivationHook.test.d.ts.map +1 -0
- package/dist/__tests__/manifestActivationHook.test.js +312 -0
- package/dist/__tests__/manifestActivationHook.test.js.map +1 -0
- package/dist/__tests__/memory.test.d.ts +2 -0
- package/dist/__tests__/memory.test.d.ts.map +1 -0
- package/dist/__tests__/memory.test.js +192 -0
- package/dist/__tests__/memory.test.js.map +1 -0
- package/dist/__tests__/onChainActions.parity.test.d.ts +12 -0
- package/dist/__tests__/onChainActions.parity.test.d.ts.map +1 -0
- package/dist/__tests__/onChainActions.parity.test.js +104 -0
- package/dist/__tests__/onChainActions.parity.test.js.map +1 -0
- package/dist/__tests__/querySegmentation.test.d.ts +2 -0
- package/dist/__tests__/querySegmentation.test.d.ts.map +1 -0
- package/dist/__tests__/querySegmentation.test.js +187 -0
- package/dist/__tests__/querySegmentation.test.js.map +1 -0
- package/dist/__tests__/sandbox.test.d.ts +13 -0
- package/dist/__tests__/sandbox.test.d.ts.map +1 -0
- package/dist/__tests__/sandbox.test.js +413 -0
- package/dist/__tests__/sandbox.test.js.map +1 -0
- package/dist/__tests__/signing.test.d.ts +2 -0
- package/dist/__tests__/signing.test.d.ts.map +1 -0
- package/dist/__tests__/signing.test.js +260 -0
- package/dist/__tests__/signing.test.js.map +1 -0
- package/dist/__tests__/wakeUpStack.test.d.ts +2 -0
- package/dist/__tests__/wakeUpStack.test.d.ts.map +1 -0
- package/dist/__tests__/wakeUpStack.test.js +239 -0
- package/dist/__tests__/wakeUpStack.test.js.map +1 -0
- package/dist/actionCatalog.d.ts +57 -0
- package/dist/actionCatalog.d.ts.map +1 -0
- package/dist/actionCatalog.generated.d.ts +4 -0
- package/dist/actionCatalog.generated.d.ts.map +1 -0
- package/dist/actionCatalog.generated.js +2194 -0
- package/dist/actionCatalog.generated.js.map +1 -0
- package/dist/actionCatalog.js +214 -0
- package/dist/actionCatalog.js.map +1 -0
- package/dist/api-marketplace.d.ts +111 -0
- package/dist/api-marketplace.d.ts.map +1 -0
- package/dist/api-marketplace.js +154 -0
- package/dist/api-marketplace.js.map +1 -0
- package/dist/artifactEmbeddings.d.ts +69 -0
- package/dist/artifactEmbeddings.d.ts.map +1 -0
- package/dist/artifactEmbeddings.js +52 -0
- package/dist/artifactEmbeddings.js.map +1 -0
- package/dist/autonomous.d.ts +271 -0
- package/dist/autonomous.d.ts.map +1 -0
- package/dist/autonomous.js +3517 -0
- package/dist/autonomous.js.map +1 -0
- package/dist/bounties.d.ts +112 -0
- package/dist/bounties.d.ts.map +1 -0
- package/dist/bounties.js +140 -0
- package/dist/bounties.js.map +1 -0
- package/dist/bundles.d.ts +174 -0
- package/dist/bundles.d.ts.map +1 -0
- package/dist/bundles.js +208 -0
- package/dist/bundles.js.map +1 -0
- package/dist/channels.d.ts +131 -0
- package/dist/channels.d.ts.map +1 -0
- package/dist/channels.js +227 -0
- package/dist/channels.js.map +1 -0
- package/dist/chat/chatEngine.d.ts +138 -0
- package/dist/chat/chatEngine.d.ts.map +1 -0
- package/dist/chat/chatEngine.js +613 -0
- package/dist/chat/chatEngine.js.map +1 -0
- package/dist/chat/index.d.ts +30 -0
- package/dist/chat/index.d.ts.map +1 -0
- package/dist/chat/index.js +29 -0
- package/dist/chat/index.js.map +1 -0
- package/dist/chat/terminal.d.ts +19 -0
- package/dist/chat/terminal.d.ts.map +1 -0
- package/dist/chat/terminal.js +17 -0
- package/dist/chat/terminal.js.map +1 -0
- package/dist/chat/terminals/discordTerminal.d.ts +22 -0
- package/dist/chat/terminals/discordTerminal.d.ts.map +1 -0
- package/dist/chat/terminals/discordTerminal.js +132 -0
- package/dist/chat/terminals/discordTerminal.js.map +1 -0
- package/dist/chat/terminals/openclawTerminal.d.ts +43 -0
- package/dist/chat/terminals/openclawTerminal.d.ts.map +1 -0
- package/dist/chat/terminals/openclawTerminal.js +186 -0
- package/dist/chat/terminals/openclawTerminal.js.map +1 -0
- package/dist/chat/terminals/stdinTerminal.d.ts +18 -0
- package/dist/chat/terminals/stdinTerminal.d.ts.map +1 -0
- package/dist/chat/terminals/stdinTerminal.js +58 -0
- package/dist/chat/terminals/stdinTerminal.js.map +1 -0
- package/dist/chat/terminals/telegramTerminal.d.ts +27 -0
- package/dist/chat/terminals/telegramTerminal.d.ts.map +1 -0
- package/dist/chat/terminals/telegramTerminal.js +123 -0
- package/dist/chat/terminals/telegramTerminal.js.map +1 -0
- package/dist/cognitiveWorkspace.d.ts +107 -0
- package/dist/cognitiveWorkspace.d.ts.map +1 -0
- package/dist/cognitiveWorkspace.js +94 -0
- package/dist/cognitiveWorkspace.js.map +1 -0
- package/dist/communities.d.ts +40 -0
- package/dist/communities.d.ts.map +1 -0
- package/dist/communities.js +53 -0
- package/dist/communities.js.map +1 -0
- package/dist/connection.d.ts +90 -0
- package/dist/connection.d.ts.map +1 -0
- package/dist/connection.js +429 -0
- package/dist/connection.js.map +1 -0
- package/dist/contentSafety.d.ts +64 -0
- package/dist/contentSafety.d.ts.map +1 -0
- package/dist/contentSafety.js +119 -0
- package/dist/contentSafety.js.map +1 -0
- package/dist/conversation/compactionMemory.d.ts +124 -0
- package/dist/conversation/compactionMemory.d.ts.map +1 -0
- package/dist/conversation/compactionMemory.js +379 -0
- package/dist/conversation/compactionMemory.js.map +1 -0
- package/dist/conversation/conversationLogStore.d.ts +111 -0
- package/dist/conversation/conversationLogStore.d.ts.map +1 -0
- package/dist/conversation/conversationLogStore.js +248 -0
- package/dist/conversation/conversationLogStore.js.map +1 -0
- package/dist/conversation/conversationMemory.d.ts +59 -0
- package/dist/conversation/conversationMemory.d.ts.map +1 -0
- package/dist/conversation/conversationMemory.js +32 -0
- package/dist/conversation/conversationMemory.js.map +1 -0
- package/dist/conversation/index.d.ts +16 -0
- package/dist/conversation/index.d.ts.map +1 -0
- package/dist/conversation/index.js +5 -0
- package/dist/conversation/index.js.map +1 -0
- package/dist/conversation/modelLimits.d.ts +43 -0
- package/dist/conversation/modelLimits.d.ts.map +1 -0
- package/dist/conversation/modelLimits.js +67 -0
- package/dist/conversation/modelLimits.js.map +1 -0
- package/dist/cro.d.ts +243 -0
- package/dist/cro.d.ts.map +1 -0
- package/dist/cro.js +263 -0
- package/dist/cro.js.map +1 -0
- package/dist/defaultGuardrails.d.ts +21 -0
- package/dist/defaultGuardrails.d.ts.map +1 -0
- package/dist/defaultGuardrails.js +90 -0
- package/dist/defaultGuardrails.js.map +1 -0
- package/dist/delegations.d.ts +63 -0
- package/dist/delegations.d.ts.map +1 -0
- package/dist/delegations.js +41 -0
- package/dist/delegations.js.map +1 -0
- package/dist/discovery.d.ts +172 -0
- package/dist/discovery.d.ts.map +1 -0
- package/dist/discovery.js +300 -0
- package/dist/discovery.js.map +1 -0
- package/dist/doomLoop.d.ts +52 -0
- package/dist/doomLoop.d.ts.map +1 -0
- package/dist/doomLoop.js +173 -0
- package/dist/doomLoop.js.map +1 -0
- package/dist/economy.d.ts +244 -0
- package/dist/economy.d.ts.map +1 -0
- package/dist/economy.js +263 -0
- package/dist/economy.js.map +1 -0
- package/dist/email.d.ts +125 -0
- package/dist/email.d.ts.map +1 -0
- package/dist/email.js +91 -0
- package/dist/email.js.map +1 -0
- package/dist/embeddingExchange.d.ts +141 -0
- package/dist/embeddingExchange.d.ts.map +1 -0
- package/dist/embeddingExchange.js +95 -0
- package/dist/embeddingExchange.js.map +1 -0
- package/dist/episodicMemoryHook.d.ts +39 -0
- package/dist/episodicMemoryHook.d.ts.map +1 -0
- package/dist/episodicMemoryHook.js +58 -0
- package/dist/episodicMemoryHook.js.map +1 -0
- package/dist/evaluator.d.ts +113 -0
- package/dist/evaluator.d.ts.map +1 -0
- package/dist/evaluator.js +144 -0
- package/dist/evaluator.js.map +1 -0
- package/dist/events.d.ts +58 -0
- package/dist/events.d.ts.map +1 -0
- package/dist/events.js +86 -0
- package/dist/events.js.map +1 -0
- package/dist/formatters.d.ts +31 -0
- package/dist/formatters.d.ts.map +1 -0
- package/dist/formatters.js +227 -0
- package/dist/formatters.js.map +1 -0
- package/dist/gpu.d.ts +137 -0
- package/dist/gpu.d.ts.map +1 -0
- package/dist/gpu.js +166 -0
- package/dist/gpu.js.map +1 -0
- package/dist/guardrails.d.ts +182 -0
- package/dist/guardrails.d.ts.map +1 -0
- package/dist/guardrails.js +277 -0
- package/dist/guardrails.js.map +1 -0
- package/dist/guilds.d.ts +158 -0
- package/dist/guilds.d.ts.map +1 -0
- package/dist/guilds.js +205 -0
- package/dist/guilds.js.map +1 -0
- package/dist/heartbeat.d.ts +43 -0
- package/dist/heartbeat.d.ts.map +1 -0
- package/dist/heartbeat.js +72 -0
- package/dist/heartbeat.js.map +1 -0
- package/dist/hooks.d.ts +172 -0
- package/dist/hooks.d.ts.map +1 -0
- package/dist/hooks.js +91 -0
- package/dist/hooks.js.map +1 -0
- package/dist/identity.d.ts +61 -0
- package/dist/identity.d.ts.map +1 -0
- package/dist/identity.js +76 -0
- package/dist/identity.js.map +1 -0
- package/dist/inbox.d.ts +77 -0
- package/dist/inbox.d.ts.map +1 -0
- package/dist/inbox.js +98 -0
- package/dist/inbox.js.map +1 -0
- package/dist/index.d.ts +321 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +361 -0
- package/dist/index.js.map +1 -0
- package/dist/insights.d.ts +166 -0
- package/dist/insights.d.ts.map +1 -0
- package/dist/insights.js +100 -0
- package/dist/insights.js.map +1 -0
- package/dist/intents.d.ts +132 -0
- package/dist/intents.d.ts.map +1 -0
- package/dist/intents.js +81 -0
- package/dist/intents.js.map +1 -0
- package/dist/knowledgeContext.d.ts +68 -0
- package/dist/knowledgeContext.d.ts.map +1 -0
- package/dist/knowledgeContext.js +109 -0
- package/dist/knowledgeContext.js.map +1 -0
- package/dist/leaderboard.d.ts +30 -0
- package/dist/leaderboard.d.ts.map +1 -0
- package/dist/leaderboard.js +34 -0
- package/dist/leaderboard.js.map +1 -0
- package/dist/manifest.d.ts +127 -0
- package/dist/manifest.d.ts.map +1 -0
- package/dist/manifest.js +123 -0
- package/dist/manifest.js.map +1 -0
- package/dist/manifestActivationHook.d.ts +72 -0
- package/dist/manifestActivationHook.d.ts.map +1 -0
- package/dist/manifestActivationHook.js +180 -0
- package/dist/manifestActivationHook.js.map +1 -0
- package/dist/marketplace.d.ts +156 -0
- package/dist/marketplace.d.ts.map +1 -0
- package/dist/marketplace.js +215 -0
- package/dist/marketplace.js.map +1 -0
- package/dist/matching.d.ts +192 -0
- package/dist/matching.d.ts.map +1 -0
- package/dist/matching.js +138 -0
- package/dist/matching.js.map +1 -0
- package/dist/memory.d.ts +287 -0
- package/dist/memory.d.ts.map +1 -0
- package/dist/memory.js +379 -0
- package/dist/memory.js.map +1 -0
- package/dist/mining.d.ts +155 -0
- package/dist/mining.d.ts.map +1 -0
- package/dist/mining.js +365 -0
- package/dist/mining.js.map +1 -0
- package/dist/oracle.d.ts +30 -0
- package/dist/oracle.d.ts.map +1 -0
- package/dist/oracle.js +31 -0
- package/dist/oracle.js.map +1 -0
- package/dist/policies.d.ts +132 -0
- package/dist/policies.d.ts.map +1 -0
- package/dist/policies.js +62 -0
- package/dist/policies.js.map +1 -0
- package/dist/proactive.d.ts +197 -0
- package/dist/proactive.d.ts.map +1 -0
- package/dist/proactive.js +229 -0
- package/dist/proactive.js.map +1 -0
- package/dist/projects.d.ts +307 -0
- package/dist/projects.d.ts.map +1 -0
- package/dist/projects.js +438 -0
- package/dist/projects.js.map +1 -0
- package/dist/querySegmentation.d.ts +54 -0
- package/dist/querySegmentation.d.ts.map +1 -0
- package/dist/querySegmentation.js +80 -0
- package/dist/querySegmentation.js.map +1 -0
- package/dist/sandbox.d.ts +156 -0
- package/dist/sandbox.d.ts.map +1 -0
- package/dist/sandbox.js +425 -0
- package/dist/sandbox.js.map +1 -0
- package/dist/signalActionMap.d.ts +59 -0
- package/dist/signalActionMap.d.ts.map +1 -0
- package/dist/signalActionMap.js +305 -0
- package/dist/signalActionMap.js.map +1 -0
- package/dist/signing.d.ts +94 -0
- package/dist/signing.d.ts.map +1 -0
- package/dist/signing.js +158 -0
- package/dist/signing.js.map +1 -0
- package/dist/social.d.ts +176 -0
- package/dist/social.d.ts.map +1 -0
- package/dist/social.js +232 -0
- package/dist/social.js.map +1 -0
- package/dist/specialization.d.ts +108 -0
- package/dist/specialization.d.ts.map +1 -0
- package/dist/specialization.js +104 -0
- package/dist/specialization.js.map +1 -0
- package/dist/swarms.d.ts +106 -0
- package/dist/swarms.d.ts.map +1 -0
- package/dist/swarms.js +99 -0
- package/dist/swarms.js.map +1 -0
- package/dist/teaching.d.ts +171 -0
- package/dist/teaching.d.ts.map +1 -0
- package/dist/teaching.js +87 -0
- package/dist/teaching.js.map +1 -0
- package/dist/tools.d.ts +223 -0
- package/dist/tools.d.ts.map +1 -0
- package/dist/tools.js +325 -0
- package/dist/tools.js.map +1 -0
- package/dist/treasury-ops.d.ts +101 -0
- package/dist/treasury-ops.d.ts.map +1 -0
- package/dist/treasury-ops.js +59 -0
- package/dist/treasury-ops.js.map +1 -0
- package/dist/types.d.ts +1193 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +7 -0
- package/dist/types.js.map +1 -0
- package/dist/wakeUpStack.d.ts +94 -0
- package/dist/wakeUpStack.d.ts.map +1 -0
- package/dist/wakeUpStack.js +215 -0
- package/dist/wakeUpStack.js.map +1 -0
- package/dist/workspace.d.ts +318 -0
- package/dist/workspace.d.ts.map +1 -0
- package/dist/workspace.js +207 -0
- package/dist/workspace.js.map +1 -0
- package/dist/xmtp.d.ts +85 -0
- package/dist/xmtp.d.ts.map +1 -0
- package/dist/xmtp.js +250 -0
- package/dist/xmtp.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for runtime/src/signing.ts — EIP-712 ForwardRequest signing
|
|
3
|
+
* and the prepare→sign→relay / prepare→sign→send flows.
|
|
4
|
+
*
|
|
5
|
+
* Uses real ethers for signature production; mocks ConnectionManager.request.
|
|
6
|
+
* TEST_PRIVATE_KEY is a Hardhat default account (well-known public key).
|
|
7
|
+
*/
|
|
8
|
+
import { describe, it, expect, vi, beforeEach } from "vitest";
|
|
9
|
+
import { ethers } from "ethers";
|
|
10
|
+
import { signForwardRequest, prepareSignRelay, prepareSignSend, } from "../signing.js";
|
|
11
|
+
const TEST_PRIVATE_KEY = "0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80";
|
|
12
|
+
const TEST_ADDRESS = "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266";
|
|
13
|
+
const DOMAIN = {
|
|
14
|
+
name: "NookplotForwarder",
|
|
15
|
+
version: "1",
|
|
16
|
+
chainId: 8453,
|
|
17
|
+
verifyingContract: "0x0000000000000000000000000000000000000001",
|
|
18
|
+
};
|
|
19
|
+
const TYPES = {
|
|
20
|
+
ForwardRequest: [
|
|
21
|
+
{ name: "from", type: "address" },
|
|
22
|
+
{ name: "to", type: "address" },
|
|
23
|
+
{ name: "value", type: "uint256" },
|
|
24
|
+
{ name: "gas", type: "uint256" },
|
|
25
|
+
{ name: "nonce", type: "uint256" },
|
|
26
|
+
{ name: "deadline", type: "uint48" },
|
|
27
|
+
{ name: "data", type: "bytes" },
|
|
28
|
+
],
|
|
29
|
+
};
|
|
30
|
+
const FORWARD_REQUEST = {
|
|
31
|
+
from: TEST_ADDRESS,
|
|
32
|
+
to: "0x0000000000000000000000000000000000000002",
|
|
33
|
+
value: "0",
|
|
34
|
+
gas: "100000",
|
|
35
|
+
nonce: "0",
|
|
36
|
+
deadline: 9999999999,
|
|
37
|
+
data: "0xabcd",
|
|
38
|
+
};
|
|
39
|
+
function buildPrep(overrides = {}) {
|
|
40
|
+
return {
|
|
41
|
+
forwardRequest: { ...FORWARD_REQUEST },
|
|
42
|
+
domain: { ...DOMAIN },
|
|
43
|
+
types: { ...TYPES },
|
|
44
|
+
...overrides,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
function makeConn(privateKey = TEST_PRIVATE_KEY) {
|
|
48
|
+
const request = vi.fn();
|
|
49
|
+
const conn = {
|
|
50
|
+
privateKey,
|
|
51
|
+
request,
|
|
52
|
+
config: { rpcUrl: "https://mainnet.base.org" },
|
|
53
|
+
};
|
|
54
|
+
return { conn, request };
|
|
55
|
+
}
|
|
56
|
+
describe("signForwardRequest", () => {
|
|
57
|
+
it("produces a 65-byte hex signature", async () => {
|
|
58
|
+
const sig = await signForwardRequest(TEST_PRIVATE_KEY, DOMAIN, TYPES, FORWARD_REQUEST);
|
|
59
|
+
expect(sig).toMatch(/^0x[0-9a-fA-F]{130}$/);
|
|
60
|
+
});
|
|
61
|
+
it("signature recovers the signer address", async () => {
|
|
62
|
+
const sig = await signForwardRequest(TEST_PRIVATE_KEY, DOMAIN, TYPES, FORWARD_REQUEST);
|
|
63
|
+
const recovered = ethers.verifyTypedData(DOMAIN, TYPES, FORWARD_REQUEST, sig);
|
|
64
|
+
expect(recovered.toLowerCase()).toBe(TEST_ADDRESS.toLowerCase());
|
|
65
|
+
});
|
|
66
|
+
it("is deterministic for identical inputs", async () => {
|
|
67
|
+
const sig1 = await signForwardRequest(TEST_PRIVATE_KEY, DOMAIN, TYPES, FORWARD_REQUEST);
|
|
68
|
+
const sig2 = await signForwardRequest(TEST_PRIVATE_KEY, DOMAIN, TYPES, FORWARD_REQUEST);
|
|
69
|
+
expect(sig1).toBe(sig2);
|
|
70
|
+
});
|
|
71
|
+
it("differs across chain IDs (cross-chain replay protection)", async () => {
|
|
72
|
+
const sig1 = await signForwardRequest(TEST_PRIVATE_KEY, DOMAIN, TYPES, FORWARD_REQUEST);
|
|
73
|
+
const sig2 = await signForwardRequest(TEST_PRIVATE_KEY, { ...DOMAIN, chainId: 1 }, TYPES, FORWARD_REQUEST);
|
|
74
|
+
expect(sig1).not.toBe(sig2);
|
|
75
|
+
});
|
|
76
|
+
it("differs across verifyingContracts (cross-contract replay protection)", async () => {
|
|
77
|
+
const sig1 = await signForwardRequest(TEST_PRIVATE_KEY, DOMAIN, TYPES, FORWARD_REQUEST);
|
|
78
|
+
const sig2 = await signForwardRequest(TEST_PRIVATE_KEY, { ...DOMAIN, verifyingContract: "0x000000000000000000000000000000000000dEaD" }, TYPES, FORWARD_REQUEST);
|
|
79
|
+
expect(sig1).not.toBe(sig2);
|
|
80
|
+
});
|
|
81
|
+
it("differs across nonces (replay protection)", async () => {
|
|
82
|
+
const sig1 = await signForwardRequest(TEST_PRIVATE_KEY, DOMAIN, TYPES, FORWARD_REQUEST);
|
|
83
|
+
const sig2 = await signForwardRequest(TEST_PRIVATE_KEY, DOMAIN, TYPES, { ...FORWARD_REQUEST, nonce: "1" });
|
|
84
|
+
expect(sig1).not.toBe(sig2);
|
|
85
|
+
});
|
|
86
|
+
it("differs across data payloads", async () => {
|
|
87
|
+
const sig1 = await signForwardRequest(TEST_PRIVATE_KEY, DOMAIN, TYPES, FORWARD_REQUEST);
|
|
88
|
+
const sig2 = await signForwardRequest(TEST_PRIVATE_KEY, DOMAIN, TYPES, { ...FORWARD_REQUEST, data: "0xdeadbeef" });
|
|
89
|
+
expect(sig1).not.toBe(sig2);
|
|
90
|
+
});
|
|
91
|
+
it("rejects on invalid private key", async () => {
|
|
92
|
+
await expect(signForwardRequest("not-a-key", DOMAIN, TYPES, FORWARD_REQUEST)).rejects.toThrow();
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
describe("prepareSignRelay", () => {
|
|
96
|
+
let conn;
|
|
97
|
+
let request;
|
|
98
|
+
beforeEach(() => {
|
|
99
|
+
const m = makeConn();
|
|
100
|
+
conn = m.conn;
|
|
101
|
+
request = m.request;
|
|
102
|
+
vi.spyOn(console, "warn").mockImplementation(() => { });
|
|
103
|
+
});
|
|
104
|
+
it("posts to prepare path then to /v1/relay", async () => {
|
|
105
|
+
request
|
|
106
|
+
.mockResolvedValueOnce(buildPrep())
|
|
107
|
+
.mockResolvedValueOnce({ txHash: "0xRELAY", status: "ok" });
|
|
108
|
+
const result = await prepareSignRelay(conn, "/v1/prepare/follow", { target: "0xT" });
|
|
109
|
+
expect(request).toHaveBeenNthCalledWith(1, "POST", "/v1/prepare/follow", { target: "0xT" });
|
|
110
|
+
expect(request).toHaveBeenNthCalledWith(2, "POST", "/v1/relay", expect.objectContaining({
|
|
111
|
+
from: TEST_ADDRESS,
|
|
112
|
+
to: FORWARD_REQUEST.to,
|
|
113
|
+
value: "0",
|
|
114
|
+
gas: "100000",
|
|
115
|
+
nonce: "0",
|
|
116
|
+
deadline: 9999999999,
|
|
117
|
+
data: "0xabcd",
|
|
118
|
+
signature: expect.stringMatching(/^0x[0-9a-fA-F]{130}$/),
|
|
119
|
+
}));
|
|
120
|
+
expect(result).toEqual({ txHash: "0xRELAY" });
|
|
121
|
+
});
|
|
122
|
+
it("relay body signature recovers to the agent address", async () => {
|
|
123
|
+
request
|
|
124
|
+
.mockResolvedValueOnce(buildPrep())
|
|
125
|
+
.mockResolvedValueOnce({ txHash: "0xRELAY", status: "ok" });
|
|
126
|
+
await prepareSignRelay(conn, "/v1/prepare/follow", {});
|
|
127
|
+
const relayBody = request.mock.calls[1][2];
|
|
128
|
+
const recovered = ethers.verifyTypedData(DOMAIN, TYPES, FORWARD_REQUEST, relayBody.signature);
|
|
129
|
+
expect(recovered.toLowerCase()).toBe(TEST_ADDRESS.toLowerCase());
|
|
130
|
+
});
|
|
131
|
+
it("throws synchronously if private key not configured", () => {
|
|
132
|
+
const { conn: noKeyConn } = makeConn(null);
|
|
133
|
+
expect(() => prepareSignRelay(noKeyConn, "/v1/prepare/follow", {})).toThrow(/Private key not configured/i);
|
|
134
|
+
});
|
|
135
|
+
it("rejects if prepare response missing forwardRequest", async () => {
|
|
136
|
+
request.mockResolvedValueOnce({ domain: DOMAIN, types: TYPES });
|
|
137
|
+
await expect(prepareSignRelay(conn, "/v1/prepare/follow", {})).rejects.toThrow(/did not return a ForwardRequest/i);
|
|
138
|
+
});
|
|
139
|
+
it("rejects if prepare response missing domain", async () => {
|
|
140
|
+
request.mockResolvedValueOnce({ forwardRequest: FORWARD_REQUEST, types: TYPES });
|
|
141
|
+
await expect(prepareSignRelay(conn, "/v1/prepare/follow", {})).rejects.toThrow(/did not return a ForwardRequest/i);
|
|
142
|
+
});
|
|
143
|
+
it("rejects if prepare response missing types", async () => {
|
|
144
|
+
request.mockResolvedValueOnce({ forwardRequest: FORWARD_REQUEST, domain: DOMAIN });
|
|
145
|
+
await expect(prepareSignRelay(conn, "/v1/prepare/follow", {})).rejects.toThrow(/did not return a ForwardRequest/i);
|
|
146
|
+
});
|
|
147
|
+
it("retries once on 'signature verification failed' error", async () => {
|
|
148
|
+
request
|
|
149
|
+
.mockResolvedValueOnce(buildPrep())
|
|
150
|
+
.mockRejectedValueOnce(new Error("relay failed: signature verification failed"))
|
|
151
|
+
.mockResolvedValueOnce(buildPrep())
|
|
152
|
+
.mockResolvedValueOnce({ txHash: "0xRETRY", status: "ok" });
|
|
153
|
+
const result = await prepareSignRelay(conn, "/v1/prepare/follow", {});
|
|
154
|
+
expect(result).toEqual({ txHash: "0xRETRY" });
|
|
155
|
+
expect(request).toHaveBeenCalledTimes(4);
|
|
156
|
+
});
|
|
157
|
+
it("retries once on nonce-related error", async () => {
|
|
158
|
+
request
|
|
159
|
+
.mockResolvedValueOnce(buildPrep())
|
|
160
|
+
.mockRejectedValueOnce(new Error("invalid nonce: expected 5, got 3"))
|
|
161
|
+
.mockResolvedValueOnce(buildPrep())
|
|
162
|
+
.mockResolvedValueOnce({ txHash: "0xRETRY", status: "ok" });
|
|
163
|
+
const result = await prepareSignRelay(conn, "/v1/prepare/follow", {});
|
|
164
|
+
expect(result).toEqual({ txHash: "0xRETRY" });
|
|
165
|
+
expect(request).toHaveBeenCalledTimes(4);
|
|
166
|
+
});
|
|
167
|
+
it("does not retry on unrelated errors", async () => {
|
|
168
|
+
request
|
|
169
|
+
.mockResolvedValueOnce(buildPrep())
|
|
170
|
+
.mockRejectedValueOnce(new Error("HTTP 500: internal server error"));
|
|
171
|
+
await expect(prepareSignRelay(conn, "/v1/prepare/follow", {})).rejects.toThrow(/HTTP 500/);
|
|
172
|
+
expect(request).toHaveBeenCalledTimes(2);
|
|
173
|
+
});
|
|
174
|
+
it("does not retry beyond once when retry also fails", async () => {
|
|
175
|
+
request
|
|
176
|
+
.mockResolvedValueOnce(buildPrep())
|
|
177
|
+
.mockRejectedValueOnce(new Error("nonce too low"))
|
|
178
|
+
.mockResolvedValueOnce(buildPrep())
|
|
179
|
+
.mockRejectedValueOnce(new Error("nonce too low"));
|
|
180
|
+
await expect(prepareSignRelay(conn, "/v1/prepare/follow", {})).rejects.toThrow(/nonce too low/);
|
|
181
|
+
expect(request).toHaveBeenCalledTimes(4);
|
|
182
|
+
});
|
|
183
|
+
it("serializes concurrent calls for the same private key", async () => {
|
|
184
|
+
let inFlight = 0;
|
|
185
|
+
let maxInFlight = 0;
|
|
186
|
+
request.mockImplementation(async (_method, path) => {
|
|
187
|
+
inFlight++;
|
|
188
|
+
maxInFlight = Math.max(maxInFlight, inFlight);
|
|
189
|
+
await new Promise((r) => setTimeout(r, 10));
|
|
190
|
+
inFlight--;
|
|
191
|
+
if (path === "/v1/relay") {
|
|
192
|
+
return { txHash: "0x" + path.length.toString(16).padStart(64, "0"), status: "ok" };
|
|
193
|
+
}
|
|
194
|
+
return buildPrep();
|
|
195
|
+
});
|
|
196
|
+
await Promise.all([
|
|
197
|
+
prepareSignRelay(conn, "/v1/prepare/a", {}),
|
|
198
|
+
prepareSignRelay(conn, "/v1/prepare/b", {}),
|
|
199
|
+
prepareSignRelay(conn, "/v1/prepare/c", {}),
|
|
200
|
+
]);
|
|
201
|
+
expect(maxInFlight).toBe(1);
|
|
202
|
+
});
|
|
203
|
+
it("does not serialize across different private keys", async () => {
|
|
204
|
+
const m1 = makeConn(TEST_PRIVATE_KEY);
|
|
205
|
+
const m2 = makeConn("0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d");
|
|
206
|
+
let inFlight = 0;
|
|
207
|
+
let maxInFlight = 0;
|
|
208
|
+
const handler = async (_method, path) => {
|
|
209
|
+
inFlight++;
|
|
210
|
+
maxInFlight = Math.max(maxInFlight, inFlight);
|
|
211
|
+
await new Promise((r) => setTimeout(r, 10));
|
|
212
|
+
inFlight--;
|
|
213
|
+
if (path === "/v1/relay")
|
|
214
|
+
return { txHash: "0xOK", status: "ok" };
|
|
215
|
+
return buildPrep();
|
|
216
|
+
};
|
|
217
|
+
m1.request.mockImplementation(handler);
|
|
218
|
+
m2.request.mockImplementation(handler);
|
|
219
|
+
await Promise.all([
|
|
220
|
+
prepareSignRelay(m1.conn, "/v1/prepare/a", {}),
|
|
221
|
+
prepareSignRelay(m2.conn, "/v1/prepare/b", {}),
|
|
222
|
+
]);
|
|
223
|
+
expect(maxInFlight).toBeGreaterThan(1);
|
|
224
|
+
});
|
|
225
|
+
});
|
|
226
|
+
describe("prepareSignSend", () => {
|
|
227
|
+
it("returns empty txHashes when prepare yields no txRequests", async () => {
|
|
228
|
+
const { conn, request } = makeConn();
|
|
229
|
+
request.mockResolvedValueOnce({ txRequests: [], meta: { reason: "nothing-to-claim" } });
|
|
230
|
+
const result = await prepareSignSend(conn, "/v1/prepare/raw/claim", {});
|
|
231
|
+
expect(result).toEqual({ txHashes: [], meta: { reason: "nothing-to-claim" } });
|
|
232
|
+
});
|
|
233
|
+
it("throws synchronously if private key not configured", () => {
|
|
234
|
+
const { conn } = makeConn(null);
|
|
235
|
+
expect(() => prepareSignSend(conn, "/v1/prepare/raw/claim", {})).toThrow(/Private key not configured/i);
|
|
236
|
+
});
|
|
237
|
+
it("rejects if prepare returns no txRequests array", async () => {
|
|
238
|
+
const { conn, request } = makeConn();
|
|
239
|
+
request.mockResolvedValueOnce({ meta: {} });
|
|
240
|
+
await expect(prepareSignSend(conn, "/v1/prepare/raw/claim", {})).rejects.toThrow(/did not return txRequests/i);
|
|
241
|
+
});
|
|
242
|
+
it("rejects if prepare returns non-array txRequests", async () => {
|
|
243
|
+
const { conn, request } = makeConn();
|
|
244
|
+
request.mockResolvedValueOnce({ txRequests: "not-an-array" });
|
|
245
|
+
await expect(prepareSignSend(conn, "/v1/prepare/raw/claim", {})).rejects.toThrow(/did not return txRequests/i);
|
|
246
|
+
});
|
|
247
|
+
it("returns empty meta object when meta absent and txRequests empty", async () => {
|
|
248
|
+
const { conn, request } = makeConn();
|
|
249
|
+
request.mockResolvedValueOnce({ txRequests: [] });
|
|
250
|
+
const result = await prepareSignSend(conn, "/v1/prepare/raw/claim", {});
|
|
251
|
+
expect(result.meta).toEqual({});
|
|
252
|
+
});
|
|
253
|
+
it("posts to prepare path with body", async () => {
|
|
254
|
+
const { conn, request } = makeConn();
|
|
255
|
+
request.mockResolvedValueOnce({ txRequests: [] });
|
|
256
|
+
await prepareSignSend(conn, "/v1/prepare/raw/claim", { epoch: 42 });
|
|
257
|
+
expect(request).toHaveBeenCalledWith("POST", "/v1/prepare/raw/claim", { epoch: 42 });
|
|
258
|
+
});
|
|
259
|
+
});
|
|
260
|
+
//# sourceMappingURL=signing.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signing.test.js","sourceRoot":"","sources":["../../src/__tests__/signing.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wakeUpStack.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/wakeUpStack.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for WakeUpStack — tiered context assembly (Change 1 of mempalace spec).
|
|
3
|
+
*
|
|
4
|
+
* Mocks the runtime's `connection.request` to feed canned wake-up payloads,
|
|
5
|
+
* then asserts the tier composition, L1 cache TTL, L2 divergence heuristic,
|
|
6
|
+
* and signal-type → selection-mode wiring that the autonomous agent depends on.
|
|
7
|
+
*/
|
|
8
|
+
import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
|
|
9
|
+
import { WakeUpStack } from "../wakeUpStack.js";
|
|
10
|
+
function makeRuntime() {
|
|
11
|
+
return {
|
|
12
|
+
connection: { request: vi.fn() },
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Canned wake-up payload with 2 top domains and 1 L1 essential.
|
|
17
|
+
* Note: uses `"key" in opts` checks (not `??`) so callers can explicitly pass
|
|
18
|
+
* `role: null` to represent a missing role without being overridden by defaults.
|
|
19
|
+
*/
|
|
20
|
+
function payloadWith(opts = {}) {
|
|
21
|
+
const topDomains = "domains" in opts
|
|
22
|
+
? opts.domains
|
|
23
|
+
: [
|
|
24
|
+
{ domain: "security", depth: "expert", items: 40 },
|
|
25
|
+
{ domain: "rust", depth: "proficient", items: 12 },
|
|
26
|
+
];
|
|
27
|
+
const role = "role" in opts ? opts.role : "Security researcher";
|
|
28
|
+
const essentials = "essentials" in opts
|
|
29
|
+
? opts.essentials
|
|
30
|
+
: [
|
|
31
|
+
{
|
|
32
|
+
id: "e-1",
|
|
33
|
+
domain: "security",
|
|
34
|
+
title: "Audit checklist",
|
|
35
|
+
snippet: "Always check reentrancy first",
|
|
36
|
+
qualityScore: 85,
|
|
37
|
+
},
|
|
38
|
+
];
|
|
39
|
+
return {
|
|
40
|
+
l0: { topDomains, role },
|
|
41
|
+
l1: { essentials },
|
|
42
|
+
tokenEstimate: 150,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
describe("WakeUpStack.getContext", () => {
|
|
46
|
+
let runtime;
|
|
47
|
+
beforeEach(() => {
|
|
48
|
+
runtime = makeRuntime();
|
|
49
|
+
runtime.connection.request.mockResolvedValue(payloadWith());
|
|
50
|
+
});
|
|
51
|
+
afterEach(() => {
|
|
52
|
+
vi.restoreAllMocks();
|
|
53
|
+
});
|
|
54
|
+
it("fetches the wake-up payload from the correct endpoint", async () => {
|
|
55
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
56
|
+
const stack = new WakeUpStack(runtime);
|
|
57
|
+
await stack.getContext("review this audit");
|
|
58
|
+
expect(runtime.connection.request).toHaveBeenCalledWith("GET", "/v1/agents/me/knowledge/wake-up");
|
|
59
|
+
});
|
|
60
|
+
it("returns L0 + L1 layers with combined markdown", async () => {
|
|
61
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
62
|
+
const stack = new WakeUpStack(runtime);
|
|
63
|
+
// Query word "security" overlaps top domain → L2 should be skipped
|
|
64
|
+
const result = await stack.getContext("security audit today");
|
|
65
|
+
expect(result.layers.length).toBeGreaterThanOrEqual(2);
|
|
66
|
+
expect(result.layers[0].tier).toBe(0);
|
|
67
|
+
expect(result.layers[1].tier).toBe(1);
|
|
68
|
+
expect(result.markdown).toContain("Identity");
|
|
69
|
+
expect(result.markdown).toContain("Security researcher");
|
|
70
|
+
expect(result.markdown).toContain("Essential knowledge");
|
|
71
|
+
expect(result.markdown).toContain("Audit checklist");
|
|
72
|
+
});
|
|
73
|
+
it("tracks L1 item IDs for citation", async () => {
|
|
74
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
75
|
+
const stack = new WakeUpStack(runtime);
|
|
76
|
+
const result = await stack.getContext("security check");
|
|
77
|
+
expect(result.itemIds).toContain("e-1");
|
|
78
|
+
});
|
|
79
|
+
it("caches L0+L1 between calls (single round-trip for 2 calls)", async () => {
|
|
80
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
81
|
+
const stack = new WakeUpStack(runtime);
|
|
82
|
+
await stack.getContext("first security task");
|
|
83
|
+
await stack.getContext("second security task");
|
|
84
|
+
// Only one wake-up fetch — L1 cached
|
|
85
|
+
expect(runtime.connection.request).toHaveBeenCalledTimes(1);
|
|
86
|
+
});
|
|
87
|
+
it("refreshEssentials() invalidates the cache", async () => {
|
|
88
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
89
|
+
const stack = new WakeUpStack(runtime);
|
|
90
|
+
await stack.getContext("security task");
|
|
91
|
+
await stack.refreshEssentials();
|
|
92
|
+
await stack.getContext("security task");
|
|
93
|
+
expect(runtime.connection.request).toHaveBeenCalledTimes(2);
|
|
94
|
+
});
|
|
95
|
+
it("degrades gracefully when the wake-up endpoint fails", async () => {
|
|
96
|
+
runtime.connection.request.mockRejectedValueOnce(new Error("boom"));
|
|
97
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
98
|
+
const stack = new WakeUpStack(runtime);
|
|
99
|
+
const result = await stack.getContext("any task");
|
|
100
|
+
// Should not throw, returns empty layers
|
|
101
|
+
expect(result.markdown).toBe("");
|
|
102
|
+
expect(result.layers.length).toBeGreaterThanOrEqual(2);
|
|
103
|
+
expect(result.layers[0].itemIds).toEqual([]);
|
|
104
|
+
});
|
|
105
|
+
it("triggers L2 when task diverges from L1 domains", async () => {
|
|
106
|
+
// First call: wake-up payload with "security" + "rust" domains
|
|
107
|
+
// Second call: the L2 knowledge search (triggered by off-domain task)
|
|
108
|
+
// "biology protein folding" shares no words with security/rust → needs L2
|
|
109
|
+
runtime.connection.request
|
|
110
|
+
.mockResolvedValueOnce(payloadWith())
|
|
111
|
+
.mockResolvedValueOnce({
|
|
112
|
+
results: [
|
|
113
|
+
{
|
|
114
|
+
item: {
|
|
115
|
+
id: "bio-1",
|
|
116
|
+
title: "Protein",
|
|
117
|
+
contentText: "Folding behavior",
|
|
118
|
+
domain: "biology",
|
|
119
|
+
qualityScore: 80,
|
|
120
|
+
},
|
|
121
|
+
score: 0.85,
|
|
122
|
+
},
|
|
123
|
+
],
|
|
124
|
+
});
|
|
125
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
126
|
+
const stack = new WakeUpStack(runtime);
|
|
127
|
+
const result = await stack.getContext("biology protein folding pathway");
|
|
128
|
+
// 2 calls: wake-up + L2 search
|
|
129
|
+
expect(runtime.connection.request).toHaveBeenCalledTimes(2);
|
|
130
|
+
const secondCall = runtime.connection.request.mock.calls[1];
|
|
131
|
+
expect(secondCall[0]).toBe("GET");
|
|
132
|
+
expect(secondCall[1]).toContain("/v1/agents/me/knowledge?");
|
|
133
|
+
// L2 layer should be appended
|
|
134
|
+
const l2 = result.layers.find((l) => l.tier === 2);
|
|
135
|
+
expect(l2).toBeDefined();
|
|
136
|
+
expect(l2.itemIds).toContain("bio-1");
|
|
137
|
+
});
|
|
138
|
+
it("skips L2 when task overlaps L1 domains (≥20% word overlap)", async () => {
|
|
139
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
140
|
+
const stack = new WakeUpStack(runtime);
|
|
141
|
+
// "security audit" — "security" overlaps "security" domain → ≥20% overlap → skip L2
|
|
142
|
+
await stack.getContext("security audit");
|
|
143
|
+
// Only the wake-up call, no L2 search
|
|
144
|
+
expect(runtime.connection.request).toHaveBeenCalledTimes(1);
|
|
145
|
+
});
|
|
146
|
+
it("forces L2 when agent has no L1 domains (empty domain set)", async () => {
|
|
147
|
+
runtime.connection.request
|
|
148
|
+
.mockResolvedValueOnce(payloadWith({ domains: [], role: null, essentials: [] }))
|
|
149
|
+
.mockResolvedValueOnce({ results: [] });
|
|
150
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
151
|
+
const stack = new WakeUpStack(runtime);
|
|
152
|
+
await stack.getContext("any task here");
|
|
153
|
+
// With no L1 domains, needsL2() returns true — so we attempt L2
|
|
154
|
+
expect(runtime.connection.request).toHaveBeenCalledTimes(2);
|
|
155
|
+
});
|
|
156
|
+
it("forwards signalType → selection_mode to the L2 search", async () => {
|
|
157
|
+
runtime.connection.request
|
|
158
|
+
.mockResolvedValueOnce(payloadWith())
|
|
159
|
+
.mockResolvedValueOnce({ results: [] });
|
|
160
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
161
|
+
const stack = new WakeUpStack(runtime);
|
|
162
|
+
// Task is off-domain to force L2. "dm_received" maps to "aggressive".
|
|
163
|
+
await stack.getContext("biology protein folding", "dm_received");
|
|
164
|
+
const l2Call = runtime.connection.request.mock.calls[1];
|
|
165
|
+
const l2Url = l2Call[1];
|
|
166
|
+
expect(l2Url).toContain("selection_mode=aggressive");
|
|
167
|
+
});
|
|
168
|
+
it("falls back to 'moderate' for unknown signal types", async () => {
|
|
169
|
+
runtime.connection.request
|
|
170
|
+
.mockResolvedValueOnce(payloadWith())
|
|
171
|
+
.mockResolvedValueOnce({ results: [] });
|
|
172
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
173
|
+
const stack = new WakeUpStack(runtime);
|
|
174
|
+
await stack.getContext("biology protein folding", "some_unknown_signal");
|
|
175
|
+
const l2Call = runtime.connection.request.mock.calls[1];
|
|
176
|
+
const l2Url = l2Call[1];
|
|
177
|
+
// "moderate" is the default; knowledgeContext only sends selection_mode when
|
|
178
|
+
// explicitly provided — but here WakeUpStack always resolves to something.
|
|
179
|
+
expect(l2Url).toContain("selection_mode=moderate");
|
|
180
|
+
});
|
|
181
|
+
it("uses 'lenient' for new_project signal (exploratory)", async () => {
|
|
182
|
+
runtime.connection.request
|
|
183
|
+
.mockResolvedValueOnce(payloadWith())
|
|
184
|
+
.mockResolvedValueOnce({ results: [] });
|
|
185
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
186
|
+
const stack = new WakeUpStack(runtime);
|
|
187
|
+
await stack.getContext("biology protein folding", "new_project");
|
|
188
|
+
const l2Call = runtime.connection.request.mock.calls[1];
|
|
189
|
+
const l2Url = l2Call[1];
|
|
190
|
+
expect(l2Url).toContain("selection_mode=lenient");
|
|
191
|
+
});
|
|
192
|
+
it("handles wake-up payload with missing role", async () => {
|
|
193
|
+
runtime.connection.request.mockResolvedValueOnce(payloadWith({ role: null }));
|
|
194
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
195
|
+
const stack = new WakeUpStack(runtime);
|
|
196
|
+
const result = await stack.getContext("security work");
|
|
197
|
+
// No crash; markdown still produced for domains + essentials
|
|
198
|
+
expect(result.markdown).not.toContain("Role:");
|
|
199
|
+
expect(result.markdown).toContain("security");
|
|
200
|
+
});
|
|
201
|
+
it("builds L1 snippet with domain prefix when domain present", async () => {
|
|
202
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
203
|
+
const stack = new WakeUpStack(runtime);
|
|
204
|
+
const result = await stack.getContext("security work");
|
|
205
|
+
expect(result.markdown).toContain("[security]");
|
|
206
|
+
});
|
|
207
|
+
it("L2 failure is non-fatal (returns L0+L1 only)", async () => {
|
|
208
|
+
runtime.connection.request
|
|
209
|
+
.mockResolvedValueOnce(payloadWith())
|
|
210
|
+
.mockRejectedValueOnce(new Error("L2 search failed"));
|
|
211
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
212
|
+
const stack = new WakeUpStack(runtime);
|
|
213
|
+
const result = await stack.getContext("biology protein folding");
|
|
214
|
+
// L0 + L1 should still be present even though L2 failed
|
|
215
|
+
expect(result.layers.length).toBe(2);
|
|
216
|
+
expect(result.layers[0].tier).toBe(0);
|
|
217
|
+
expect(result.layers[1].tier).toBe(1);
|
|
218
|
+
expect(result.markdown).toContain("Identity");
|
|
219
|
+
});
|
|
220
|
+
it("token estimate sums across loaded layers", async () => {
|
|
221
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
222
|
+
const stack = new WakeUpStack(runtime);
|
|
223
|
+
const result = await stack.getContext("security work");
|
|
224
|
+
expect(result.tokenEstimate).toBeGreaterThan(0);
|
|
225
|
+
});
|
|
226
|
+
it("L0 markdown omits entire block when payload has no role and no domains", async () => {
|
|
227
|
+
runtime.connection.request.mockResolvedValueOnce(payloadWith({ domains: [], role: null, essentials: [] }));
|
|
228
|
+
// With no domains, needsL2 will fire → mock the L2 response
|
|
229
|
+
runtime.connection.request.mockResolvedValueOnce({ results: [] });
|
|
230
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
231
|
+
const stack = new WakeUpStack(runtime);
|
|
232
|
+
const result = await stack.getContext("anything");
|
|
233
|
+
// L0 layer is present but markdown is empty
|
|
234
|
+
const l0 = result.layers.find((l) => l.tier === 0);
|
|
235
|
+
expect(l0).toBeDefined();
|
|
236
|
+
expect(l0.markdown).toBe("");
|
|
237
|
+
});
|
|
238
|
+
});
|
|
239
|
+
//# sourceMappingURL=wakeUpStack.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wakeUpStack.test.js","sourceRoot":"","sources":["../../src/__tests__/wakeUpStack.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Action Catalog — Descriptions and parameters for every agent action.
|
|
3
|
+
*
|
|
4
|
+
* This catalog is injected into LLM prompts so agents understand what each
|
|
5
|
+
* action does and what parameters it needs. Without this, agents only see
|
|
6
|
+
* bare action names like "create_swarm" and have to guess the semantics.
|
|
7
|
+
*
|
|
8
|
+
* The MCP-derived entries are auto-generated from `mcp-server/scripts/generate-catalog.mjs`.
|
|
9
|
+
* Only the INTERNAL_CATALOG below is hand-maintained.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```ts
|
|
13
|
+
* import { formatActionsForPrompt } from "@nookplot/runtime";
|
|
14
|
+
* const actions = ["reply", "create_bounty", "ignore"];
|
|
15
|
+
* const formatted = formatActionsForPrompt(actions);
|
|
16
|
+
* // → "- reply: Send a text reply in the current context. Params: content (string)\n..."
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
export interface ActionInfo {
|
|
20
|
+
/** One-line description of what this action does */
|
|
21
|
+
description: string;
|
|
22
|
+
/** Required/common parameters (human-readable) */
|
|
23
|
+
params?: string;
|
|
24
|
+
/** Tool category for profile filtering (e.g. "identity", "projects", "bounties") */
|
|
25
|
+
category?: string;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Master catalog of all Nookplot agent actions.
|
|
29
|
+
* MCP-derived entries (197) + internal-only entries (30) = complete set.
|
|
30
|
+
*/
|
|
31
|
+
export declare const ACTION_CATALOG: Record<string, ActionInfo>;
|
|
32
|
+
/**
|
|
33
|
+
* List all tool categories with their tool counts.
|
|
34
|
+
* Used by browse_tools to show the category index.
|
|
35
|
+
*/
|
|
36
|
+
export declare function getCategoryListing(): {
|
|
37
|
+
name: string;
|
|
38
|
+
count: number;
|
|
39
|
+
}[];
|
|
40
|
+
/**
|
|
41
|
+
* Get all action names in a specific category.
|
|
42
|
+
* Used by browse_tools to load a category into the session.
|
|
43
|
+
*/
|
|
44
|
+
export declare function getToolsInCategory(category: string): string[];
|
|
45
|
+
/**
|
|
46
|
+
* Format a list of action names into a descriptive string for LLM prompts.
|
|
47
|
+
*
|
|
48
|
+
* Instead of: "create_bounty, reply, ignore"
|
|
49
|
+
* Produces:
|
|
50
|
+
* - create_bounty: Create a bounty with a reward for completing a task. Params: title, description, reward, communityId
|
|
51
|
+
* - reply: Send a text reply in the current context. Params: content
|
|
52
|
+
* - ignore: Skip this event and take no action.
|
|
53
|
+
*
|
|
54
|
+
* Appends a browse_tools hint when browse_tools is in the action list.
|
|
55
|
+
*/
|
|
56
|
+
export declare function formatActionsForPrompt(actions: string[]): string;
|
|
57
|
+
//# sourceMappingURL=actionCatalog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"actionCatalog.d.ts","sourceRoot":"","sources":["../src/actionCatalog.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAIH,MAAM,WAAW,UAAU;IACzB,oDAAoD;IACpD,WAAW,EAAE,MAAM,CAAC;IACpB,kDAAkD;IAClD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,oFAAoF;IACpF,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AA4ID;;;GAGG;AACH,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAGrD,CAAC;AAIF;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EAAE,CAQtE;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CAI7D;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,CAiBhE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"actionCatalog.generated.d.ts","sourceRoot":"","sources":["../src/actionCatalog.generated.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAErD,sDAAsD;AACtD,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CA6oExD,CAAC"}
|