@pikku/core 0.12.80 → 0.12.82
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/CHANGELOG.md +312 -0
- package/dist/errors/index.d.ts +1 -1
- package/dist/errors/index.js +1 -1
- package/dist/function/function-runner.js +2 -5
- package/dist/function/index.d.ts +1 -1
- package/dist/index.d.ts +11 -11
- package/dist/index.js +3 -3
- package/dist/pikku-state.js +4 -0
- package/dist/services/ai-agent-runner-service.d.ts +7 -0
- package/dist/services/ai-run-state-service.d.ts +10 -0
- package/dist/services/in-memory-ai-run-state-service.d.ts +5 -1
- package/dist/services/in-memory-ai-run-state-service.js +9 -0
- package/dist/services/index.d.ts +15 -15
- package/dist/services/index.js +5 -5
- package/dist/services/scoped-credential-service.d.ts +21 -0
- package/dist/services/scoped-credential-service.js +53 -0
- package/dist/testing/service-tests/ai-storage-service-tests.js +76 -0
- package/dist/types/core.types.d.ts +0 -2
- package/dist/types/state.types.d.ts +13 -0
- package/dist/wirings/actor-flow/index.d.ts +1 -1
- package/dist/wirings/ai-agent/ai-agent-finalize.d.ts +58 -0
- package/dist/wirings/ai-agent/ai-agent-finalize.js +138 -0
- package/dist/wirings/ai-agent/ai-agent-interrupt.js +1 -0
- package/dist/wirings/ai-agent/ai-agent-memory.d.ts +2 -8
- package/dist/wirings/ai-agent/ai-agent-memory.js +34 -17
- package/dist/wirings/ai-agent/ai-agent-model-config.d.ts +7 -0
- package/dist/wirings/ai-agent/ai-agent-model-config.js +44 -1
- package/dist/wirings/ai-agent/ai-agent-prepare.js +2 -0
- package/dist/wirings/ai-agent/ai-agent-runner.js +61 -40
- package/dist/wirings/ai-agent/ai-agent-stream.js +89 -36
- package/dist/wirings/ai-agent/ai-agent-turn.d.ts +1 -0
- package/dist/wirings/ai-agent/ai-agent-turn.js +1 -0
- package/dist/wirings/ai-agent/ai-agent.types.d.ts +46 -1
- package/dist/wirings/ai-agent/index.d.ts +8 -7
- package/dist/wirings/ai-agent/index.js +5 -4
- package/dist/wirings/ai-scorer/ai-scorer-grade.d.ts +26 -0
- package/dist/wirings/ai-scorer/ai-scorer-grade.js +33 -0
- package/dist/wirings/ai-scorer/ai-scorer-judge.d.ts +17 -0
- package/dist/wirings/ai-scorer/ai-scorer-judge.js +92 -0
- package/dist/wirings/ai-scorer/ai-scorer-live.d.ts +15 -0
- package/dist/wirings/ai-scorer/ai-scorer-live.js +38 -0
- package/dist/wirings/ai-scorer/ai-scorer-registry.d.ts +18 -0
- package/dist/wirings/ai-scorer/ai-scorer-registry.js +46 -0
- package/dist/wirings/ai-scorer/ai-scorer-sampling.d.ts +8 -0
- package/dist/wirings/ai-scorer/ai-scorer-sampling.js +31 -0
- package/dist/wirings/ai-scorer/ai-scorer-snapshots.d.ts +10 -0
- package/dist/wirings/ai-scorer/ai-scorer-snapshots.js +40 -0
- package/dist/wirings/ai-scorer/ai-scorer-worker.d.ts +15 -0
- package/dist/wirings/ai-scorer/ai-scorer-worker.js +58 -0
- package/dist/wirings/ai-scorer/ai-scorer.d.ts +39 -0
- package/dist/wirings/ai-scorer/ai-scorer.js +40 -0
- package/dist/wirings/ai-scorer/ai-scorer.types.d.ts +90 -0
- package/dist/wirings/ai-scorer/ai-scorer.types.js +4 -0
- package/dist/wirings/ai-scorer/index.d.ts +6 -0
- package/dist/wirings/ai-scorer/index.js +5 -0
- package/dist/wirings/channel/index.d.ts +5 -6
- package/dist/wirings/channel/index.js +3 -4
- package/dist/wirings/channel/local/local-channel-runner.js +8 -1
- package/dist/wirings/cli/channel/cli-raw-channel-runner.js +9 -1
- package/dist/wirings/cli/channel/index.d.ts +1 -2
- package/dist/wirings/cli/channel/index.js +0 -1
- package/dist/wirings/cli/cli-runner.js +13 -1
- package/dist/wirings/credential/index.d.ts +1 -1
- package/dist/wirings/gateway/index.d.ts +1 -1
- package/dist/wirings/http/http-runner.js +8 -2
- package/dist/wirings/http/index.d.ts +1 -2
- package/dist/wirings/mcp/index.d.ts +1 -1
- package/dist/wirings/mcp/mcp-runner.d.ts +15 -0
- package/dist/wirings/mcp/mcp-runner.js +18 -5
- package/dist/wirings/persona/index.d.ts +3 -4
- package/dist/wirings/persona/index.js +2 -3
- package/dist/wirings/queue/index.d.ts +1 -3
- package/dist/wirings/queue/index.js +1 -3
- package/dist/wirings/rpc/addon-runner.d.ts +4 -0
- package/dist/wirings/rpc/addon-runner.js +19 -3
- package/dist/wirings/rpc/rpc-runner.js +2 -0
- package/dist/wirings/rpc/rpc-types.d.ts +4 -0
- package/dist/wirings/rpc/wire-addon.d.ts +13 -0
- package/dist/wirings/rpc/wire-addon.js +4 -0
- package/dist/wirings/scheduler/index.d.ts +1 -1
- package/dist/wirings/trigger/index.d.ts +1 -1
- package/dist/wirings/virtual-user/index.d.ts +5 -6
- package/dist/wirings/virtual-user/index.js +2 -4
- package/dist/wirings/workflow/dsl/workflow-dsl.types.d.ts +85 -15
- package/dist/wirings/workflow/index.d.ts +6 -6
- package/dist/wirings/workflow/index.js +2 -2
- package/dist/wirings/workflow/pikku-scenario-service.d.ts +7 -7
- package/dist/wirings/workflow/pikku-scenario-service.js +39 -13
- package/dist/wirings/workflow/pikku-workflow-service.js +17 -3
- package/dist/wirings/workflow/scenario-step.types.d.ts +8 -0
- package/dist/wirings/workflow/workflow-approval-audit.d.ts +16 -0
- package/dist/wirings/workflow/workflow-approval-audit.js +40 -0
- package/dist/wirings/workflow/workflow-approval-policy.d.ts +20 -0
- package/dist/wirings/workflow/workflow-approval-policy.js +48 -0
- package/dist/wirings/workflow/workflow-approval.d.ts +29 -1
- package/dist/wirings/workflow/workflow-approval.js +65 -2
- package/dist/wirings/workflow/workflow-run-ownership.d.ts +2 -1
- package/dist/wirings/workflow/workflow-run-ownership.js +2 -1
- package/dist/wirings/workflow/workflow.types.d.ts +1 -1
- package/knowledge/decisions/internals/addon-pikku-meta-ships-at-the-package-root-or-under-dist.md +32 -0
- package/knowledge/decisions/internals/an-addon-scope-root-loses-to-a-root-the-host-already-declares.md +39 -0
- package/knowledge/decisions/internals/index.md +30 -3
- package/knowledge/decisions/internals/validate-runs-checks-by-precondition.md +115 -0
- package/knowledge/decisions/security/a-function-never-receives-the-secret-service.md +37 -0
- package/knowledge/decisions/security/a-workflow-run-is-read-and-approved-by-its-owner.md +30 -14
- package/knowledge/decisions/security/an-approval-answer-outlives-the-run-it-answered.md +59 -0
- package/knowledge/decisions/security/index.md +3 -1
- package/knowledge/questions/index.md +1 -1
- package/package.json +3 -1
- package/scripts/generate-api-report.mts +143 -18
- package/src/api-report.test.ts +2 -2
- package/src/errors/index.ts +1 -1
- package/src/function/function-runner.test.ts +52 -0
- package/src/function/function-runner.ts +5 -9
- package/src/function/index.ts +0 -2
- package/src/index.ts +0 -35
- package/src/pikku-state.ts +5 -0
- package/src/public-surface.json +70 -94
- package/src/services/ai-agent-runner-service.ts +12 -1
- package/src/services/ai-run-state-service.ts +11 -0
- package/src/services/in-memory-ai-run-state-service.ts +13 -0
- package/src/services/index.ts +3 -43
- package/src/services/scoped-credential-service.test.ts +86 -0
- package/src/services/scoped-credential-service.ts +63 -0
- package/src/testing/service-tests/ai-storage-service-tests.ts +93 -0
- package/src/types/core.types.ts +3 -6
- package/src/types/state.types.ts +16 -0
- package/src/wirings/actor-flow/index.ts +0 -3
- package/src/wirings/ai-agent/ai-agent-finalize.test.ts +186 -0
- package/src/wirings/ai-agent/ai-agent-finalize.ts +197 -0
- package/src/wirings/ai-agent/ai-agent-interrupt.ts +1 -0
- package/src/wirings/ai-agent/ai-agent-memory.ts +54 -38
- package/src/wirings/ai-agent/ai-agent-model-config.test.ts +72 -3
- package/src/wirings/ai-agent/ai-agent-model-config.ts +49 -1
- package/src/wirings/ai-agent/ai-agent-prepare.ts +2 -0
- package/src/wirings/ai-agent/ai-agent-runner.ts +71 -40
- package/src/wirings/ai-agent/ai-agent-stream-output-hooks.test.ts +353 -0
- package/src/wirings/ai-agent/ai-agent-stream.ts +116 -54
- package/src/wirings/ai-agent/ai-agent-turn.test.ts +67 -0
- package/src/wirings/ai-agent/ai-agent-turn.ts +1 -0
- package/src/wirings/ai-agent/ai-agent.types.ts +64 -4
- package/src/wirings/ai-agent/index.ts +2 -16
- package/src/wirings/ai-scorer/ai-scorer-grade.test.ts +106 -0
- package/src/wirings/ai-scorer/ai-scorer-grade.ts +55 -0
- package/src/wirings/ai-scorer/ai-scorer-judge.test.ts +143 -0
- package/src/wirings/ai-scorer/ai-scorer-judge.ts +120 -0
- package/src/wirings/ai-scorer/ai-scorer-live.test.ts +174 -0
- package/src/wirings/ai-scorer/ai-scorer-live.ts +56 -0
- package/src/wirings/ai-scorer/ai-scorer-registry.ts +63 -0
- package/src/wirings/ai-scorer/ai-scorer-sampling.test.ts +34 -0
- package/src/wirings/ai-scorer/ai-scorer-sampling.ts +36 -0
- package/src/wirings/ai-scorer/ai-scorer-snapshots.test.ts +49 -0
- package/src/wirings/ai-scorer/ai-scorer-snapshots.ts +46 -0
- package/src/wirings/ai-scorer/ai-scorer-worker.test.ts +122 -0
- package/src/wirings/ai-scorer/ai-scorer-worker.ts +69 -0
- package/src/wirings/ai-scorer/ai-scorer.ts +76 -0
- package/src/wirings/ai-scorer/ai-scorer.types.ts +107 -0
- package/src/wirings/ai-scorer/index.ts +24 -0
- package/src/wirings/channel/index.ts +1 -20
- package/src/wirings/channel/local/local-channel-runner.test.ts +68 -0
- package/src/wirings/channel/local/local-channel-runner.ts +8 -1
- package/src/wirings/cli/channel/cli-raw-channel-runner.test.ts +23 -0
- package/src/wirings/cli/channel/cli-raw-channel-runner.ts +12 -1
- package/src/wirings/cli/channel/index.ts +0 -7
- package/src/wirings/cli/cli-runner.test.ts +68 -0
- package/src/wirings/cli/cli-runner.ts +18 -1
- package/src/wirings/credential/index.ts +0 -1
- package/src/wirings/gateway/index.ts +0 -3
- package/src/wirings/http/http-runner.test.ts +66 -0
- package/src/wirings/http/http-runner.ts +10 -2
- package/src/wirings/http/index.ts +1 -1
- package/src/wirings/mcp/index.ts +0 -1
- package/src/wirings/mcp/mcp-runner.test.ts +181 -0
- package/src/wirings/mcp/mcp-runner.ts +35 -5
- package/src/wirings/persona/index.ts +0 -8
- package/src/wirings/queue/index.ts +0 -14
- package/src/wirings/rpc/addon-runner.ts +34 -3
- package/src/wirings/rpc/addon-secrets.test.ts +261 -0
- package/src/wirings/rpc/rpc-runner.test.ts +2 -0
- package/src/wirings/rpc/rpc-runner.ts +2 -0
- package/src/wirings/rpc/rpc-types.ts +4 -0
- package/src/wirings/rpc/wire-addon.ts +17 -0
- package/src/wirings/scheduler/index.ts +0 -1
- package/src/wirings/trigger/index.ts +0 -1
- package/src/wirings/virtual-user/index.ts +0 -16
- package/src/wirings/workflow/dsl/workflow-dsl.types.ts +96 -16
- package/src/wirings/workflow/graph/graph-runner.test.ts +72 -0
- package/src/wirings/workflow/index.ts +2 -20
- package/src/wirings/workflow/pikku-scenario-service.ts +60 -15
- package/src/wirings/workflow/pikku-workflow-service.test.ts +13 -12
- package/src/wirings/workflow/pikku-workflow-service.ts +28 -4
- package/src/wirings/workflow/scenario-expectations.test.ts +75 -0
- package/src/wirings/workflow/scenario-hooks.test.ts +3 -2
- package/src/wirings/workflow/scenario-step.types.ts +8 -0
- package/src/wirings/workflow/workflow-approval-audit.ts +47 -0
- package/src/wirings/workflow/workflow-approval-policy.test.ts +524 -0
- package/src/wirings/workflow/workflow-approval-policy.ts +68 -0
- package/src/wirings/workflow/workflow-approval.ts +113 -9
- package/src/wirings/workflow/workflow-run-authority.test.ts +12 -15
- package/src/wirings/workflow/workflow-run-ownership.ts +2 -1
- package/src/wirings/workflow/workflow.types.ts +0 -9
- package/src/wirings-stay-decoupled.test.ts +6 -2
- package/tsconfig.tsbuildinfo +1 -1
- package/dist/internal.d.ts +0 -3
- package/dist/internal.js +0 -2
- package/dist/middleware/timeout.d.ts +0 -9
- package/dist/middleware/timeout.js +0 -15
- package/dist/pikku-response.d.ts +0 -6
- package/dist/pikku-response.js +0 -6
- package/dist/services/gopass-secrets.d.ts +0 -15
- package/dist/services/gopass-secrets.js +0 -76
- package/dist/services/http-scenario-actors.d.ts +0 -75
- package/dist/services/http-scenario-actors.js +0 -195
- package/dist/services/http-user-flow-actors.d.ts +0 -67
- package/dist/services/http-user-flow-actors.js +0 -193
- package/dist/services/scenario-actors-service.d.ts +0 -127
- package/dist/services/scenario-actors-service.js +0 -40
- package/dist/services/user-flow-actors-service.d.ts +0 -39
- package/dist/services/user-flow-actors-service.js +0 -1
- package/dist/wirings/credential/wire-credential.d.ts +0 -48
- package/dist/wirings/credential/wire-credential.js +0 -47
- package/dist/wirings/oauth2/oauth2-client.d.ts +0 -47
- package/dist/wirings/oauth2/oauth2-client.js +0 -263
- package/dist/wirings/oauth2/oauth2-routes.d.ts +0 -35
- package/dist/wirings/oauth2/oauth2-routes.js +0 -146
- package/dist/wirings/scope/wire-scope.d.ts +0 -33
- package/dist/wirings/scope/wire-scope.js +0 -32
- package/dist/wirings/workflow/dsl/index.d.ts +0 -5
- package/dist/wirings/workflow/dsl/index.js +0 -4
- package/dist/wirings/workflow/graph/index.d.ts +0 -5
- package/dist/wirings/workflow/graph/index.js +0 -4
package/src/public-surface.json
CHANGED
|
@@ -53,7 +53,6 @@
|
|
|
53
53
|
"addGlobalPermission",
|
|
54
54
|
"addTagMiddleware",
|
|
55
55
|
"assertSecretAllowedForHost",
|
|
56
|
-
"beginChanges",
|
|
57
56
|
"checkAuthPermissions",
|
|
58
57
|
"clearPikkuRuntimeState",
|
|
59
58
|
"createGraph",
|
|
@@ -61,7 +60,6 @@
|
|
|
61
60
|
"createSecretValue",
|
|
62
61
|
"fetch",
|
|
63
62
|
"formatVersionedId",
|
|
64
|
-
"getAbortScope",
|
|
65
63
|
"getAllFunctionNames",
|
|
66
64
|
"getRelativeTimeOffsetFromNow",
|
|
67
65
|
"hasScopes",
|
|
@@ -83,14 +81,8 @@
|
|
|
83
81
|
"pikkuPermission",
|
|
84
82
|
"pikkuPermissionFactory",
|
|
85
83
|
"pikkuServerLifecycle",
|
|
86
|
-
"resolveAuditConfig",
|
|
87
|
-
"resolveAuditUserIdentityFromWire",
|
|
88
|
-
"runInAbortScope",
|
|
89
84
|
"runMiddleware",
|
|
90
85
|
"stopSingletonServices",
|
|
91
|
-
"unsafeAsHashed",
|
|
92
|
-
"unsafeAsSealed",
|
|
93
|
-
"unsafeAsWrapped",
|
|
94
86
|
"verifyScopes",
|
|
95
87
|
"wireAddon",
|
|
96
88
|
"wireRemoteAddon",
|
|
@@ -119,9 +111,6 @@
|
|
|
119
111
|
"pikkuPermissionFactory"
|
|
120
112
|
],
|
|
121
113
|
"./channel": [
|
|
122
|
-
"CHANNEL_RPC_PENDING",
|
|
123
|
-
"CHANNEL_RPC_REQUEST",
|
|
124
|
-
"CHANNEL_RPC_RESPONSE",
|
|
125
114
|
"ChannelDeploymentService",
|
|
126
115
|
"ChannelRPCError",
|
|
127
116
|
"ChannelRPCRegistry",
|
|
@@ -129,29 +118,17 @@
|
|
|
129
118
|
"EventHubStore",
|
|
130
119
|
"PikkuAbstractChannelHandler",
|
|
131
120
|
"addChannelMiddleware",
|
|
132
|
-
"channelRemote",
|
|
133
121
|
"combineChannelMiddleware",
|
|
134
|
-
"createChannelRPCInputValidator",
|
|
135
|
-
"createChannelRPCResponder",
|
|
136
|
-
"createChannelRPCResultValidator",
|
|
137
122
|
"defineChannelRoutes",
|
|
138
|
-
"getChannelHostRPC",
|
|
139
|
-
"handleChannelRPCResponse",
|
|
140
|
-
"isChannelRPCPending",
|
|
141
|
-
"isChannelRPCRequest",
|
|
142
|
-
"isChannelRPCResponse",
|
|
143
123
|
"logChannels",
|
|
144
|
-
"openChannel",
|
|
145
|
-
"releaseChannelHostRPC",
|
|
146
|
-
"resolveCapability",
|
|
147
124
|
"unsupportedChannelRemote",
|
|
148
|
-
"wireChannel"
|
|
149
|
-
"wrapChannelWithMiddleware"
|
|
125
|
+
"wireChannel"
|
|
150
126
|
],
|
|
151
127
|
"./workflow": [
|
|
152
128
|
"DEFAULT_STEP_RETRIES",
|
|
153
129
|
"PikkuWorkflowService",
|
|
154
130
|
"SCENARIO_SURFACES",
|
|
131
|
+
"WorkflowApprovalForbiddenError",
|
|
155
132
|
"WorkflowApprovalResolvedError",
|
|
156
133
|
"WorkflowCancelledException",
|
|
157
134
|
"WorkflowDispatchException",
|
|
@@ -169,9 +146,6 @@
|
|
|
169
146
|
"deriveInvocationId",
|
|
170
147
|
"isRef",
|
|
171
148
|
"pikkuWorkflowGraph",
|
|
172
|
-
"pikkuWorkflowOrchestratorFunc",
|
|
173
|
-
"pikkuWorkflowSleeperFunc",
|
|
174
|
-
"pikkuWorkflowWorkerFunc",
|
|
175
149
|
"pollUntil",
|
|
176
150
|
"reconstructFinalState",
|
|
177
151
|
"reconstructStateAt",
|
|
@@ -181,8 +155,7 @@
|
|
|
181
155
|
"resolveFeatureScenarios",
|
|
182
156
|
"resolveScenarioSurfaces",
|
|
183
157
|
"template",
|
|
184
|
-
"uuidv5"
|
|
185
|
-
"witnessesAgree"
|
|
158
|
+
"uuidv5"
|
|
186
159
|
],
|
|
187
160
|
"./scenario": [
|
|
188
161
|
"PikkuScenarioService",
|
|
@@ -200,28 +173,24 @@
|
|
|
200
173
|
"reconstructStateAt"
|
|
201
174
|
],
|
|
202
175
|
"./workflow/types": [],
|
|
203
|
-
"./actor-flow": [
|
|
176
|
+
"./actor-flow": [
|
|
177
|
+
"runConversation"
|
|
178
|
+
],
|
|
204
179
|
"./virtual-user": [
|
|
205
180
|
"DISPOSITIONS",
|
|
206
181
|
"IntentStack",
|
|
207
182
|
"PRODUCTION_DISPOSITION",
|
|
208
183
|
"catalogueClassification",
|
|
209
|
-
"catalogueIndex",
|
|
210
184
|
"catalogueLookup",
|
|
211
|
-
"createRng",
|
|
212
185
|
"deriveCatalogue",
|
|
213
186
|
"deriveIntents",
|
|
214
|
-
"describeEntry",
|
|
215
187
|
"dispositionProfile",
|
|
216
188
|
"intentsForPersona",
|
|
217
189
|
"isReadOnly",
|
|
218
190
|
"personaScopes",
|
|
219
191
|
"personaVirtualUserTarget",
|
|
220
192
|
"prepareVirtualUserRun",
|
|
221
|
-
"reachableAgents",
|
|
222
193
|
"reachableCatalogue",
|
|
223
|
-
"rememberIds",
|
|
224
|
-
"renderCatalogue",
|
|
225
194
|
"runVirtualUser",
|
|
226
195
|
"unreachableCatalogue"
|
|
227
196
|
],
|
|
@@ -249,23 +218,15 @@
|
|
|
249
218
|
"wireHTTP",
|
|
250
219
|
"wireHTTPRoutes"
|
|
251
220
|
],
|
|
252
|
-
"./remote": [
|
|
221
|
+
"./remote": [
|
|
222
|
+
"buildRemoteHeaders"
|
|
223
|
+
],
|
|
253
224
|
"./queue": [
|
|
254
|
-
"QUEUE_IDENTITY_CLAIM_VERSION",
|
|
255
|
-
"QUEUE_IDENTITY_INFO",
|
|
256
|
-
"QUEUE_IDENTITY_SECRET_NAME",
|
|
257
225
|
"QueueJobDiscardedError",
|
|
258
226
|
"QueueJobFailedError",
|
|
259
227
|
"SignedQueueService",
|
|
260
|
-
"getQueueIdentitySecret",
|
|
261
|
-
"getQueueWorkers",
|
|
262
228
|
"registerQueueWorkers",
|
|
263
|
-
"removeQueueWorker",
|
|
264
|
-
"resolveQueueJobIdentity",
|
|
265
229
|
"runQueueJob",
|
|
266
|
-
"signQueueIdentity",
|
|
267
|
-
"validateWorkerConfig",
|
|
268
|
-
"verifyQueueIdentity",
|
|
269
230
|
"wireQueueWorker"
|
|
270
231
|
],
|
|
271
232
|
"./scheduler": [
|
|
@@ -274,7 +235,11 @@
|
|
|
274
235
|
"runScheduledTask",
|
|
275
236
|
"wireScheduler"
|
|
276
237
|
],
|
|
277
|
-
"./trigger": [
|
|
238
|
+
"./trigger": [
|
|
239
|
+
"PikkuTriggerService",
|
|
240
|
+
"wireTrigger",
|
|
241
|
+
"wireTriggerSource"
|
|
242
|
+
],
|
|
278
243
|
"./rpc": [
|
|
279
244
|
"PikkuRPCService",
|
|
280
245
|
"RPCNotFoundError",
|
|
@@ -292,7 +257,10 @@
|
|
|
292
257
|
"safeFetch",
|
|
293
258
|
"setDefaultHostResolver"
|
|
294
259
|
],
|
|
295
|
-
"./node-host-resolver": [
|
|
260
|
+
"./node-host-resolver": [
|
|
261
|
+
"installNodeHostResolver",
|
|
262
|
+
"nodeHostResolver"
|
|
263
|
+
],
|
|
296
264
|
"./mcp": [
|
|
297
265
|
"MCPEndpointRegistry",
|
|
298
266
|
"MCPError",
|
|
@@ -318,34 +286,33 @@
|
|
|
318
286
|
"agentInterrupt",
|
|
319
287
|
"agentResume",
|
|
320
288
|
"agentStream",
|
|
321
|
-
"approveAIAgent",
|
|
322
|
-
"awaitPendingInterruptNote",
|
|
323
289
|
"canAccessThread",
|
|
324
|
-
"getAIAgents",
|
|
325
|
-
"getAIAgentsMeta",
|
|
326
|
-
"getInFlightTools",
|
|
327
290
|
"interruptAIAgent",
|
|
328
|
-
"isAbortError",
|
|
329
291
|
"isOwnedByPrincipal",
|
|
330
|
-
"
|
|
331
|
-
"persistOrphanedToolResults",
|
|
332
|
-
"readsAsNonSpeech",
|
|
333
|
-
"registerInterruptibleRun",
|
|
292
|
+
"resolveModelAlias",
|
|
334
293
|
"resumeAIAgent",
|
|
335
294
|
"resumeAIAgentSync",
|
|
336
295
|
"runAIAgent",
|
|
337
|
-
"sessionPrincipals",
|
|
338
296
|
"signalRunInterrupt",
|
|
339
297
|
"streamAIAgent",
|
|
340
298
|
"threadOwnerConstraint",
|
|
341
|
-
"trackInterruptNote",
|
|
342
|
-
"trackToolExecution",
|
|
343
299
|
"unspeakableScripts",
|
|
344
300
|
"voiceForText",
|
|
345
301
|
"voiceInput",
|
|
346
302
|
"voiceOutput",
|
|
347
303
|
"wrapChannelWithAGUI"
|
|
348
304
|
],
|
|
305
|
+
"./ai-scorer": [
|
|
306
|
+
"addAIScorer",
|
|
307
|
+
"enableScoreSnapshots",
|
|
308
|
+
"getAIScorers",
|
|
309
|
+
"getAIScorersMeta",
|
|
310
|
+
"getScoreSnapshot",
|
|
311
|
+
"gradeRun",
|
|
312
|
+
"pikkuAIJudge",
|
|
313
|
+
"pikkuAIScorer",
|
|
314
|
+
"wireAIScorerQueueWorkers"
|
|
315
|
+
],
|
|
349
316
|
"./gateway": [
|
|
350
317
|
"createListenerMessageHandler",
|
|
351
318
|
"resolveGatewayAdapter",
|
|
@@ -361,15 +328,14 @@
|
|
|
361
328
|
"runCLICommand",
|
|
362
329
|
"wireCLI"
|
|
363
330
|
],
|
|
364
|
-
"./cli/command-parser": [
|
|
331
|
+
"./cli/command-parser": [
|
|
332
|
+
"generateCommandHelp",
|
|
333
|
+
"parseCLIArguments"
|
|
334
|
+
],
|
|
365
335
|
"./cli/channel": [
|
|
366
|
-
"APPROVAL_FLAGS",
|
|
367
|
-
"approverForMode",
|
|
368
|
-
"createTerminalApprover",
|
|
369
336
|
"executeCLIViaChannel",
|
|
370
337
|
"executeRawCLIViaChannel",
|
|
371
|
-
"handleRawCLI"
|
|
372
|
-
"takeApprovalFlags"
|
|
338
|
+
"handleRawCLI"
|
|
373
339
|
],
|
|
374
340
|
"./node": [],
|
|
375
341
|
"./credential": [
|
|
@@ -388,27 +354,28 @@
|
|
|
388
354
|
],
|
|
389
355
|
"./persona": [
|
|
390
356
|
"HttpPersona",
|
|
391
|
-
"allowedLinks",
|
|
392
|
-
"applyMailboxAllowlist",
|
|
393
357
|
"createHttpPersonas",
|
|
394
358
|
"definePersonas",
|
|
395
|
-
"isAllowedSender",
|
|
396
359
|
"isRunnablePersona",
|
|
397
360
|
"personaEmail",
|
|
398
|
-
"personaEmailLabel",
|
|
399
361
|
"personaEmails",
|
|
400
362
|
"personaEnvironmentErrors",
|
|
401
363
|
"personaEnvironmentRefusal",
|
|
402
364
|
"postScenarioJson",
|
|
403
365
|
"readScenarioHttpResponse",
|
|
404
|
-
"resolvePersonaEnvironments",
|
|
405
366
|
"roleMismatchMessage",
|
|
406
367
|
"runnablePersonas",
|
|
407
368
|
"validateAndBuildPersonasMeta",
|
|
408
369
|
"verifyPersonaRoles"
|
|
409
370
|
],
|
|
410
|
-
"./secret": [
|
|
411
|
-
|
|
371
|
+
"./secret": [
|
|
372
|
+
"defineSecret",
|
|
373
|
+
"validateAndBuildSecretDefinitionsMeta"
|
|
374
|
+
],
|
|
375
|
+
"./variable": [
|
|
376
|
+
"defineVariable",
|
|
377
|
+
"validateAndBuildVariableDefinitionsMeta"
|
|
378
|
+
],
|
|
412
379
|
"./oauth2": [],
|
|
413
380
|
"./errors": [
|
|
414
381
|
"AIProviderAuthError",
|
|
@@ -456,13 +423,11 @@
|
|
|
456
423
|
"UnprocessableContentError",
|
|
457
424
|
"UnsupportedMediaTypeError",
|
|
458
425
|
"WeakKeyMaterialError",
|
|
459
|
-
"addError"
|
|
460
|
-
"addErrors"
|
|
426
|
+
"addError"
|
|
461
427
|
],
|
|
462
428
|
"./services": [
|
|
463
429
|
"ConsoleLogger",
|
|
464
430
|
"DEFAULT_WEBHOOK_RETRIES",
|
|
465
|
-
"DEFAULT_WEBHOOK_SIGNATURE_HEADER",
|
|
466
431
|
"InMemoryAIRunStateService",
|
|
467
432
|
"InMemoryQueueService",
|
|
468
433
|
"InMemorySessionStore",
|
|
@@ -480,6 +445,7 @@
|
|
|
480
445
|
"PikkuCredentialWireService",
|
|
481
446
|
"PikkuSessionService",
|
|
482
447
|
"QueueWebhookService",
|
|
448
|
+
"ScopedCredentialService",
|
|
483
449
|
"ScopedSecretService",
|
|
484
450
|
"SecretHostNotAllowedError",
|
|
485
451
|
"StubTracker",
|
|
@@ -487,28 +453,29 @@
|
|
|
487
453
|
"TypedSecretService",
|
|
488
454
|
"TypedVariablesService",
|
|
489
455
|
"WebhookService",
|
|
490
|
-
"assertRoleIsMutable",
|
|
491
|
-
"assertRoleNameAvailable",
|
|
492
456
|
"assertSecretAllowedForHost",
|
|
493
|
-
"createFunctionSessionWireProps",
|
|
494
457
|
"createInvocationAudit",
|
|
495
|
-
"createMiddlewareCredentialWireProps",
|
|
496
458
|
"createMiddlewareSessionWireProps",
|
|
497
459
|
"createStubProxy",
|
|
498
|
-
"createWireServicesCredentialWireProps",
|
|
499
460
|
"getStubTracker",
|
|
500
461
|
"isTestRun",
|
|
501
462
|
"pikkuWebhookWorkerFunc",
|
|
502
|
-
"resolveAuditConfig",
|
|
503
|
-
"resolveAuditUserIdentityFromWire",
|
|
504
|
-
"roleLockReason",
|
|
505
463
|
"spy",
|
|
506
464
|
"stub"
|
|
507
465
|
],
|
|
508
|
-
"./services/local-meta": [
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
"./services/
|
|
466
|
+
"./services/local-meta": [
|
|
467
|
+
"LocalMetaService"
|
|
468
|
+
],
|
|
469
|
+
"./services/v8-coverage": [
|
|
470
|
+
"V8CoverageService"
|
|
471
|
+
],
|
|
472
|
+
"./services/istanbul-coverage": [
|
|
473
|
+
"IstanbulCoverageService"
|
|
474
|
+
],
|
|
475
|
+
"./services/local-content": [
|
|
476
|
+
"LocalContent",
|
|
477
|
+
"signedContentPath"
|
|
478
|
+
],
|
|
512
479
|
"./services/local-content-request-handler": [
|
|
513
480
|
"createLocalContentRequestHandler",
|
|
514
481
|
"verifySignedContentRequest"
|
|
@@ -538,7 +505,10 @@
|
|
|
538
505
|
"verifyWithKeyMaterial",
|
|
539
506
|
"wrapDEK"
|
|
540
507
|
],
|
|
541
|
-
"./hmac": [
|
|
508
|
+
"./hmac": [
|
|
509
|
+
"hmacSha256Hex",
|
|
510
|
+
"timingSafeStringEqual"
|
|
511
|
+
],
|
|
542
512
|
"./ecosystem": [
|
|
543
513
|
"addFunction",
|
|
544
514
|
"addGlobalMiddleware",
|
|
@@ -573,6 +543,12 @@
|
|
|
573
543
|
"getSchema",
|
|
574
544
|
"validateSchema"
|
|
575
545
|
],
|
|
576
|
-
"./testing": [
|
|
577
|
-
|
|
546
|
+
"./testing": [
|
|
547
|
+
"defineServiceTests"
|
|
548
|
+
],
|
|
549
|
+
"./dev": [
|
|
550
|
+
"pikkuDevReloader",
|
|
551
|
+
"reconcileAddonRegistry",
|
|
552
|
+
"reloadGeneratedMeta"
|
|
553
|
+
]
|
|
578
554
|
}
|
|
@@ -52,7 +52,18 @@ export type AIAgentStepResult = {
|
|
|
52
52
|
text: string
|
|
53
53
|
object?: unknown
|
|
54
54
|
toolCalls: { toolCallId: string; toolName: string; args: unknown }[]
|
|
55
|
-
toolResults: {
|
|
55
|
+
toolResults: {
|
|
56
|
+
toolCallId: string
|
|
57
|
+
toolName: string
|
|
58
|
+
result: unknown
|
|
59
|
+
/**
|
|
60
|
+
* Set when the tool threw rather than returned. Carried as its own field
|
|
61
|
+
* because `result` is a rendered string by the time anything downstream
|
|
62
|
+
* reads it, and "did this tool fail" is not answerable by looking for an
|
|
63
|
+
* `Error:` prefix in text a tool could legitimately have returned.
|
|
64
|
+
*/
|
|
65
|
+
error?: string
|
|
66
|
+
}[]
|
|
56
67
|
usage: { inputTokens: number; outputTokens: number }
|
|
57
68
|
finishReason: 'stop' | 'tool-calls' | 'length' | 'error' | 'unknown'
|
|
58
69
|
reasoningContent?: string
|
|
@@ -2,9 +2,12 @@ import type {
|
|
|
2
2
|
AgentRunState,
|
|
3
3
|
PendingApproval,
|
|
4
4
|
} from '../wirings/ai-agent/ai-agent.types.js'
|
|
5
|
+
import type { AIRunScore } from '../wirings/ai-scorer/ai-scorer.types.js'
|
|
5
6
|
|
|
6
7
|
export type CreateRunInput = Omit<AgentRunState, 'runId'>
|
|
7
8
|
|
|
9
|
+
export type SaveScoreInput = Omit<AIRunScore, 'createdAt'>
|
|
10
|
+
|
|
8
11
|
export interface AIRunStateService {
|
|
9
12
|
createRun(run: CreateRunInput): Promise<string>
|
|
10
13
|
updateRun(runId: string, updates: Partial<AgentRunState>): Promise<void>
|
|
@@ -23,4 +26,12 @@ export interface AIRunStateService {
|
|
|
23
26
|
findRunByToolCallId(
|
|
24
27
|
toolCallId: string
|
|
25
28
|
): Promise<{ run: AgentRunState; approval: PendingApproval } | null>
|
|
29
|
+
/**
|
|
30
|
+
* Record one scorer's grade of a finished run. A run accumulates one row per
|
|
31
|
+
* scorer, and a scorer may grade the same run more than once — a retried job
|
|
32
|
+
* appends rather than replaces, so a re-grade never silently overwrites the
|
|
33
|
+
* grade that was acted on.
|
|
34
|
+
*/
|
|
35
|
+
saveScore(score: SaveScoreInput): Promise<void>
|
|
36
|
+
getScores(runId: string): Promise<AIRunScore[]>
|
|
26
37
|
}
|
|
@@ -1,14 +1,17 @@
|
|
|
1
1
|
import type {
|
|
2
2
|
AIRunStateService,
|
|
3
3
|
CreateRunInput,
|
|
4
|
+
SaveScoreInput,
|
|
4
5
|
} from './ai-run-state-service.js'
|
|
5
6
|
import type {
|
|
6
7
|
AgentRunState,
|
|
7
8
|
PendingApproval,
|
|
8
9
|
} from '../wirings/ai-agent/ai-agent.types.js'
|
|
10
|
+
import type { AIRunScore } from '../wirings/ai-scorer/ai-scorer.types.js'
|
|
9
11
|
|
|
10
12
|
export class InMemoryAIRunStateService implements AIRunStateService {
|
|
11
13
|
private runs = new Map<string, AgentRunState>()
|
|
14
|
+
private scores = new Map<string, AIRunScore[]>()
|
|
12
15
|
private counter = 0
|
|
13
16
|
|
|
14
17
|
async createRun(run: CreateRunInput): Promise<string> {
|
|
@@ -71,4 +74,14 @@ export class InMemoryAIRunStateService implements AIRunStateService {
|
|
|
71
74
|
}
|
|
72
75
|
return null
|
|
73
76
|
}
|
|
77
|
+
|
|
78
|
+
async saveScore(score: SaveScoreInput): Promise<void> {
|
|
79
|
+
const existing = this.scores.get(score.runId) ?? []
|
|
80
|
+
existing.push({ ...score, createdAt: new Date() })
|
|
81
|
+
this.scores.set(score.runId, existing)
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
async getScores(runId: string): Promise<AIRunScore[]> {
|
|
85
|
+
return [...(this.scores.get(runId) ?? [])]
|
|
86
|
+
}
|
|
74
87
|
}
|
package/src/services/index.ts
CHANGED
|
@@ -1,15 +1,13 @@
|
|
|
1
1
|
export { LogLevel } from './logger.js'
|
|
2
2
|
export { ScopedSecretService } from './scoped-secret-service.js'
|
|
3
|
+
export { ScopedCredentialService } from './scoped-credential-service.js'
|
|
3
4
|
export {
|
|
4
5
|
PikkuSessionService,
|
|
5
6
|
createMiddlewareSessionWireProps,
|
|
6
|
-
createFunctionSessionWireProps,
|
|
7
7
|
} from './user-session-service.js'
|
|
8
8
|
export { TypedSecretService } from './typed-secret-service.js'
|
|
9
9
|
export {
|
|
10
10
|
PikkuCredentialWireService,
|
|
11
|
-
createMiddlewareCredentialWireProps,
|
|
12
|
-
createWireServicesCredentialWireProps,
|
|
13
11
|
} from './credential-wire-service.js'
|
|
14
12
|
export { TypedVariablesService } from './typed-variables-service.js'
|
|
15
13
|
export { LocalSecretService } from './local-secrets.js'
|
|
@@ -39,10 +37,7 @@ export type {
|
|
|
39
37
|
export type {
|
|
40
38
|
ScenarioPersona,
|
|
41
39
|
ResolvedPersona,
|
|
42
|
-
ScenarioPersonaOf,
|
|
43
40
|
ScenarioPersonas,
|
|
44
|
-
ScenarioInvokeOptions,
|
|
45
|
-
ScenarioRpcMap,
|
|
46
41
|
ScenarioHttpResponse,
|
|
47
42
|
} from './personas-service.js'
|
|
48
43
|
// knowledge: decisions/internals/the-persona-runtime-is-exported-from-the-persona-entry-point.md
|
|
@@ -50,7 +45,6 @@ export type { HttpPersonasConfig } from './http-personas.js'
|
|
|
50
45
|
export type { JWTService } from './jwt-service.js'
|
|
51
46
|
export type {
|
|
52
47
|
EmailService,
|
|
53
|
-
EmailTemplateReference,
|
|
54
48
|
SendEmailInput,
|
|
55
49
|
SendEmailResult,
|
|
56
50
|
SendHTMLEmailInput,
|
|
@@ -59,12 +53,10 @@ export type {
|
|
|
59
53
|
} from './email-service.js'
|
|
60
54
|
export {
|
|
61
55
|
DEFAULT_WEBHOOK_RETRIES,
|
|
62
|
-
DEFAULT_WEBHOOK_SIGNATURE_HEADER,
|
|
63
56
|
PIKKU_OUTGOING_WEBHOOK_QUEUE_NAME,
|
|
64
57
|
WebhookService,
|
|
65
58
|
type SendWebhookInput,
|
|
66
59
|
type SendWebhookResult,
|
|
67
|
-
type WebhookAttemptRecord,
|
|
68
60
|
type WebhookAttemptResult,
|
|
69
61
|
type WebhookDeliveryRecord,
|
|
70
62
|
type WebhookDeliveryWithAttempts,
|
|
@@ -94,52 +86,30 @@ export type {
|
|
|
94
86
|
AIAgentRunnerParams,
|
|
95
87
|
AIAgentRunnerResult,
|
|
96
88
|
AIAgentStepResult,
|
|
97
|
-
AIEmbedManyParams,
|
|
98
|
-
AIEmbedManyResult,
|
|
99
|
-
AIEmbedParams,
|
|
100
|
-
AIEmbedResult,
|
|
101
|
-
AIGenerateImageParams,
|
|
102
|
-
AIGenerateImagePrompt,
|
|
103
|
-
AIGenerateImageResult,
|
|
104
|
-
AIGenerateSpeechParams,
|
|
105
|
-
AIGenerateSpeechResult,
|
|
106
|
-
AIProviderOptions,
|
|
107
|
-
AIRerankParams,
|
|
108
|
-
AIRerankResult,
|
|
109
|
-
AITranscriptionParams,
|
|
110
|
-
AITranscriptionResult,
|
|
111
89
|
AIAgentRunnerService,
|
|
112
90
|
} from './ai-agent-runner-service.js'
|
|
113
91
|
export type { AIEmbeddingService } from './ai-embedding-service.js'
|
|
114
92
|
export type {
|
|
115
93
|
CreateRunInput,
|
|
94
|
+
SaveScoreInput,
|
|
116
95
|
AIRunStateService,
|
|
117
96
|
} from './ai-run-state-service.js'
|
|
118
97
|
export type {
|
|
119
|
-
CredentialStatus,
|
|
120
98
|
CredentialMeta,
|
|
121
99
|
} from './typed-secret-service.js'
|
|
122
100
|
export type { CredentialService } from './credential-service.js'
|
|
123
101
|
export { TypedCredentialService } from './typed-credential-service.js'
|
|
124
102
|
export type {
|
|
125
|
-
CredentialStatusInfo,
|
|
126
103
|
CredentialMetaInfo,
|
|
127
104
|
} from './typed-credential-service.js'
|
|
128
|
-
export type {
|
|
105
|
+
export type { VariableMeta } from './typed-variables-service.js'
|
|
129
106
|
export type { MetaService } from './meta-service.js'
|
|
130
107
|
export type { SessionStore } from './session-store.js'
|
|
131
108
|
export type { ScopeService, Role } from './scope-service.js'
|
|
132
|
-
export {
|
|
133
|
-
assertRoleIsMutable,
|
|
134
|
-
assertRoleNameAvailable,
|
|
135
|
-
roleLockReason,
|
|
136
|
-
} from './system-role-guard.js'
|
|
137
109
|
export type { IsSystemRole } from './system-role-guard.js'
|
|
138
110
|
export {
|
|
139
111
|
NoopAuditService,
|
|
140
112
|
createInvocationAudit,
|
|
141
|
-
resolveAuditConfig,
|
|
142
|
-
resolveAuditUserIdentityFromWire,
|
|
143
113
|
} from './audit-service.js'
|
|
144
114
|
export type {
|
|
145
115
|
AuditConfig,
|
|
@@ -147,10 +117,7 @@ export type {
|
|
|
147
117
|
AuditEvent,
|
|
148
118
|
AuditEventBatch,
|
|
149
119
|
AuditLog,
|
|
150
|
-
AuditLogWriteInput,
|
|
151
|
-
AuditOutcome,
|
|
152
120
|
AuditService,
|
|
153
|
-
AuditSource,
|
|
154
121
|
AuditUserIdentity,
|
|
155
122
|
ResolvedAuditConfig,
|
|
156
123
|
} from './audit-service.js'
|
|
@@ -174,17 +141,10 @@ export type {
|
|
|
174
141
|
AgentMeta,
|
|
175
142
|
EmailsMeta,
|
|
176
143
|
EmailTemplateMeta,
|
|
177
|
-
EmailTemplateLocaleMeta,
|
|
178
|
-
EmailTemplateAssets,
|
|
179
144
|
} from './meta-service.js'
|
|
180
145
|
export type {
|
|
181
146
|
CoverageService,
|
|
182
|
-
CoverageSnapshot,
|
|
183
|
-
LineHits,
|
|
184
147
|
ScriptCoverage,
|
|
185
|
-
FunctionCoverage,
|
|
186
|
-
CoverageRange,
|
|
187
|
-
CoverageStatus,
|
|
188
148
|
FunctionCoverageEntry,
|
|
189
149
|
FunctionCoverageReport,
|
|
190
150
|
CoverageFunctionMeta,
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { describe, test } from 'node:test'
|
|
2
|
+
import assert from 'node:assert/strict'
|
|
3
|
+
|
|
4
|
+
import { ScopedCredentialService } from './scoped-credential-service.js'
|
|
5
|
+
import type { CredentialService } from './credential-service.js'
|
|
6
|
+
|
|
7
|
+
const createCredentialService = (): CredentialService => {
|
|
8
|
+
const store: Record<string, Record<string, unknown>> = {
|
|
9
|
+
'user-1': { slack: 'slack-token', stripe: 'stripe-key' },
|
|
10
|
+
'user-2': { slack: 'other-slack-token' },
|
|
11
|
+
}
|
|
12
|
+
return {
|
|
13
|
+
get: async (name, userId = 'user-1') =>
|
|
14
|
+
(store[userId]?.[name] ?? null) as never,
|
|
15
|
+
set: async (name, value, userId = 'user-1') => {
|
|
16
|
+
store[userId] = { ...store[userId], [name]: value }
|
|
17
|
+
},
|
|
18
|
+
delete: async (name, userId = 'user-1') => {
|
|
19
|
+
delete store[userId]?.[name]
|
|
20
|
+
},
|
|
21
|
+
has: async (name, userId = 'user-1') => name in (store[userId] ?? {}),
|
|
22
|
+
getAll: async (userId) => store[userId] ?? {},
|
|
23
|
+
getUsersWithCredential: async (name) =>
|
|
24
|
+
Object.keys(store).filter((userId) => name in store[userId]!),
|
|
25
|
+
getAllUsers: async () => Object.keys(store),
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const scoped = (names: string[]) =>
|
|
30
|
+
new ScopedCredentialService(createCredentialService(), new Set(names))
|
|
31
|
+
|
|
32
|
+
describe('ScopedCredentialService', () => {
|
|
33
|
+
test('a declared credential is readable and writable', async () => {
|
|
34
|
+
const credentials = scoped(['slack'])
|
|
35
|
+
|
|
36
|
+
assert.equal(await credentials.get('slack'), 'slack-token')
|
|
37
|
+
assert.equal(await credentials.has('slack'), true)
|
|
38
|
+
await credentials.set('slack', 'refreshed')
|
|
39
|
+
assert.equal(await credentials.get('slack'), 'refreshed')
|
|
40
|
+
await credentials.delete('slack')
|
|
41
|
+
assert.equal(await credentials.get('slack'), null)
|
|
42
|
+
})
|
|
43
|
+
|
|
44
|
+
test('an undeclared credential is denied on every accessor', async () => {
|
|
45
|
+
const credentials = scoped(['slack'])
|
|
46
|
+
|
|
47
|
+
await assert.rejects(() => credentials.get('stripe'), /denied/i)
|
|
48
|
+
await assert.rejects(() => credentials.has('stripe'), /denied/i)
|
|
49
|
+
await assert.rejects(() => credentials.set('stripe', 'x'), /denied/i)
|
|
50
|
+
await assert.rejects(() => credentials.delete('stripe'), /denied/i)
|
|
51
|
+
await assert.rejects(
|
|
52
|
+
() => credentials.getUsersWithCredential('stripe'),
|
|
53
|
+
/denied/i
|
|
54
|
+
)
|
|
55
|
+
})
|
|
56
|
+
|
|
57
|
+
test('getAll returns only the declared credentials, not the whole user', async () => {
|
|
58
|
+
const credentials = scoped(['slack'])
|
|
59
|
+
|
|
60
|
+
assert.deepEqual(await credentials.getAll('user-1'), {
|
|
61
|
+
slack: 'slack-token',
|
|
62
|
+
})
|
|
63
|
+
})
|
|
64
|
+
|
|
65
|
+
test('enumerating every user of the app is denied outright', async () => {
|
|
66
|
+
const credentials = scoped(['slack'])
|
|
67
|
+
|
|
68
|
+
await assert.rejects(() => credentials.getAllUsers(), /denied/i)
|
|
69
|
+
})
|
|
70
|
+
|
|
71
|
+
test('the users of a declared credential are still visible', async () => {
|
|
72
|
+
const credentials = scoped(['slack'])
|
|
73
|
+
|
|
74
|
+
assert.deepEqual(await credentials.getUsersWithCredential('slack'), [
|
|
75
|
+
'user-1',
|
|
76
|
+
'user-2',
|
|
77
|
+
])
|
|
78
|
+
})
|
|
79
|
+
|
|
80
|
+
test('an addon that declares nothing reaches nothing', async () => {
|
|
81
|
+
const credentials = scoped([])
|
|
82
|
+
|
|
83
|
+
await assert.rejects(() => credentials.get('slack'), /denied/i)
|
|
84
|
+
assert.deepEqual(await credentials.getAll('user-1'), {})
|
|
85
|
+
})
|
|
86
|
+
})
|