@pikku/addon-console 0.12.43 → 0.12.45
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 +140 -0
- package/dist/.pikku/addon/agent/index.d.ts +1 -1
- package/dist/.pikku/addon/agent/index.js +1 -1
- package/dist/.pikku/addon/agent/pikku-agent-map.gen.d.ts +1 -1
- package/dist/.pikku/addon/agent/pikku-agent-types.gen.d.ts +1 -1
- package/dist/.pikku/addon/agent/pikku-model-aliases.gen.js +1 -1
- package/dist/.pikku/addon/agent/pikku-scorer-names.gen.d.ts +1 -1
- package/dist/.pikku/addon/auth/auth.types.d.ts +1 -1
- package/dist/.pikku/addon/auth/auth.types.js +1 -1
- package/dist/.pikku/addon/auth/index.d.ts +1 -1
- package/dist/.pikku/addon/auth/index.js +1 -1
- package/dist/.pikku/addon/auth/pikku-auth-types.gen.d.ts +9 -2
- package/dist/.pikku/addon/auth/pikku-auth-types.gen.d.ts.map +1 -1
- package/dist/.pikku/addon/auth/pikku-auth-types.gen.js +1 -1
- package/dist/.pikku/addon/auth/pikku-auth-types.gen.js.map +1 -1
- package/dist/.pikku/addon/channel/index.d.ts +1 -1
- package/dist/.pikku/addon/channel/index.js +1 -1
- package/dist/.pikku/addon/channel/pikku-channel-types.gen.d.ts +1 -1
- package/dist/.pikku/addon/channel/pikku-channel-types.gen.js +1 -1
- package/dist/.pikku/addon/error/index.d.ts +1 -1
- package/dist/.pikku/addon/error/index.js +1 -1
- package/dist/.pikku/addon/error/pikku-error-types.gen.d.ts +1 -1
- package/dist/.pikku/addon/error/pikku-error-types.gen.js +1 -1
- package/dist/.pikku/addon/function/index.d.ts +1 -1
- package/dist/.pikku/addon/function/index.js +1 -1
- package/dist/.pikku/addon/function/pikku-function-types.gen.d.ts +12 -2
- package/dist/.pikku/addon/function/pikku-function-types.gen.d.ts.map +1 -1
- package/dist/.pikku/addon/function/pikku-function-types.gen.js +1 -1
- package/dist/.pikku/addon/function/pikku-function-types.gen.js.map +1 -1
- package/dist/.pikku/addon/function/pikku-functions-meta-verbose.gen.json +139 -11
- package/dist/.pikku/addon/function/pikku-functions-meta.gen.js +1 -1
- package/dist/.pikku/addon/function/pikku-functions-meta.gen.json +104 -3
- package/dist/.pikku/addon/function/pikku-functions.gen.js +7 -1
- package/dist/.pikku/addon/function/pikku-functions.gen.js.map +1 -1
- package/dist/.pikku/addon/http/index.d.ts +1 -1
- package/dist/.pikku/addon/http/index.js +1 -1
- package/dist/.pikku/addon/http/pikku-http-types.gen.d.ts +1 -1
- package/dist/.pikku/addon/http/pikku-http-types.gen.js +1 -1
- package/dist/.pikku/addon/mcp/index.d.ts +1 -1
- package/dist/.pikku/addon/mcp/index.js +1 -1
- package/dist/.pikku/addon/mcp/pikku-mcp-types.gen.d.ts +1 -1
- package/dist/.pikku/addon/mcp/pikku-mcp-types.gen.js +1 -1
- package/dist/.pikku/addon/middleware/index.d.ts +1 -1
- package/dist/.pikku/addon/middleware/index.js +1 -1
- package/dist/.pikku/addon/middleware/pikku-middleware-types.gen.d.ts +10 -3
- package/dist/.pikku/addon/middleware/pikku-middleware-types.gen.d.ts.map +1 -1
- package/dist/.pikku/addon/middleware/pikku-middleware-types.gen.js +1 -1
- package/dist/.pikku/addon/middleware/pikku-middleware-types.gen.js.map +1 -1
- package/dist/.pikku/addon/permissions/pikku-permissions.gen.d.ts +5 -0
- package/dist/.pikku/addon/permissions/pikku-permissions.gen.d.ts.map +1 -0
- package/dist/.pikku/addon/permissions/pikku-permissions.gen.js +5 -0
- package/dist/.pikku/addon/permissions/pikku-permissions.gen.js.map +1 -0
- package/dist/.pikku/addon/pikku-bootstrap-scenarios.gen.d.ts +1 -1
- package/dist/.pikku/addon/pikku-bootstrap-scenarios.gen.js +1 -1
- package/dist/.pikku/addon/pikku-bootstrap.gen.d.ts +2 -1
- package/dist/.pikku/addon/pikku-bootstrap.gen.d.ts.map +1 -1
- package/dist/.pikku/addon/pikku-bootstrap.gen.js +2 -1
- package/dist/.pikku/addon/pikku-bootstrap.gen.js.map +1 -1
- package/dist/.pikku/addon/pikku-package.gen.js +1 -1
- package/dist/.pikku/addon/pikku-services.gen.d.ts +5 -4
- package/dist/.pikku/addon/pikku-services.gen.d.ts.map +1 -1
- package/dist/.pikku/addon/pikku-services.gen.js +3 -2
- package/dist/.pikku/addon/pikku-services.gen.js.map +1 -1
- package/dist/.pikku/addon/rpc/pikku-rpc-wirings-map.gen.d.ts +10 -1
- package/dist/.pikku/addon/rpc/pikku-rpc-wirings-map.internal.gen.d.ts +10 -1
- package/dist/.pikku/addon/rpc/pikku-rpc-wirings-map.remote.gen.d.ts +7 -1
- package/dist/.pikku/addon/rpc/pikku-rpc-wirings-meta.internal.gen.js +1 -1
- package/dist/.pikku/addon/rpc/pikku-rpc-wirings-meta.internal.gen.json +3 -0
- package/dist/.pikku/addon/scenarios/index.d.ts +1 -1
- package/dist/.pikku/addon/scenarios/index.js +1 -1
- package/dist/.pikku/addon/scenarios/pikku-personas.gen.js +1 -1
- package/dist/.pikku/addon/scenarios/pikku-scenario-functions-meta.gen.js +1 -1
- package/dist/.pikku/addon/scenarios/pikku-scenario-functions.gen.d.ts +1 -1
- package/dist/.pikku/addon/scenarios/pikku-scenario-types.gen.d.ts +1 -1
- package/dist/.pikku/addon/scenarios/pikku-scenario-wirings-meta.gen.js +1 -1
- package/dist/.pikku/addon/scenarios/pikku-scenario-wirings.gen.d.ts +1 -1
- package/dist/.pikku/addon/scenarios/schemas/register.gen.d.ts +1 -1
- package/dist/.pikku/addon/scenarios/schemas/register.gen.js +1 -1
- package/dist/.pikku/addon/schemas/register.gen.js +13 -1
- package/dist/.pikku/addon/schemas/register.gen.js.map +1 -1
- package/dist/.pikku/addon/schemas/schemas/GetVirtualUserRunStepsInput.schema.json +1 -0
- package/dist/.pikku/addon/schemas/schemas/GetVirtualUserRunStepsOutput.schema.json +1 -0
- package/dist/.pikku/addon/schemas/schemas/GetVirtualUserRunsInput.schema.json +1 -0
- package/dist/.pikku/addon/schemas/schemas/GetVirtualUserRunsOutput.schema.json +1 -0
- package/dist/.pikku/addon/schemas/schemas/StartVirtualUserRunInput.schema.json +1 -0
- package/dist/.pikku/addon/schemas/schemas/StartVirtualUserRunOutput.schema.json +1 -0
- package/dist/.pikku/addon/scopes/index.d.ts +1 -1
- package/dist/.pikku/addon/scopes/index.js +1 -1
- package/dist/.pikku/addon/scopes/pikku-personas.gen.js +1 -1
- package/dist/.pikku/addon/scopes/pikku-roles.gen.d.ts +1 -1
- package/dist/.pikku/addon/scopes/pikku-scope-types.gen.d.ts +1 -1
- package/dist/.pikku/addon/scopes/pikku-scope-types.gen.js +1 -1
- package/dist/.pikku/addon/scopes/pikku-scopes-meta.gen.json +11 -0
- package/dist/.pikku/addon/scopes/pikku-scopes.gen.d.ts +2 -2
- package/dist/.pikku/addon/scopes/pikku-scopes.gen.d.ts.map +1 -1
- package/dist/.pikku/addon/scopes/pikku-scopes.gen.js.map +1 -1
- package/dist/.pikku/addon/secrets/index.d.ts +1 -1
- package/dist/.pikku/addon/secrets/index.js +1 -1
- package/dist/.pikku/addon/secrets/pikku-secret-types.gen.d.ts +1 -1
- package/dist/.pikku/addon/secrets/pikku-secret-types.gen.js +1 -1
- package/dist/.pikku/addon/secrets/pikku-secrets.gen.d.ts +1 -1
- package/dist/.pikku/addon/secrets/pikku-secrets.gen.js +1 -1
- package/dist/.pikku/addon/services/pikku-meta-service.gen.d.ts +1 -1
- package/dist/.pikku/addon/services/pikku-meta-service.gen.js +1 -1
- package/dist/.pikku/addon/setup/index.d.ts +1 -1
- package/dist/.pikku/addon/setup/index.js +1 -1
- package/dist/.pikku/addon/setup/pikku-addon-setup-types.gen.d.ts +1 -1
- package/dist/.pikku/addon/setup/pikku-addon-setup-types.gen.js +1 -1
- package/dist/.pikku/addon/setup/pikku-setup-types.gen.d.ts +1 -1
- package/dist/.pikku/addon/setup/pikku-setup-types.gen.js +1 -1
- package/dist/.pikku/addon/trigger/index.d.ts +1 -1
- package/dist/.pikku/addon/trigger/index.js +1 -1
- package/dist/.pikku/addon/trigger/pikku-trigger-types.gen.d.ts +1 -1
- package/dist/.pikku/addon/trigger/pikku-trigger-types.gen.js +1 -1
- package/dist/.pikku/addon/variables/index.d.ts +1 -1
- package/dist/.pikku/addon/variables/index.js +1 -1
- package/dist/.pikku/addon/variables/pikku-variable-types.gen.d.ts +1 -1
- package/dist/.pikku/addon/variables/pikku-variable-types.gen.js +1 -1
- package/dist/.pikku/addon/variables/pikku-variables.gen.d.ts +1 -1
- package/dist/.pikku/addon/variables/pikku-variables.gen.js +1 -1
- package/dist/.pikku/addon/workflow/index.d.ts +1 -1
- package/dist/.pikku/addon/workflow/index.js +1 -1
- package/dist/.pikku/addon/workflow/pikku-scenario-step-map.gen.d.ts +1 -1
- package/dist/.pikku/addon/workflow/pikku-workflow-map.gen.d.ts +1 -1
- package/dist/.pikku/addon/workflow/pikku-workflow-types.gen.d.ts +1 -1
- package/dist/.pikku/addon/workflow/pikku-workflow-types.gen.js +1 -1
- package/dist/.pikku/addon/workflow/pikku-workflow-wirings-meta.gen.js +1 -1
- package/dist/.pikku/addon/workflow/pikku-workflow-wirings.gen.d.ts +1 -1
- package/dist/.pikku/addon/workflow/pikku-workflow-wirings.gen.js +1 -1
- package/dist/src/functions/delete-agent-thread.function.d.ts.map +1 -1
- package/dist/src/functions/delete-agent-thread.function.js +3 -1
- package/dist/src/functions/delete-agent-thread.function.js.map +1 -1
- package/dist/src/functions/delete-agent-thread.function.test.d.ts +2 -0
- package/dist/src/functions/delete-agent-thread.function.test.d.ts.map +1 -0
- package/dist/src/functions/delete-agent-thread.function.test.js +8 -0
- package/dist/src/functions/delete-agent-thread.function.test.js.map +1 -0
- package/dist/src/functions/get-agent-thread-messages.function.d.ts.map +1 -1
- package/dist/src/functions/get-agent-thread-messages.function.js +3 -1
- package/dist/src/functions/get-agent-thread-messages.function.js.map +1 -1
- package/dist/src/functions/get-agent-thread-messages.function.test.d.ts +2 -0
- package/dist/src/functions/get-agent-thread-messages.function.test.d.ts.map +1 -0
- package/dist/src/functions/get-agent-thread-messages.function.test.js +8 -0
- package/dist/src/functions/get-agent-thread-messages.function.test.js.map +1 -0
- package/dist/src/functions/get-virtual-user-run-steps.function.d.ts +14 -0
- package/dist/src/functions/get-virtual-user-run-steps.function.d.ts.map +1 -0
- package/dist/src/functions/get-virtual-user-run-steps.function.js +31 -0
- package/dist/src/functions/get-virtual-user-run-steps.function.js.map +1 -0
- package/dist/src/functions/get-virtual-user-runs.function.d.ts +14 -0
- package/dist/src/functions/get-virtual-user-runs.function.d.ts.map +1 -0
- package/dist/src/functions/get-virtual-user-runs.function.js +39 -0
- package/dist/src/functions/get-virtual-user-runs.function.js.map +1 -0
- package/dist/src/functions/is-thread-owner.permission.d.ts +13 -0
- package/dist/src/functions/is-thread-owner.permission.d.ts.map +1 -0
- package/dist/src/functions/is-thread-owner.permission.js +23 -0
- package/dist/src/functions/is-thread-owner.permission.js.map +1 -0
- package/dist/src/functions/is-thread-owner.permission.test.d.ts +2 -0
- package/dist/src/functions/is-thread-owner.permission.test.d.ts.map +1 -0
- package/dist/src/functions/is-thread-owner.permission.test.js +25 -0
- package/dist/src/functions/is-thread-owner.permission.test.js.map +1 -0
- package/dist/src/functions/render-email-preview.function.d.ts.map +1 -1
- package/dist/src/functions/render-email-preview.function.js +6 -17
- package/dist/src/functions/render-email-preview.function.js.map +1 -1
- package/dist/src/functions/render-email-template.utils.d.ts +8 -3
- package/dist/src/functions/render-email-template.utils.d.ts.map +1 -1
- package/dist/src/functions/render-email-template.utils.js +71 -17
- package/dist/src/functions/render-email-template.utils.js.map +1 -1
- package/dist/src/functions/render-email-template.utils.test.js +56 -23
- package/dist/src/functions/render-email-template.utils.test.js.map +1 -1
- package/dist/src/functions/start-virtual-user-run.function.d.ts +33 -0
- package/dist/src/functions/start-virtual-user-run.function.d.ts.map +1 -0
- package/dist/src/functions/start-virtual-user-run.function.js +31 -0
- package/dist/src/functions/start-virtual-user-run.function.js.map +1 -0
- package/dist/src/scopes.js +11 -0
- package/dist/src/scopes.js.map +1 -1
- package/package.json +4 -4
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* This file was generated by @pikku/cli@0.12.
|
|
2
|
+
* This file was generated by @pikku/cli@0.12.112
|
|
3
3
|
*/
|
|
4
4
|
import { WorkflowCancelledException } from '@pikku/core/workflow';
|
|
5
5
|
import type { PikkuWorkflowGraphConfig, PikkuWorkflowGraphResult } from '@pikku/core/workflow';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"delete-agent-thread.function.d.ts","sourceRoot":"","sources":["../../../src/functions/delete-agent-thread.function.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"delete-agent-thread.function.d.ts","sourceRoot":"","sources":["../../../src/functions/delete-agent-thread.function.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,iBAAiB;cAChB,MAAM;;aACP,OAAO;;cADN,MAAM;;aACP,OAAO;;cADN,MAAM;;aACP,OAAO;oGAYlB,CAAA"}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import { pikkuFunc } from '#pikku/addon/function';
|
|
2
|
+
import { isThreadOwner } from './is-thread-owner.permission.js';
|
|
2
3
|
export const deleteAgentThread = pikkuFunc({
|
|
3
4
|
title: 'Delete Agent Thread',
|
|
4
|
-
description: 'Deletes an AI agent thread and all its associated messages and runs via cascade.',
|
|
5
|
+
description: 'Deletes an AI agent thread and all its associated messages and runs via cascade. A caller without the admin scope may only delete a thread its own session owns.',
|
|
5
6
|
expose: true,
|
|
6
7
|
scopes: ['pikku:console:agents:manage'],
|
|
8
|
+
permissions: { owner: isThreadOwner },
|
|
7
9
|
func: async ({ agentRunService }, input) => {
|
|
8
10
|
const deleted = await agentRunService.deleteThread(input.threadId);
|
|
9
11
|
return { deleted };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"delete-agent-thread.function.js","sourceRoot":"","sources":["../../../src/functions/delete-agent-thread.function.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;
|
|
1
|
+
{"version":3,"file":"delete-agent-thread.function.js","sourceRoot":"","sources":["../../../src/functions/delete-agent-thread.function.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAA;AAE/D,MAAM,CAAC,MAAM,iBAAiB,GAAG,SAAS,CAGxC;IACA,KAAK,EAAE,qBAAqB;IAC5B,WAAW,EACT,kKAAkK;IACpK,MAAM,EAAE,IAAI;IACZ,MAAM,EAAE,CAAC,6BAA6B,CAAC;IACvC,WAAW,EAAE,EAAE,KAAK,EAAE,aAAa,EAAE;IACrC,IAAI,EAAE,KAAK,EAAE,EAAE,eAAe,EAAE,EAAE,KAAK,EAAE,EAAE;QACzC,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,YAAY,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAA;QAClE,OAAO,EAAE,OAAO,EAAE,CAAA;IACpB,CAAC;CACF,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delete-agent-thread.function.test.d.ts","sourceRoot":"","sources":["../../../src/functions/delete-agent-thread.function.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import assert from 'node:assert/strict';
|
|
2
|
+
import { test } from 'node:test';
|
|
3
|
+
import { deleteAgentThread } from './delete-agent-thread.function.js';
|
|
4
|
+
import { isThreadOwner } from './is-thread-owner.permission.js';
|
|
5
|
+
test('deleting a thread is gated on thread ownership', () => {
|
|
6
|
+
assert.deepEqual(deleteAgentThread.permissions, { owner: isThreadOwner });
|
|
7
|
+
});
|
|
8
|
+
//# sourceMappingURL=delete-agent-thread.function.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delete-agent-thread.function.test.js","sourceRoot":"","sources":["../../../src/functions/delete-agent-thread.function.test.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAA;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAEhC,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAA;AACrE,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAA;AAE/D,IAAI,CAAC,gDAAgD,EAAE,GAAG,EAAE;IAC1D,MAAM,CAAC,SAAS,CAAC,iBAAiB,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC,CAAA;AAC3E,CAAC,CAAC,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-agent-thread-messages.function.d.ts","sourceRoot":"","sources":["../../../src/functions/get-agent-thread-messages.function.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"get-agent-thread-messages.function.d.ts","sourceRoot":"","sources":["../../../src/functions/get-agent-thread-messages.function.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,sBAAsB;cAAyB,MAAM;;cAAN,MAAM;;cAAN,MAAM;2GAUhE,CAAA"}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import { pikkuFunc } from '#pikku/addon/function';
|
|
2
|
+
import { isThreadOwner } from './is-thread-owner.permission.js';
|
|
2
3
|
export const getAgentThreadMessages = pikkuFunc({
|
|
3
4
|
title: 'Get Agent Thread Messages',
|
|
4
|
-
description: 'Returns all messages for a given AI agent thread, ordered by creation time.',
|
|
5
|
+
description: 'Returns all messages for a given AI agent thread, ordered by creation time. A caller without the admin scope may only read a thread its own session owns.',
|
|
5
6
|
expose: true,
|
|
6
7
|
scopes: ['pikku:console:agents:read'],
|
|
8
|
+
permissions: { owner: isThreadOwner },
|
|
7
9
|
func: async ({ agentRunService }, input) => {
|
|
8
10
|
return await agentRunService.getThreadMessages(input.threadId);
|
|
9
11
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-agent-thread-messages.function.js","sourceRoot":"","sources":["../../../src/functions/get-agent-thread-messages.function.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;
|
|
1
|
+
{"version":3,"file":"get-agent-thread-messages.function.js","sourceRoot":"","sources":["../../../src/functions/get-agent-thread-messages.function.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAA;AAE/D,MAAM,CAAC,MAAM,sBAAsB,GAAG,SAAS,CAA8B;IAC3E,KAAK,EAAE,2BAA2B;IAClC,WAAW,EACT,2JAA2J;IAC7J,MAAM,EAAE,IAAI;IACZ,MAAM,EAAE,CAAC,2BAA2B,CAAC;IACrC,WAAW,EAAE,EAAE,KAAK,EAAE,aAAa,EAAE;IACrC,IAAI,EAAE,KAAK,EAAE,EAAE,eAAe,EAAE,EAAE,KAAK,EAAE,EAAE;QACzC,OAAO,MAAM,eAAe,CAAC,iBAAiB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAA;IAChE,CAAC;CACF,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-agent-thread-messages.function.test.d.ts","sourceRoot":"","sources":["../../../src/functions/get-agent-thread-messages.function.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import assert from 'node:assert/strict';
|
|
2
|
+
import { test } from 'node:test';
|
|
3
|
+
import { getAgentThreadMessages } from './get-agent-thread-messages.function.js';
|
|
4
|
+
import { isThreadOwner } from './is-thread-owner.permission.js';
|
|
5
|
+
test('thread messages are gated on thread ownership', () => {
|
|
6
|
+
assert.deepEqual(getAgentThreadMessages.permissions, { owner: isThreadOwner });
|
|
7
|
+
});
|
|
8
|
+
//# sourceMappingURL=get-agent-thread-messages.function.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-agent-thread-messages.function.test.js","sourceRoot":"","sources":["../../../src/functions/get-agent-thread-messages.function.test.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAA;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAEhC,OAAO,EAAE,sBAAsB,EAAE,MAAM,yCAAyC,CAAA;AAChF,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAA;AAE/D,IAAI,CAAC,+CAA+C,EAAE,GAAG,EAAE;IACzD,MAAM,CAAC,SAAS,CAAC,sBAAsB,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC,CAAA;AAChF,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export declare const getVirtualUserRunSteps: import("#pikku/addon/function").PikkuFunctionConfig<{
|
|
2
|
+
runId: string;
|
|
3
|
+
limit?: number;
|
|
4
|
+
offset?: number;
|
|
5
|
+
}, any[], "rpc" | "session", import("#pikku/addon/function").PikkuFunction<{
|
|
6
|
+
runId: string;
|
|
7
|
+
limit?: number;
|
|
8
|
+
offset?: number;
|
|
9
|
+
}, any[], "rpc" | "session", import("#pikku/addon/function").WiredServices> | import("#pikku/addon/function").PikkuFunctionSessionless<{
|
|
10
|
+
runId: string;
|
|
11
|
+
limit?: number;
|
|
12
|
+
offset?: number;
|
|
13
|
+
}, any[], "rpc" | "session", import("#pikku/addon/function").WiredServices, unknown>, undefined, undefined>;
|
|
14
|
+
//# sourceMappingURL=get-virtual-user-run-steps.function.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-virtual-user-run-steps.function.d.ts","sourceRoot":"","sources":["../../../src/functions/get-virtual-user-run-steps.function.ts"],"names":[],"mappings":"AAcA,eAAO,MAAM,sBAAsB;WACxB,MAAM;YAAU,MAAM;aAAW,MAAM;;WAAvC,MAAM;YAAU,MAAM;aAAW,MAAM;;WAAvC,MAAM;YAAU,MAAM;aAAW,MAAM;2GAoBhD,CAAA"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { pikkuFunc } from '#pikku/addon/function';
|
|
2
|
+
/**
|
|
3
|
+
* One run's turns, in the order they happened.
|
|
4
|
+
*
|
|
5
|
+
* Its own call rather than a field on the run: a run at a 500-step budget
|
|
6
|
+
* carries more transcript than every other column together, so the list would
|
|
7
|
+
* pay for it on every row.
|
|
8
|
+
*
|
|
9
|
+
* SECURITY: the transcript is strictly more sensitive than the summary it
|
|
10
|
+
* belongs to — it carries the live ids and payloads the run actually sent.
|
|
11
|
+
*/
|
|
12
|
+
const MAX_STEPS = 500;
|
|
13
|
+
export const getVirtualUserRunSteps = pikkuFunc({
|
|
14
|
+
title: 'Get Virtual User Run Steps',
|
|
15
|
+
description: 'Returns every turn one virtual user run took: what it called, what came back, and what that cost.',
|
|
16
|
+
expose: true,
|
|
17
|
+
scopes: ['pikku:console:virtualUsers:read'],
|
|
18
|
+
func: async ({ virtualUserRunStore }, input) => {
|
|
19
|
+
if (!virtualUserRunStore) {
|
|
20
|
+
return [];
|
|
21
|
+
}
|
|
22
|
+
return await virtualUserRunStore.steps(input.runId, {
|
|
23
|
+
// A run's whole transcript at the largest budget pikku allows, and no
|
|
24
|
+
// more: the input is a plain type, so the ceiling cannot come from a
|
|
25
|
+
// schema the way the scaffolded read's does.
|
|
26
|
+
limit: Math.min(input?.limit ?? MAX_STEPS, MAX_STEPS),
|
|
27
|
+
offset: input?.offset,
|
|
28
|
+
});
|
|
29
|
+
},
|
|
30
|
+
});
|
|
31
|
+
//# sourceMappingURL=get-virtual-user-run-steps.function.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-virtual-user-run-steps.function.js","sourceRoot":"","sources":["../../../src/functions/get-virtual-user-run-steps.function.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AAEjD;;;;;;;;;GASG;AACH,MAAM,SAAS,GAAG,GAAG,CAAA;AAErB,MAAM,CAAC,MAAM,sBAAsB,GAAG,SAAS,CAG7C;IACA,KAAK,EAAE,4BAA4B;IACnC,WAAW,EACT,mGAAmG;IACrG,MAAM,EAAE,IAAI;IACZ,MAAM,EAAE,CAAC,iCAAiC,CAAC;IAC3C,IAAI,EAAE,KAAK,EAAE,EAAE,mBAAmB,EAAE,EAAE,KAAK,EAAE,EAAE;QAC7C,IAAI,CAAC,mBAAmB,EAAE,CAAC;YACzB,OAAO,EAAE,CAAA;QACX,CAAC;QACD,OAAO,MAAM,mBAAmB,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE;YAClD,sEAAsE;YACtE,qEAAqE;YACrE,6CAA6C;YAC7C,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,IAAI,SAAS,EAAE,SAAS,CAAC;YACrD,MAAM,EAAE,KAAK,EAAE,MAAM;SACtB,CAAC,CAAA;IACJ,CAAC;CACF,CAAC,CAAA"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export declare const getVirtualUserRuns: import("#pikku/addon/function").PikkuFunctionConfig<{
|
|
2
|
+
persona?: string;
|
|
3
|
+
limit?: number;
|
|
4
|
+
offset?: number;
|
|
5
|
+
}, any[], "rpc" | "session", import("#pikku/addon/function").PikkuFunction<{
|
|
6
|
+
persona?: string;
|
|
7
|
+
limit?: number;
|
|
8
|
+
offset?: number;
|
|
9
|
+
}, any[], "rpc" | "session", import("#pikku/addon/function").WiredServices> | import("#pikku/addon/function").PikkuFunctionSessionless<{
|
|
10
|
+
persona?: string;
|
|
11
|
+
limit?: number;
|
|
12
|
+
offset?: number;
|
|
13
|
+
}, any[], "rpc" | "session", import("#pikku/addon/function").WiredServices, unknown>, undefined, undefined>;
|
|
14
|
+
//# sourceMappingURL=get-virtual-user-runs.function.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-virtual-user-runs.function.d.ts","sourceRoot":"","sources":["../../../src/functions/get-virtual-user-runs.function.ts"],"names":[],"mappings":"AAgBA,eAAO,MAAM,kBAAkB;cACjB,MAAM;YAAU,MAAM;aAAW,MAAM;;cAAvC,MAAM;YAAU,MAAM;aAAW,MAAM;;cAAvC,MAAM;YAAU,MAAM;aAAW,MAAM;2GA0BnD,CAAA"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { pikkuFunc } from '#pikku/addon/function';
|
|
2
|
+
/**
|
|
3
|
+
* What the virtual users have been doing, newest first.
|
|
4
|
+
*
|
|
5
|
+
* Read off the host's own `virtualUserRunStore` rather than through the
|
|
6
|
+
* scaffolded RPCs, so the console shows a project's runs whether or not that
|
|
7
|
+
* project turned `scaffold.virtualUser` on — wiring the store is the only thing
|
|
8
|
+
* a run needs, and it is what a run already needs.
|
|
9
|
+
*
|
|
10
|
+
* SECURITY: an `adversarial` run's findings are working exploits carrying live
|
|
11
|
+
* ids. This is a privileged read, which is why it has a scope of its own rather
|
|
12
|
+
* than riding on the wirings one.
|
|
13
|
+
*/
|
|
14
|
+
const MAX_RUNS = 100;
|
|
15
|
+
export const getVirtualUserRuns = pikkuFunc({
|
|
16
|
+
title: 'Get Virtual User Runs',
|
|
17
|
+
description: 'Returns recorded virtual user runs, newest first. Accepts optional persona, limit and offset.',
|
|
18
|
+
expose: true,
|
|
19
|
+
scopes: ['pikku:console:virtualUsers:read'],
|
|
20
|
+
func: async ({ virtualUserRunStore }, input) => {
|
|
21
|
+
if (!virtualUserRunStore) {
|
|
22
|
+
return [];
|
|
23
|
+
}
|
|
24
|
+
const runs = await virtualUserRunStore.list({
|
|
25
|
+
persona: input?.persona,
|
|
26
|
+
// The scaffolded read bounds this through zod; nothing types a console
|
|
27
|
+
// function's input at runtime, so the ceiling is applied here instead of
|
|
28
|
+
// letting a caller ask the store for every run an app has ever recorded.
|
|
29
|
+
limit: Math.min(input?.limit ?? MAX_RUNS, MAX_RUNS),
|
|
30
|
+
offset: input?.offset,
|
|
31
|
+
});
|
|
32
|
+
return runs.map((run) => ({
|
|
33
|
+
...run,
|
|
34
|
+
createdAt: run.createdAt.toISOString(),
|
|
35
|
+
finishedAt: run.finishedAt ? run.finishedAt.toISOString() : null,
|
|
36
|
+
}));
|
|
37
|
+
},
|
|
38
|
+
});
|
|
39
|
+
//# sourceMappingURL=get-virtual-user-runs.function.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-virtual-user-runs.function.js","sourceRoot":"","sources":["../../../src/functions/get-virtual-user-runs.function.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AAEjD;;;;;;;;;;;GAWG;AACH,MAAM,QAAQ,GAAG,GAAG,CAAA;AAEpB,MAAM,CAAC,MAAM,kBAAkB,GAAG,SAAS,CAGzC;IACA,KAAK,EAAE,uBAAuB;IAC9B,WAAW,EACT,+FAA+F;IACjG,MAAM,EAAE,IAAI;IACZ,MAAM,EAAE,CAAC,iCAAiC,CAAC;IAC3C,IAAI,EAAE,KAAK,EAAE,EAAE,mBAAmB,EAAE,EAAE,KAAK,EAAE,EAAE;QAC7C,IAAI,CAAC,mBAAmB,EAAE,CAAC;YACzB,OAAO,EAAE,CAAA;QACX,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,mBAAmB,CAAC,IAAI,CAAC;YAC1C,OAAO,EAAE,KAAK,EAAE,OAAO;YACvB,uEAAuE;YACvE,yEAAyE;YACzE,yEAAyE;YACzE,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,IAAI,QAAQ,EAAE,QAAQ,CAAC;YACnD,MAAM,EAAE,KAAK,EAAE,MAAM;SACtB,CAAC,CAAA;QACF,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YACxB,GAAG,GAAG;YACN,SAAS,EAAE,GAAG,CAAC,SAAS,CAAC,WAAW,EAAE;YACtC,UAAU,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI;SACjE,CAAC,CAAC,CAAA;IACL,CAAC;CACF,CAAC,CAAA"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A single-thread read is keyed by a caller-supplied `threadId`, so ownership
|
|
3
|
+
* cannot come from the request — it is derived from the session and checked
|
|
4
|
+
* against the stored thread's resourceId. The sibling list endpoints filter
|
|
5
|
+
* instead; a lookup of one thread has nothing to filter, so it is refused.
|
|
6
|
+
*
|
|
7
|
+
* A missing thread is refused rather than 404'd so it is indistinguishable from
|
|
8
|
+
* one owned by someone else — no existence oracle.
|
|
9
|
+
*/
|
|
10
|
+
export declare const isThreadOwner: import("#pikku/addon/auth").PikkuPermission<{
|
|
11
|
+
threadId: string;
|
|
12
|
+
}, import("../../.pikku/addon/function/pikku-function-types.gen.js").WiredServices>;
|
|
13
|
+
//# sourceMappingURL=is-thread-owner.permission.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"is-thread-owner.permission.d.ts","sourceRoot":"","sources":["../../../src/functions/is-thread-owner.permission.ts"],"names":[],"mappings":"AAMA;;;;;;;;GAQG;AACH,eAAO,MAAM,aAAa;cAA+B,MAAM;mFAS9D,CAAA"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { hasScopes } from '@pikku/core/scope';
|
|
2
|
+
import { canAccessThread } from '@pikku/core/agent';
|
|
3
|
+
import { pikkuPermission } from '#pikku/addon/auth';
|
|
4
|
+
const ADMIN_SCOPE_ROOT = 'admin';
|
|
5
|
+
/**
|
|
6
|
+
* A single-thread read is keyed by a caller-supplied `threadId`, so ownership
|
|
7
|
+
* cannot come from the request — it is derived from the session and checked
|
|
8
|
+
* against the stored thread's resourceId. The sibling list endpoints filter
|
|
9
|
+
* instead; a lookup of one thread has nothing to filter, so it is refused.
|
|
10
|
+
*
|
|
11
|
+
* A missing thread is refused rather than 404'd so it is indistinguishable from
|
|
12
|
+
* one owned by someone else — no existence oracle.
|
|
13
|
+
*/
|
|
14
|
+
export const isThreadOwner = pikkuPermission(async ({ agentRunService }, { threadId }, { session }) => {
|
|
15
|
+
if (hasScopes([ADMIN_SCOPE_ROOT], session?.scopes)) {
|
|
16
|
+
return true;
|
|
17
|
+
}
|
|
18
|
+
const thread = await agentRunService.getThread(threadId);
|
|
19
|
+
if (!thread)
|
|
20
|
+
return false;
|
|
21
|
+
return canAccessThread(thread.resourceId, session);
|
|
22
|
+
});
|
|
23
|
+
//# sourceMappingURL=is-thread-owner.permission.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"is-thread-owner.permission.js","sourceRoot":"","sources":["../../../src/functions/is-thread-owner.permission.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAEnD,MAAM,gBAAgB,GAAG,OAAO,CAAA;AAEhC;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,eAAe,CAC1C,KAAK,EAAE,EAAE,eAAe,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;IACvD,IAAI,SAAS,CAAC,CAAC,gBAAgB,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,CAAC;QACnD,OAAO,IAAI,CAAA;IACb,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAA;IACxD,IAAI,CAAC,MAAM;QAAE,OAAO,KAAK,CAAA;IACzB,OAAO,eAAe,CAAC,MAAM,CAAC,UAAU,EAAE,OAAO,CAAC,CAAA;AACpD,CAAC,CACF,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"is-thread-owner.permission.test.d.ts","sourceRoot":"","sources":["../../../src/functions/is-thread-owner.permission.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import assert from 'node:assert/strict';
|
|
2
|
+
import { test } from 'node:test';
|
|
3
|
+
import { isThreadOwner } from './is-thread-owner.permission.js';
|
|
4
|
+
const services = {
|
|
5
|
+
agentRunService: {
|
|
6
|
+
getThread: async (threadId) => threadId === 'thread-1' ? { threadId, resourceId: 'alice' } : null,
|
|
7
|
+
},
|
|
8
|
+
};
|
|
9
|
+
const check = (session, threadId = 'thread-1') => isThreadOwner(services, { threadId }, { session });
|
|
10
|
+
test('the owning session is allowed', async () => {
|
|
11
|
+
assert.equal(await check({ userId: 'alice', scopes: [] }), true);
|
|
12
|
+
});
|
|
13
|
+
test("someone else's thread is refused", async () => {
|
|
14
|
+
assert.equal(await check({ userId: 'carol', scopes: [] }), false);
|
|
15
|
+
});
|
|
16
|
+
test('an admin reaches any thread', async () => {
|
|
17
|
+
assert.equal(await check({ userId: 'root', scopes: ['admin'] }), true);
|
|
18
|
+
});
|
|
19
|
+
test('a missing thread reads the same as one owned by someone else', async () => {
|
|
20
|
+
assert.equal(await check({ userId: 'alice', scopes: [] }, 'nope'), false);
|
|
21
|
+
});
|
|
22
|
+
test('a session with no principals is refused', async () => {
|
|
23
|
+
assert.equal(await check({ scopes: [] }), false);
|
|
24
|
+
});
|
|
25
|
+
//# sourceMappingURL=is-thread-owner.permission.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"is-thread-owner.permission.test.js","sourceRoot":"","sources":["../../../src/functions/is-thread-owner.permission.test.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAA;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAEhC,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAA;AAE/D,MAAM,QAAQ,GAAG;IACf,eAAe,EAAE;QACf,SAAS,EAAE,KAAK,EAAE,QAAgB,EAAE,EAAE,CACpC,QAAQ,KAAK,UAAU,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI;KACrE;CACO,CAAA;AAEV,MAAM,KAAK,GAAG,CAAC,OAAgB,EAAE,QAAQ,GAAG,UAAU,EAAE,EAAE,CACxD,aAAa,CAAC,QAAQ,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,OAAO,EAAW,CAAC,CAAA;AAE7D,IAAI,CAAC,+BAA+B,EAAE,KAAK,IAAI,EAAE;IAC/C,MAAM,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,CAAA;AAClE,CAAC,CAAC,CAAA;AAEF,IAAI,CAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE;IAClD,MAAM,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,CAAC,CAAA;AACnE,CAAC,CAAC,CAAA;AAEF,IAAI,CAAC,6BAA6B,EAAE,KAAK,IAAI,EAAE;IAC7C,MAAM,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAA;AACxE,CAAC,CAAC,CAAA;AAEF,IAAI,CAAC,8DAA8D,EAAE,KAAK,IAAI,EAAE;IAC9E,MAAM,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,KAAK,CAAC,CAAA;AAC3E,CAAC,CAAC,CAAA;AAEF,IAAI,CAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;IACzD,MAAM,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,CAAC,CAAA;AAClD,CAAC,CAAC,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render-email-preview.function.d.ts","sourceRoot":"","sources":["../../../src/functions/render-email-preview.function.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"render-email-preview.function.d.ts","sourceRoot":"","sources":["../../../src/functions/render-email-preview.function.ts"],"names":[],"mappings":"AAQA,KAAK,cAAc,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS,CAAA;AAClE,KAAK,kBAAkB,GACrB,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,CAAA;AAE3D,MAAM,WAAW,uBAAuB;IACtC,YAAY,EAAE,MAAM,CAAA;IACpB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAA;CAC1C;AAED,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,6FAA6F;IAC7F,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,MAAM,EAAE,CAAA;IACnB,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,EAAE,CAAA;CAClB;AAED,eAAO,MAAM,kBAAkB,8eA4F7B,CAAA"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { pikkuFunc } from '#pikku/addon/function';
|
|
2
2
|
import { NotFoundError } from '#pikku/addon/error';
|
|
3
|
-
import { getNestedValue, renderTemplate,
|
|
3
|
+
import { getNestedValue, renderTemplate, } from './render-email-template.utils.js';
|
|
4
4
|
export const renderEmailPreview = pikkuFunc({
|
|
5
5
|
title: 'Render Email Preview',
|
|
6
6
|
description: 'Renders an email template preview from emailTemplatesDir using a locale and variable payload.',
|
|
@@ -24,34 +24,23 @@ export const renderEmailPreview = pikkuFunc({
|
|
|
24
24
|
t: assets.strings,
|
|
25
25
|
appName,
|
|
26
26
|
};
|
|
27
|
-
const subject = renderTemplate(assets.subject, baseContext).trim();
|
|
28
|
-
const
|
|
29
|
-
let htmlBody = renderTemplate(htmlWithPartials, {
|
|
27
|
+
const subject = renderTemplate(assets.subject, baseContext, assets.partials, false).trim();
|
|
28
|
+
const htmlBody = renderTemplate(assets.html, {
|
|
30
29
|
...baseContext,
|
|
31
30
|
subject,
|
|
32
|
-
});
|
|
33
|
-
const partialMatches = [...htmlBody.matchAll(/@@PARTIAL:([^@]+)@@/g)];
|
|
34
|
-
for (const match of partialMatches) {
|
|
35
|
-
if (!match[1])
|
|
36
|
-
continue;
|
|
37
|
-
const rendered = renderPartial(match[1], assets.partials, {
|
|
38
|
-
...baseContext,
|
|
39
|
-
subject,
|
|
40
|
-
});
|
|
41
|
-
htmlBody = htmlBody.replace(match[0], rendered);
|
|
42
|
-
}
|
|
31
|
+
}, assets.partials, true);
|
|
43
32
|
const html = assets.layout
|
|
44
33
|
? renderTemplate(assets.layout, {
|
|
45
34
|
...baseContext,
|
|
46
35
|
subject,
|
|
47
36
|
content: htmlBody,
|
|
48
|
-
})
|
|
37
|
+
}, assets.partials, true)
|
|
49
38
|
: htmlBody;
|
|
50
39
|
const text = assets.text
|
|
51
40
|
? renderTemplate(assets.text, {
|
|
52
41
|
...baseContext,
|
|
53
42
|
subject,
|
|
54
|
-
}).trim()
|
|
43
|
+
}, assets.partials, false).trim()
|
|
55
44
|
: undefined;
|
|
56
45
|
return {
|
|
57
46
|
name: input.templateName,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render-email-preview.function.js","sourceRoot":"","sources":["../../../src/functions/render-email-preview.function.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAElD,OAAO,EACL,cAAc,EACd,cAAc,
|
|
1
|
+
{"version":3,"file":"render-email-preview.function.js","sourceRoot":"","sources":["../../../src/functions/render-email-preview.function.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,10 @@
|
|
|
1
|
+
export declare function escapeHtml(value: string): string;
|
|
1
2
|
export declare function getNestedValue(source: Record<string, unknown>, path: string): string;
|
|
2
|
-
export declare function
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
export declare function expandPartials(source: string, partials: Record<string, string>, depth?: number): string;
|
|
4
|
+
/**
|
|
5
|
+
* A single substitution pass — the replacement text is never rescanned, so a
|
|
6
|
+
* caller-supplied value can never be reinterpreted as a template.
|
|
7
|
+
*/
|
|
8
|
+
export declare function substitute(source: string, context: Record<string, unknown>, escape: boolean): string;
|
|
9
|
+
export declare function renderTemplate(source: string, context: Record<string, unknown>, partials: Record<string, string>, escape: boolean): string;
|
|
5
10
|
//# sourceMappingURL=render-email-template.utils.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render-email-template.utils.d.ts","sourceRoot":"","sources":["../../../src/functions/render-email-template.utils.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"render-email-template.utils.d.ts","sourceRoot":"","sources":["../../../src/functions/render-email-template.utils.ts"],"names":[],"mappings":"AAyBA,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEhD;AAED,wBAAgB,cAAc,CAC5B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,IAAI,EAAE,MAAM,GACX,MAAM,CAYR;AAWD,wBAAgB,cAAc,CAC5B,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAChC,KAAK,SAAI,GACR,MAAM,CASR;AA0BD;;;GAGG;AACH,wBAAgB,UAAU,CACxB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,MAAM,EAAE,OAAO,GACd,MAAM,CAYR;AAED,wBAAgB,cAAc,CAC5B,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAChC,MAAM,EAAE,OAAO,GACd,MAAM,CAOR"}
|