cvx-kit 0.1.8 → 0.1.10
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 +15 -0
- package/README.md +28 -28
- package/dist/agent-tools.d.mts +5 -5
- package/dist/agent-tools.mjs.map +1 -1
- package/dist/auth.d.mts +39 -289
- package/dist/auth.mjs.map +1 -1
- package/dist/components/approvals/_generated/api.d.mts +3 -4
- package/dist/components/approvals/_generated/api.mjs.map +1 -1
- package/dist/components/approvals/_generated/component.d.mts +1 -2
- package/dist/components/approvals/_generated/dataModel.d.mts +4 -5
- package/dist/components/approvals/_generated/server.d.mts +12 -13
- package/dist/components/approvals/_generated/server.mjs.map +1 -1
- package/dist/components/approvals/audit.d.mts +8 -8
- package/dist/components/approvals/audit.mjs +1 -1
- package/dist/components/approvals/audit.mjs.map +1 -1
- package/dist/components/approvals/client.d.mts +10 -10
- package/dist/components/approvals/client.mjs.map +1 -1
- package/dist/components/approvals/constants.d.mts +30 -30
- package/dist/components/approvals/constants.mjs.map +1 -1
- package/dist/components/approvals/convex.config.mjs.map +1 -1
- package/dist/components/approvals/decisions.d.mts +6 -6
- package/dist/components/approvals/decisions.mjs.map +1 -1
- package/dist/components/approvals/functions.d.mts +3 -3
- package/dist/components/approvals/functions.mjs.map +1 -1
- package/dist/components/approvals/health.d.mts +2 -2
- package/dist/components/approvals/health.mjs.map +1 -1
- package/dist/components/approvals/requests.d.mts +8 -8
- package/dist/components/approvals/requests.mjs.map +1 -1
- package/dist/components/approvals/validators.d.mts +29 -29
- package/dist/components/approvals/validators.mjs +1 -1
- package/dist/components/approvals/validators.mjs.map +1 -1
- package/dist/components/approvals/workflow.d.mts +3 -3
- package/dist/components/approvals/workflow.mjs.map +1 -1
- package/dist/components/approvals/workflow_steps.d.mts +15 -15
- package/dist/components/approvals/workflow_steps.mjs.map +1 -1
- package/dist/components/foundation/_generated/api.d.mts +3 -4
- package/dist/components/foundation/_generated/api.mjs.map +1 -1
- package/dist/components/foundation/_generated/component.d.mts +1 -2
- package/dist/components/foundation/_generated/dataModel.d.mts +4 -5
- package/dist/components/foundation/_generated/server.d.mts +12 -13
- package/dist/components/foundation/_generated/server.mjs.map +1 -1
- package/dist/components/foundation/client.d.mts +13 -13
- package/dist/components/foundation/client.mjs.map +1 -1
- package/dist/components/foundation/convex.config.mjs.map +1 -1
- package/dist/components/foundation/functions.d.mts +2 -2
- package/dist/components/foundation/functions.mjs.map +1 -1
- package/dist/components/foundation/modules/command/command.d.mts +14 -14
- package/dist/components/foundation/modules/command/command.mjs.map +1 -1
- package/dist/components/foundation/modules/command/lifecycle.d.mts +12 -13
- package/dist/components/foundation/modules/command/lifecycle.mjs.map +1 -1
- package/dist/components/foundation/modules/observability/observability.d.mts +4 -4
- package/dist/components/foundation/modules/observability/observability.mjs.map +1 -1
- package/dist/components/foundation/modules/query/query.d.mts +5 -5
- package/dist/components/foundation/modules/query/query.mjs.map +1 -1
- package/dist/components/foundation/operation.d.mts +5 -6
- package/dist/components/foundation/operation.mjs.map +1 -1
- package/dist/components/foundation/result.d.mts +6 -6
- package/dist/components/foundation/result.mjs.map +1 -1
- package/dist/components/foundation/telemetry.d.mts +2 -2
- package/dist/components/foundation/telemetry.mjs.map +1 -1
- package/dist/crud.d.mts +6 -5
- package/dist/crud.mjs.map +1 -1
- package/dist/errors.d.mts +4 -4
- package/dist/errors.mjs.map +1 -1
- package/dist/index.d.mts +2 -2
- package/dist/middleware.d.mts +2 -3
- package/dist/middleware.mjs.map +1 -1
- package/dist/modules/contracts/contract.d.mts +12 -13
- package/dist/modules/contracts/contract.mjs.map +1 -1
- package/dist/modules/contracts/convex.d.mts +3 -5
- package/dist/modules/contracts/convex.mjs.map +1 -1
- package/dist/modules/contracts/errors.d.mts +8 -9
- package/dist/modules/contracts/errors.mjs +1 -1
- package/dist/modules/contracts/errors.mjs.map +1 -1
- package/dist/modules/contracts/exposure.d.mts +13 -14
- package/dist/modules/contracts/exposure.mjs +1 -1
- package/dist/modules/contracts/exposure.mjs.map +1 -1
- package/dist/modules/contracts/idempotency.d.mts +15 -16
- package/dist/modules/contracts/idempotency.mjs +1 -1
- package/dist/modules/contracts/idempotency.mjs.map +1 -1
- package/dist/modules/contracts/standard.d.mts +2 -3
- package/dist/modules/contracts/standard.mjs.map +1 -1
- package/dist/modules/contracts/workflow.d.mts +26 -27
- package/dist/modules/contracts/workflow.mjs.map +1 -1
- package/dist/modules/effect/api-runtime.d.mts +10 -11
- package/dist/modules/effect/api-runtime.mjs.map +1 -1
- package/dist/modules/effect/api-zod.d.mts +2 -3
- package/dist/modules/effect/api-zod.mjs.map +1 -1
- package/dist/modules/effect/api.d.mts +4 -5
- package/dist/modules/effect/api.mjs.map +1 -1
- package/dist/modules/effect/command.d.mts +4 -5
- package/dist/modules/effect/command.mjs.map +1 -1
- package/dist/modules/effect/crud.d.mts +7 -8
- package/dist/modules/effect/crud.mjs.map +1 -1
- package/dist/modules/effect/errors.d.mts +1 -2
- package/dist/modules/effect/errors.mjs.map +1 -1
- package/dist/modules/effect/foundation.d.mts +3 -4
- package/dist/modules/effect/foundation.mjs.map +1 -1
- package/dist/modules/effect/idempotency.d.mts +2 -3
- package/dist/modules/effect/idempotency.mjs.map +1 -1
- package/dist/modules/effect/normalize.d.mts +2 -3
- package/dist/modules/effect/normalize.mjs.map +1 -1
- package/dist/modules/effect/operation.d.mts +17 -18
- package/dist/modules/effect/operation.mjs.map +1 -1
- package/dist/modules/effect/query.d.mts +3 -4
- package/dist/modules/effect/query.mjs.map +1 -1
- package/dist/modules/effect/schema.d.mts +8 -9
- package/dist/modules/effect/schema.mjs.map +1 -1
- package/dist/modules/effect/workflow.d.mts +5 -6
- package/dist/modules/effect/workflow.mjs.map +1 -1
- package/dist/oxlint/architecture.d.mts +6 -7
- package/dist/oxlint/architecture.mjs +1 -1
- package/dist/oxlint/architecture.mjs.map +1 -1
- package/dist/oxlint/ast.d.mts +22 -23
- package/dist/oxlint/ast.mjs +1 -1
- package/dist/oxlint/ast.mjs.map +1 -1
- package/dist/oxlint/ownership.d.mts +2 -3
- package/dist/oxlint/ownership.mjs +1 -1
- package/dist/oxlint/ownership.mjs.map +1 -1
- package/dist/oxlint.d.mts +4 -4
- package/dist/oxlint.mjs +1 -1
- package/dist/oxlint.mjs.map +1 -1
- package/dist/state-machine.d.mts +1 -2
- package/dist/state-machine.mjs.map +1 -1
- package/dist/tenancy.d.mts +6 -6
- package/dist/tenancy.mjs.map +1 -1
- package/dist/triggers.d.mts +6 -6
- package/dist/triggers.mjs.map +1 -1
- package/dist/webhooks.d.mts +5 -6
- package/dist/webhooks.mjs.map +1 -1
- package/dist/zod-table.d.mts +10 -10
- package/dist/zod-table.mjs.map +1 -1
- package/docs/oxlint.md +1 -1
- package/docs/upgrading.md +9 -1
- package/docs/zod-table.md +1 -1
- package/package.json +21 -15
- package/scripts/test-packed-auth.mjs +68 -0
- package/scripts/test-packed-effect.mjs +1 -1
- package/scripts/test-packed-ids.mjs +2 -2
- package/dist/node_modules/@standard-schema/spec/dist/index.d.mts +0 -79
|
@@ -1,37 +1,37 @@
|
|
|
1
1
|
declare namespace constants_d_exports {
|
|
2
2
|
export { APPROVAL_ACTOR_DECISION_INDEX, APPROVAL_AUDIT_RETENTION_CATEGORY, APPROVAL_CALLBACK_KINDS, APPROVAL_COMPONENT_SCHEMA_VERSION, APPROVAL_DECISIONS, APPROVAL_DECISION_HISTORY_INDEX, APPROVAL_DESCRIPTOR_SCHEMA_VERSION, APPROVAL_EXECUTION_STATES, APPROVAL_QUORUM_KINDS, APPROVAL_REQUIRED_DECISION_INDEXES, APPROVAL_RUN_STATES, APPROVAL_STEP_KINDS, ApprovalCallbackKind, ApprovalDecision, ApprovalExecutionState, ApprovalRunState, ApprovalStepKind, MAX_APPROVAL_AUDIT_CLEANUP_BATCH_SIZE, MAX_APPROVAL_AUDIT_RETENTION_DAYS, MAX_APPROVAL_CAPABILITIES, MAX_APPROVAL_DECISIONS_PER_STEP, MAX_APPROVAL_METADATA_ENTRIES, MAX_APPROVAL_METADATA_KEY_LENGTH, MAX_APPROVAL_METADATA_VALUE_LENGTH, MAX_APPROVAL_NAME_LENGTH, MAX_APPROVAL_REASON_LENGTH, MAX_APPROVAL_REFERENCE_LENGTH, MAX_APPROVAL_WORKFLOW_STEPS, MIN_APPROVAL_AUDIT_RETENTION_DAYS };
|
|
3
3
|
}
|
|
4
|
-
declare const APPROVAL_RUN_STATES: readonly ['pending', 'approved', 'rejected', 'expired', 'canceled'];
|
|
5
|
-
declare const APPROVAL_DECISIONS: readonly ['approved', 'rejected'];
|
|
6
|
-
declare const APPROVAL_EXECUTION_STATES: readonly ['inProgress', 'completed', 'canceled', 'failed'];
|
|
7
|
-
declare const APPROVAL_STEP_KINDS: readonly ['mutation', 'action', 'notify', 'decision', 'branch'];
|
|
8
|
-
declare const APPROVAL_QUORUM_KINDS: readonly ['count'];
|
|
9
|
-
declare const APPROVAL_CALLBACK_KINDS: readonly ['mutation', 'action'];
|
|
10
|
-
declare const APPROVAL_DESCRIPTOR_SCHEMA_VERSION: 1;
|
|
4
|
+
export declare const APPROVAL_RUN_STATES: readonly ['pending', 'approved', 'rejected', 'expired', 'canceled'];
|
|
5
|
+
export declare const APPROVAL_DECISIONS: readonly ['approved', 'rejected'];
|
|
6
|
+
export declare const APPROVAL_EXECUTION_STATES: readonly ['inProgress', 'completed', 'canceled', 'failed'];
|
|
7
|
+
export declare const APPROVAL_STEP_KINDS: readonly ['mutation', 'action', 'notify', 'decision', 'branch'];
|
|
8
|
+
export declare const APPROVAL_QUORUM_KINDS: readonly ['count'];
|
|
9
|
+
export declare const APPROVAL_CALLBACK_KINDS: readonly ['mutation', 'action'];
|
|
10
|
+
export declare const APPROVAL_DESCRIPTOR_SCHEMA_VERSION: 1;
|
|
11
11
|
/** Version of the component-owned tables and indexes deployed by cvx-kit. */
|
|
12
|
-
declare const APPROVAL_COMPONENT_SCHEMA_VERSION: 1;
|
|
12
|
+
export declare const APPROVAL_COMPONENT_SCHEMA_VERSION: 1;
|
|
13
13
|
/** Indexes required by approval evidence reads and decision writes. */
|
|
14
|
-
declare const APPROVAL_DECISION_HISTORY_INDEX: 'by_runId_and_decidedAt';
|
|
15
|
-
declare const APPROVAL_ACTOR_DECISION_INDEX: 'by_runId_and_stepKey_and_actor_actorRef';
|
|
16
|
-
declare const APPROVAL_REQUIRED_DECISION_INDEXES: readonly ["by_runId_and_decidedAt", "by_runId_and_stepKey_and_actor_actorRef"];
|
|
17
|
-
declare const APPROVAL_AUDIT_RETENTION_CATEGORY = "approval-protocol";
|
|
18
|
-
declare const MIN_APPROVAL_AUDIT_RETENTION_DAYS = 1;
|
|
19
|
-
declare const MAX_APPROVAL_AUDIT_RETENTION_DAYS = 3650;
|
|
20
|
-
declare const MAX_APPROVAL_AUDIT_CLEANUP_BATCH_SIZE = 100;
|
|
21
|
-
declare const MAX_APPROVAL_REFERENCE_LENGTH = 256;
|
|
22
|
-
declare const MAX_APPROVAL_NAME_LENGTH = 96;
|
|
23
|
-
declare const MAX_APPROVAL_REASON_LENGTH = 500;
|
|
24
|
-
declare const MAX_APPROVAL_CAPABILITIES = 32;
|
|
25
|
-
declare const MAX_APPROVAL_METADATA_ENTRIES = 32;
|
|
26
|
-
declare const MAX_APPROVAL_METADATA_KEY_LENGTH = 64;
|
|
27
|
-
declare const MAX_APPROVAL_METADATA_VALUE_LENGTH = 512;
|
|
28
|
-
declare const MAX_APPROVAL_WORKFLOW_STEPS = 32;
|
|
29
|
-
declare const MAX_APPROVAL_DECISIONS_PER_STEP = 8;
|
|
30
|
-
type ApprovalRunState = (typeof APPROVAL_RUN_STATES)[number];
|
|
31
|
-
type ApprovalDecision = (typeof APPROVAL_DECISIONS)[number];
|
|
32
|
-
type ApprovalExecutionState = (typeof APPROVAL_EXECUTION_STATES)[number];
|
|
33
|
-
type ApprovalStepKind = (typeof APPROVAL_STEP_KINDS)[number];
|
|
34
|
-
type ApprovalCallbackKind = (typeof APPROVAL_CALLBACK_KINDS)[number];
|
|
14
|
+
export declare const APPROVAL_DECISION_HISTORY_INDEX: 'by_runId_and_decidedAt';
|
|
15
|
+
export declare const APPROVAL_ACTOR_DECISION_INDEX: 'by_runId_and_stepKey_and_actor_actorRef';
|
|
16
|
+
export declare const APPROVAL_REQUIRED_DECISION_INDEXES: readonly ["by_runId_and_decidedAt", "by_runId_and_stepKey_and_actor_actorRef"];
|
|
17
|
+
export declare const APPROVAL_AUDIT_RETENTION_CATEGORY = "approval-protocol";
|
|
18
|
+
export declare const MIN_APPROVAL_AUDIT_RETENTION_DAYS = 1;
|
|
19
|
+
export declare const MAX_APPROVAL_AUDIT_RETENTION_DAYS = 3650;
|
|
20
|
+
export declare const MAX_APPROVAL_AUDIT_CLEANUP_BATCH_SIZE = 100;
|
|
21
|
+
export declare const MAX_APPROVAL_REFERENCE_LENGTH = 256;
|
|
22
|
+
export declare const MAX_APPROVAL_NAME_LENGTH = 96;
|
|
23
|
+
export declare const MAX_APPROVAL_REASON_LENGTH = 500;
|
|
24
|
+
export declare const MAX_APPROVAL_CAPABILITIES = 32;
|
|
25
|
+
export declare const MAX_APPROVAL_METADATA_ENTRIES = 32;
|
|
26
|
+
export declare const MAX_APPROVAL_METADATA_KEY_LENGTH = 64;
|
|
27
|
+
export declare const MAX_APPROVAL_METADATA_VALUE_LENGTH = 512;
|
|
28
|
+
export declare const MAX_APPROVAL_WORKFLOW_STEPS = 32;
|
|
29
|
+
export declare const MAX_APPROVAL_DECISIONS_PER_STEP = 8;
|
|
30
|
+
export type ApprovalRunState = (typeof APPROVAL_RUN_STATES)[number];
|
|
31
|
+
export type ApprovalDecision = (typeof APPROVAL_DECISIONS)[number];
|
|
32
|
+
export type ApprovalExecutionState = (typeof APPROVAL_EXECUTION_STATES)[number];
|
|
33
|
+
export type ApprovalStepKind = (typeof APPROVAL_STEP_KINDS)[number];
|
|
34
|
+
export type ApprovalCallbackKind = (typeof APPROVAL_CALLBACK_KINDS)[number];
|
|
35
35
|
//#endregion
|
|
36
|
-
export {
|
|
36
|
+
export { constants_d_exports };
|
|
37
37
|
//# sourceMappingURL=constants.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.mjs","names":[],"sources":["../../../src/components/approvals/constants.ts"],"sourcesContent":["export const APPROVAL_RUN_STATES = [\n\t'pending',\n\t'approved',\n\t'rejected',\n\t'expired',\n\t'canceled',\n] as const\n\nexport const APPROVAL_DECISIONS = ['approved', 'rejected'] as const\n\nexport const APPROVAL_EXECUTION_STATES = ['inProgress', 'completed', 'canceled', 'failed'] as const\n\nexport const APPROVAL_STEP_KINDS = ['mutation', 'action', 'notify', 'decision', 'branch'] as const\n\nexport const APPROVAL_QUORUM_KINDS = ['count'] as const\n\nexport const APPROVAL_CALLBACK_KINDS = ['mutation', 'action'] as const\n\nexport const APPROVAL_DESCRIPTOR_SCHEMA_VERSION = 1 as const\n\n/** Version of the component-owned tables and indexes deployed by cvx-kit. */\nexport const APPROVAL_COMPONENT_SCHEMA_VERSION = 1 as const\n\n/** Indexes required by approval evidence reads and decision writes. */\nexport const APPROVAL_DECISION_HISTORY_INDEX = 'by_runId_and_decidedAt' as const\nexport const APPROVAL_ACTOR_DECISION_INDEX = 'by_runId_and_stepKey_and_actor_actorRef' as const\nexport const APPROVAL_REQUIRED_DECISION_INDEXES = [\n\tAPPROVAL_DECISION_HISTORY_INDEX,\n\tAPPROVAL_ACTOR_DECISION_INDEX,\n] as const\n\nexport const APPROVAL_AUDIT_RETENTION_CATEGORY = 'approval-protocol'\nexport const MIN_APPROVAL_AUDIT_RETENTION_DAYS = 1\nexport const MAX_APPROVAL_AUDIT_RETENTION_DAYS = 3_650\nexport const MAX_APPROVAL_AUDIT_CLEANUP_BATCH_SIZE = 100\n\nexport const MAX_APPROVAL_REFERENCE_LENGTH = 256\nexport const MAX_APPROVAL_NAME_LENGTH = 96\nexport const MAX_APPROVAL_REASON_LENGTH = 500\nexport const MAX_APPROVAL_CAPABILITIES = 32\nexport const MAX_APPROVAL_METADATA_ENTRIES = 32\nexport const MAX_APPROVAL_METADATA_KEY_LENGTH = 64\nexport const MAX_APPROVAL_METADATA_VALUE_LENGTH = 512\nexport const MAX_APPROVAL_WORKFLOW_STEPS = 32\nexport const MAX_APPROVAL_DECISIONS_PER_STEP = 8\n\nexport type ApprovalRunState = (typeof APPROVAL_RUN_STATES)[number]\nexport type ApprovalDecision = (typeof APPROVAL_DECISIONS)[number]\nexport type ApprovalExecutionState = (typeof APPROVAL_EXECUTION_STATES)[number]\nexport type ApprovalStepKind = (typeof APPROVAL_STEP_KINDS)[number]\nexport type ApprovalCallbackKind = (typeof APPROVAL_CALLBACK_KINDS)[number]\n"],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"constants.mjs","names":["APPROVAL_RUN_STATES","APPROVAL_DECISIONS","APPROVAL_EXECUTION_STATES","APPROVAL_STEP_KINDS","APPROVAL_QUORUM_KINDS","APPROVAL_CALLBACK_KINDS","APPROVAL_DESCRIPTOR_SCHEMA_VERSION","APPROVAL_COMPONENT_SCHEMA_VERSION","APPROVAL_DECISION_HISTORY_INDEX","APPROVAL_ACTOR_DECISION_INDEX","APPROVAL_REQUIRED_DECISION_INDEXES","APPROVAL_AUDIT_RETENTION_CATEGORY","MIN_APPROVAL_AUDIT_RETENTION_DAYS","MAX_APPROVAL_AUDIT_RETENTION_DAYS","MAX_APPROVAL_AUDIT_CLEANUP_BATCH_SIZE","MAX_APPROVAL_REFERENCE_LENGTH","MAX_APPROVAL_NAME_LENGTH","MAX_APPROVAL_REASON_LENGTH","MAX_APPROVAL_CAPABILITIES","MAX_APPROVAL_METADATA_ENTRIES","MAX_APPROVAL_METADATA_KEY_LENGTH","MAX_APPROVAL_METADATA_VALUE_LENGTH","MAX_APPROVAL_WORKFLOW_STEPS","MAX_APPROVAL_DECISIONS_PER_STEP"],"sources":["../../../src/components/approvals/constants.ts"],"sourcesContent":["export const APPROVAL_RUN_STATES = [\n\t'pending',\n\t'approved',\n\t'rejected',\n\t'expired',\n\t'canceled',\n] as const\n\nexport const APPROVAL_DECISIONS = ['approved', 'rejected'] as const\n\nexport const APPROVAL_EXECUTION_STATES = ['inProgress', 'completed', 'canceled', 'failed'] as const\n\nexport const APPROVAL_STEP_KINDS = ['mutation', 'action', 'notify', 'decision', 'branch'] as const\n\nexport const APPROVAL_QUORUM_KINDS = ['count'] as const\n\nexport const APPROVAL_CALLBACK_KINDS = ['mutation', 'action'] as const\n\nexport const APPROVAL_DESCRIPTOR_SCHEMA_VERSION = 1 as const\n\n/** Version of the component-owned tables and indexes deployed by cvx-kit. */\nexport const APPROVAL_COMPONENT_SCHEMA_VERSION = 1 as const\n\n/** Indexes required by approval evidence reads and decision writes. */\nexport const APPROVAL_DECISION_HISTORY_INDEX = 'by_runId_and_decidedAt' as const\nexport const APPROVAL_ACTOR_DECISION_INDEX = 'by_runId_and_stepKey_and_actor_actorRef' as const\nexport const APPROVAL_REQUIRED_DECISION_INDEXES = [\n\tAPPROVAL_DECISION_HISTORY_INDEX,\n\tAPPROVAL_ACTOR_DECISION_INDEX,\n] as const\n\nexport const APPROVAL_AUDIT_RETENTION_CATEGORY = 'approval-protocol'\nexport const MIN_APPROVAL_AUDIT_RETENTION_DAYS = 1\nexport const MAX_APPROVAL_AUDIT_RETENTION_DAYS = 3_650\nexport const MAX_APPROVAL_AUDIT_CLEANUP_BATCH_SIZE = 100\n\nexport const MAX_APPROVAL_REFERENCE_LENGTH = 256\nexport const MAX_APPROVAL_NAME_LENGTH = 96\nexport const MAX_APPROVAL_REASON_LENGTH = 500\nexport const MAX_APPROVAL_CAPABILITIES = 32\nexport const MAX_APPROVAL_METADATA_ENTRIES = 32\nexport const MAX_APPROVAL_METADATA_KEY_LENGTH = 64\nexport const MAX_APPROVAL_METADATA_VALUE_LENGTH = 512\nexport const MAX_APPROVAL_WORKFLOW_STEPS = 32\nexport const MAX_APPROVAL_DECISIONS_PER_STEP = 8\n\nexport type ApprovalRunState = (typeof APPROVAL_RUN_STATES)[number]\nexport type ApprovalDecision = (typeof APPROVAL_DECISIONS)[number]\nexport type ApprovalExecutionState = (typeof APPROVAL_EXECUTION_STATES)[number]\nexport type ApprovalStepKind = (typeof APPROVAL_STEP_KINDS)[number]\nexport type ApprovalCallbackKind = (typeof APPROVAL_CALLBACK_KINDS)[number]\n"],"mappings":"AAAA,MAAaA,EAAsB,CAClC,UACA,WACA,WACA,UACA,UACD,EAEaC,EAAqB,CAAC,WAAY,UAAU,EAE5CC,EAA4B,CAAC,aAAc,YAAa,WAAY,QAAQ,EAE5EC,EAAsB,CAAC,WAAY,SAAU,SAAU,WAAY,QAAQ,EAE3EC,EAAwB,CAAC,OAAO,EAEhCC,EAA0B,CAAC,WAAY,QAAQ,EAE/CC,EAAqC,EAGrCC,EAAoC,EAGpCC,EAAkC,yBAClCC,EAAgC,0CAChCC,EAAqC,CACjDF,EACAC,CACD,EAEaE,EAAoC,oBACpCC,EAAoC,EACpCC,EAAoC,KACpCC,EAAwC,IAExCC,EAAgC,IAChCC,EAA2B,GAC3BC,EAA6B,IAC7BC,EAA4B,GAC5BC,EAAgC,GAChCC,EAAmC,GACnCC,EAAqC,IACrCC,EAA8B,GAC9BC,EAAkC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"convex.config.mjs","names":[],"sources":["../../../src/components/approvals/convex.config.ts"],"sourcesContent":["import workflow from '@convex-dev/workflow/convex.config'\nimport auditLog from 'convex-audit-log/convex.config.js'\nimport { defineComponent } from 'convex/server'\n\nconst approvals = defineComponent('approvals')\n\napprovals.use(workflow, { name: 'workflow' })\napprovals.use(auditLog, { name: 'auditLog' })\n\nexport default approvals\n"],"mappings":"mJAIA,
|
|
1
|
+
{"version":3,"file":"convex.config.mjs","names":["workflow","auditLog","approvals","defineComponent"],"sources":["../../../src/components/approvals/convex.config.ts"],"sourcesContent":["import workflow from '@convex-dev/workflow/convex.config'\nimport auditLog from 'convex-audit-log/convex.config.js'\nimport { defineComponent } from 'convex/server'\n\nconst approvals = defineComponent('approvals')\n\napprovals.use(workflow, { name: 'workflow' })\napprovals.use(auditLog, { name: 'auditLog' })\n\nexport default approvals\n"],"mappings":"mJAIA,MAAME,EAAYC,EAAgB,WAAW,EAE7CD,EAAU,IAAIF,EAAU,CAAE,KAAM,UAAW,CAAC,EAC5CE,EAAU,IAAID,EAAU,CAAE,KAAM,UAAW,CAAC"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
declare namespace decisions_d_exports {
|
|
2
2
|
export { decide, enter, expire, list, listForWorkflow };
|
|
3
3
|
}
|
|
4
|
-
declare const decide: import("convex/server").RegisteredMutation<"public", {
|
|
4
|
+
export declare const decide: import("convex/server").RegisteredMutation<"public", {
|
|
5
5
|
actor: {
|
|
6
6
|
actorRef: string;
|
|
7
7
|
capabilities: string[];
|
|
@@ -16,7 +16,7 @@ declare const decide: import("convex/server").RegisteredMutation<"public", {
|
|
|
16
16
|
}, Promise<{
|
|
17
17
|
state: "approved" | "canceled" | "expired" | "pending" | "rejected";
|
|
18
18
|
}>>;
|
|
19
|
-
declare const list: import("convex/server").RegisteredQuery<"public", {
|
|
19
|
+
export declare const list: import("convex/server").RegisteredQuery<"public", {
|
|
20
20
|
runId: import("convex/values").GenericId<"approvalRuns">;
|
|
21
21
|
}, Promise<{
|
|
22
22
|
stepKey: string;
|
|
@@ -25,7 +25,7 @@ declare const list: import("convex/server").RegisteredQuery<"public", {
|
|
|
25
25
|
reason: string | undefined;
|
|
26
26
|
decidedAt: number;
|
|
27
27
|
}[]>>;
|
|
28
|
-
declare const listForWorkflow: import("convex/server").RegisteredQuery<"internal", {
|
|
28
|
+
export declare const listForWorkflow: import("convex/server").RegisteredQuery<"internal", {
|
|
29
29
|
runId: import("convex/values").GenericId<"approvalRuns">;
|
|
30
30
|
stepKey: string;
|
|
31
31
|
}, Promise<{
|
|
@@ -35,7 +35,7 @@ declare const listForWorkflow: import("convex/server").RegisteredQuery<"internal
|
|
|
35
35
|
reason: string | undefined;
|
|
36
36
|
decidedAt: number;
|
|
37
37
|
}[]>>;
|
|
38
|
-
declare const enter: import("convex/server").RegisteredMutation<"internal", {
|
|
38
|
+
export declare const enter: import("convex/server").RegisteredMutation<"internal", {
|
|
39
39
|
expiresAfterMs?: number | undefined;
|
|
40
40
|
runId: import("convex/values").GenericId<"approvalRuns">;
|
|
41
41
|
stepKey: string;
|
|
@@ -47,7 +47,7 @@ declare const enter: import("convex/server").RegisteredMutation<"internal", {
|
|
|
47
47
|
state: 'pending';
|
|
48
48
|
expiresAt: number | undefined;
|
|
49
49
|
}>>;
|
|
50
|
-
declare const expire: import("convex/server").RegisteredMutation<"internal", {
|
|
50
|
+
export declare const expire: import("convex/server").RegisteredMutation<"internal", {
|
|
51
51
|
runId: import("convex/values").GenericId<"approvalRuns">;
|
|
52
52
|
stepKey: string;
|
|
53
53
|
}, Promise<{
|
|
@@ -56,5 +56,5 @@ declare const expire: import("convex/server").RegisteredMutation<"internal", {
|
|
|
56
56
|
state: "approved" | "canceled" | "expired" | "pending" | "rejected";
|
|
57
57
|
}>>;
|
|
58
58
|
//#endregion
|
|
59
|
-
export {
|
|
59
|
+
export { decisions_d_exports };
|
|
60
60
|
//# sourceMappingURL=decisions.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"decisions.mjs","names":[],"sources":["../../../src/components/approvals/decisions.ts"],"sourcesContent":["import { WorkflowManager, type WorkflowId } from '@convex-dev/workflow'\nimport { zodToConvex } from 'convex-helpers/server/zod4'\nimport { v } from 'convex/values'\n\nimport { components, internal } from './_generated/api'\nimport {\n\tinternalMutation,\n\tinternalQuery,\n\tmutation,\n\tquery,\n\ttype QueryCtx,\n} from './_generated/server'\nimport { logApprovalTransition } from './audit'\nimport {\n\tAPPROVAL_ACTOR_DECISION_INDEX,\n\tAPPROVAL_DECISION_HISTORY_INDEX,\n\tAPPROVAL_DECISIONS,\n\tAPPROVAL_RUN_STATES,\n} from './constants'\nimport { canTransitionApprovalRun, classifyPendingRunAt } from './functions'\nimport { approvalActor, approvalDecision, approvalReason } from './validators'\nimport { approvalDecisionEventName, evaluateDecisionOutcome } from './workflow_steps'\n\nexport const decide = mutation({\n\targs: {\n\t\trunId: v.id('approvalRuns'),\n\t\tdecision: zodToConvex(approvalDecision),\n\t\treason: v.optional(zodToConvex(approvalReason)),\n\t\tactor: zodToConvex(approvalActor),\n\t\tcompatibilityKey: v.string(),\n\t},\n\treturns: v.object({\n\t\tstate: v.union(\n\t\t\tv.literal(APPROVAL_RUN_STATES[0]),\n\t\t\tv.literal(APPROVAL_RUN_STATES[1]),\n\t\t\tv.literal(APPROVAL_RUN_STATES[2]),\n\t\t\tv.literal(APPROVAL_RUN_STATES[3]),\n\t\t\tv.literal(APPROVAL_RUN_STATES[4]),\n\t\t),\n\t}),\n\thandler: async (ctx, input) => {\n\t\tconst run = await ctx.db.get(input.runId)\n\t\tif (!run) throw new Error('Approval request not found')\n\t\tassertCompatible(run.workflow.compatibilityKey, input.compatibilityKey)\n\t\tconst step = run.workflow.steps.find(\n\t\t\t(candidate) => candidate.kind === 'decision' && candidate.key === run.currentStepKey,\n\t\t)\n\t\tif (!step || step.kind !== 'decision')\n\t\t\tthrow new Error('Approval request is not waiting for a decision')\n\n\t\tconst prior = await ctx.db\n\t\t\t.query('approvalDecisions')\n\t\t\t.withIndex(APPROVAL_ACTOR_DECISION_INDEX, (query) =>\n\t\t\t\tquery\n\t\t\t\t\t.eq('runId', run._id)\n\t\t\t\t\t.eq('stepKey', step.key)\n\t\t\t\t\t.eq('actor.actorRef', input.actor.actorRef),\n\t\t\t)\n\t\t\t.unique()\n\t\tif (prior) {\n\t\t\tif (prior.decision !== input.decision)\n\t\t\t\tthrow new Error('Actor already submitted a contradictory decision')\n\t\t\treturn {\n\t\t\t\tstate: run.state,\n\t\t\t}\n\t\t}\n\t\tif (run.state !== 'pending') throw new Error(`Approval request is already ${run.state}`)\n\t\tif (\n\t\t\trun.expiresAt !== undefined &&\n\t\t\tclassifyPendingRunAt(Date.now(), run.expiresAt) === 'expired'\n\t\t)\n\t\t\treturn claimExpiry(ctx, run, step.key)\n\t\tif (!step.decisions.includes(input.decision))\n\t\t\tthrow new Error('Decision is not allowed by this workflow step')\n\t\tif (step.makerChecker && input.actor.actorRef === run.requester.actorRef)\n\t\t\tthrow new Error('Requester cannot decide this approval step')\n\n\t\tconst decidedAt = Date.now()\n\t\tawait ctx.db.insert('approvalDecisions', {\n\t\t\trunId: run._id,\n\t\t\tstepKey: step.key,\n\t\t\tactor: input.actor,\n\t\t\tdecision: input.decision,\n\t\t\treason: input.reason,\n\t\t\tdecidedAt,\n\t\t})\n\t\tconst evidence = await ctx.db\n\t\t\t.query('approvalDecisions')\n\t\t\t.withIndex('by_runId_and_stepKey_and_decidedAt', (query) =>\n\t\t\t\tquery.eq('runId', run._id).eq('stepKey', step.key),\n\t\t\t)\n\t\t\t.collect()\n\t\tconst outcome = evaluateDecisionOutcome(\n\t\t\tevidence.map((item) => ({\n\t\t\t\tactorRef: item.actor.actorRef,\n\t\t\t\tdecision: item.decision,\n\t\t\t})),\n\t\t\tstep.quorum.approvals,\n\t\t)\n\t\tawait logApprovalTransition(ctx, {\n\t\t\taction: `approval.decision.${input.decision}`,\n\t\t\tactorRef: input.actor.actorRef,\n\t\t\trunId: run._id,\n\t\t\tresourceType: run.resourceType,\n\t\t\tresourceRef: run.resourceRef,\n\t\t\ttransition: `${step.key}:${input.actor.actorRef}:${input.decision}`,\n\t\t})\n\t\tif (!outcome) return { state: 'pending' as const }\n\t\tconst terminal = isTerminalDecision(run, step.key, outcome)\n\t\tawait finishDecision(ctx, run, step.key, outcome, terminal, {\n\t\t\tactorRef: input.actor.actorRef,\n\t\t\tdecision: input.decision,\n\t\t\treason: input.reason,\n\t\t\tdecidedAt,\n\t\t})\n\t\treturn terminal ? { state: outcome } : { state: 'pending' as const }\n\t},\n})\n\nexport const list = query({\n\targs: { runId: v.id('approvalRuns') },\n\treturns: v.array(\n\t\tv.object({\n\t\t\tstepKey: v.string(),\n\t\t\tactorRef: v.string(),\n\t\t\tdecision: zodToConvex(approvalDecision),\n\t\t\treason: v.optional(zodToConvex(approvalReason)),\n\t\t\tdecidedAt: v.number(),\n\t\t}),\n\t),\n\thandler: (ctx, input) => listDecisionEvidence(ctx, input.runId),\n})\n\nexport const listForWorkflow = internalQuery({\n\targs: { runId: v.id('approvalRuns'), stepKey: v.string() },\n\treturns: v.array(\n\t\tv.object({\n\t\t\tstepKey: v.string(),\n\t\t\tactorRef: v.string(),\n\t\t\tdecision: zodToConvex(approvalDecision),\n\t\t\treason: v.optional(zodToConvex(approvalReason)),\n\t\t\tdecidedAt: v.number(),\n\t\t}),\n\t),\n\thandler: (ctx, input) => listDecisionEvidenceForStep(ctx, input.runId, input.stepKey),\n})\n\nexport const enter = internalMutation({\n\targs: {\n\t\trunId: v.id('approvalRuns'),\n\t\tstepKey: v.string(),\n\t\tworkflowId: v.string(),\n\t\texpiresAfterMs: v.optional(v.number()),\n\t},\n\treturns: v.object({\n\t\tstate: v.union(\n\t\t\tv.literal(APPROVAL_RUN_STATES[0]),\n\t\t\tv.literal(APPROVAL_RUN_STATES[1]),\n\t\t\tv.literal(APPROVAL_RUN_STATES[2]),\n\t\t\tv.literal(APPROVAL_RUN_STATES[3]),\n\t\t\tv.literal(APPROVAL_RUN_STATES[4]),\n\t\t),\n\t\texpiresAt: v.optional(v.number()),\n\t}),\n\thandler: async (ctx, input) => {\n\t\tconst run = await ctx.db.get(input.runId)\n\t\tif (!run) throw new Error('Approval request not found')\n\t\tif (run.workflowId !== input.workflowId)\n\t\t\tthrow new Error('Approval workflow linkage is incomplete')\n\t\tif (run.state !== 'pending')\n\t\t\treturn {\n\t\t\t\tstate: run.state,\n\t\t\t\texpiresAt: run.expiresAt,\n\t\t\t}\n\t\tconst configuredExpiresAt = Number(run.metadata?.approvalExpiresAt)\n\t\tconst expiresAt = Number.isFinite(configuredExpiresAt)\n\t\t\t? configuredExpiresAt\n\t\t\t: input.expiresAfterMs === undefined\n\t\t\t\t? undefined\n\t\t\t\t: Date.now() + input.expiresAfterMs\n\t\tawait ctx.db.patch(run._id, {\n\t\t\tcurrentStepKey: input.stepKey,\n\t\t\texpiresAt,\n\t\t\tupdatedAt: Date.now(),\n\t\t})\n\t\tawait logApprovalTransition(ctx, {\n\t\t\taction: 'approval.waiting',\n\t\t\trunId: run._id,\n\t\t\tresourceType: run.resourceType,\n\t\t\tresourceRef: run.resourceRef,\n\t\t\ttransition: `${input.stepKey}:waiting`,\n\t\t})\n\t\tif (expiresAt !== undefined)\n\t\t\tawait ctx.scheduler.runAt(expiresAt, internal.decisions.expire, {\n\t\t\t\trunId: run._id,\n\t\t\t\tstepKey: input.stepKey,\n\t\t\t})\n\t\treturn {\n\t\t\tstate: 'pending' as const,\n\t\t\texpiresAt: expiresAt,\n\t\t}\n\t},\n})\n\nexport const expire = internalMutation({\n\targs: { runId: v.id('approvalRuns'), stepKey: v.string() },\n\treturns: v.object({\n\t\tstate: v.union(\n\t\t\tv.literal('missing'),\n\t\t\tv.literal(APPROVAL_RUN_STATES[0]),\n\t\t\tv.literal(APPROVAL_RUN_STATES[1]),\n\t\t\tv.literal(APPROVAL_RUN_STATES[2]),\n\t\t\tv.literal(APPROVAL_RUN_STATES[3]),\n\t\t\tv.literal(APPROVAL_RUN_STATES[4]),\n\t\t),\n\t}),\n\thandler: async (ctx, input) => {\n\t\tconst run = await ctx.db.get(input.runId)\n\t\tif (!run) return { state: 'missing' as const }\n\t\tif (\n\t\t\trun.state !== 'pending' ||\n\t\t\trun.currentStepKey !== input.stepKey ||\n\t\t\trun.expiresAt === undefined ||\n\t\t\tclassifyPendingRunAt(Date.now(), run.expiresAt) === 'pending'\n\t\t)\n\t\t\treturn { state: run.state }\n\t\treturn claimExpiry(ctx, run, input.stepKey)\n\t},\n})\n\nconst approvalWorkflow = new WorkflowManager(components.workflow)\n\nasync function claimExpiry(\n\tctx: import('./_generated/server').MutationCtx,\n\trun: import('./_generated/dataModel').Doc<'approvalRuns'>,\n\tstepKey: string,\n): Promise<{ state: 'expired' }> {\n\tif (!canTransitionApprovalRun(run.state, 'expired'))\n\t\tthrow new Error(`Approval request cannot transition from ${run.state}`)\n\tconst now = Date.now()\n\tawait ctx.db.patch(run._id, {\n\t\tstate: 'expired',\n\t\texpiresAt: undefined,\n\t\tupdatedAt: now,\n\t\tterminalAt: now,\n\t})\n\tawait logApprovalTransition(ctx, {\n\t\taction: 'approval.expired',\n\t\trunId: run._id,\n\t\tresourceType: run.resourceType,\n\t\tresourceRef: run.resourceRef,\n\t\ttransition: `${stepKey}:expired`,\n\t})\n\tif (!run.workflowId) throw new Error('Approval workflow is not linked')\n\tawait approvalWorkflow.sendEvent(ctx, {\n\t\t// SAFETY: workflowId was persisted from approvalWorkflow.start when this run was created.\n\t\tworkflowId: run.workflowId as WorkflowId,\n\t\tname: approvalDecisionEventName(run._id, stepKey),\n\t\tvalidator: v.object({ outcome: v.literal(APPROVAL_RUN_STATES[3]) }),\n\t\tvalue: { outcome: 'expired' },\n\t})\n\treturn { state: 'expired' }\n}\n\nasync function finishDecision(\n\tctx: import('./_generated/server').MutationCtx,\n\trun: import('./_generated/dataModel').Doc<'approvalRuns'>,\n\tstepKey: string,\n\toutcome: 'approved' | 'rejected',\n\tterminal: boolean,\n\tterminalEvidence: {\n\t\tactorRef: string\n\t\tdecision: 'approved' | 'rejected'\n\t\treason?: string\n\t\tdecidedAt: number\n\t},\n): Promise<void> {\n\tif (terminal) {\n\t\tif (!canTransitionApprovalRun(run.state, outcome))\n\t\t\tthrow new Error(`Approval request cannot transition from ${run.state}`)\n\t\tconst now = Date.now()\n\t\tawait ctx.db.patch(run._id, {\n\t\t\tstate: outcome,\n\t\t\texpiresAt: undefined,\n\t\t\tupdatedAt: now,\n\t\t\tterminalAt: now,\n\t\t})\n\t\tawait logApprovalTransition(ctx, {\n\t\t\taction: `approval.${outcome}`,\n\t\t\trunId: run._id,\n\t\t\tresourceType: run.resourceType,\n\t\t\tresourceRef: run.resourceRef,\n\t\t\ttransition: `${stepKey}:terminal:${outcome}`,\n\t\t})\n\t}\n\tif (!run.workflowId) throw new Error('Approval workflow is not linked')\n\tawait approvalWorkflow.sendEvent(ctx, {\n\t\t// SAFETY: workflowId was persisted from approvalWorkflow.start when this run was created.\n\t\tworkflowId: run.workflowId as WorkflowId,\n\t\tname: approvalDecisionEventName(run._id, stepKey),\n\t\tvalidator: v.object({\n\t\t\toutcome: v.union(v.literal(APPROVAL_DECISIONS[0]), v.literal(APPROVAL_DECISIONS[1])),\n\t\t\tterminalEvidence: v.object({\n\t\t\t\tactorRef: v.string(),\n\t\t\t\tdecision: zodToConvex(approvalDecision),\n\t\t\t\treason: v.optional(zodToConvex(approvalReason)),\n\t\t\t\tdecidedAt: v.number(),\n\t\t\t}),\n\t\t}),\n\t\tvalue: { outcome, terminalEvidence },\n\t})\n}\n\nfunction assertCompatible(actual: string, expected: string): void {\n\tif (actual !== expected)\n\t\tthrow new Error(\n\t\t\t`Approval workflow compatibility mismatch: expected ${expected}, received ${actual}`,\n\t\t)\n}\n\nasync function listDecisionEvidence(\n\tctx: QueryCtx,\n\trunId: import('./_generated/dataModel').Id<'approvalRuns'>,\n) {\n\tconst decisions = await ctx.db\n\t\t.query('approvalDecisions')\n\t\t.withIndex(APPROVAL_DECISION_HISTORY_INDEX, (query) => query.eq('runId', runId))\n\t\t.collect()\n\treturn decisions.map((decision) => ({\n\t\tstepKey: decision.stepKey,\n\t\tactorRef: decision.actor.actorRef,\n\t\tdecision: decision.decision,\n\t\treason: decision.reason,\n\t\tdecidedAt: decision.decidedAt,\n\t}))\n}\n\nasync function listDecisionEvidenceForStep(\n\tctx: QueryCtx,\n\trunId: import('./_generated/dataModel').Id<'approvalRuns'>,\n\tstepKey: string,\n) {\n\tconst decisions = await ctx.db\n\t\t.query('approvalDecisions')\n\t\t.withIndex('by_runId_and_stepKey_and_decidedAt', (query) =>\n\t\t\tquery.eq('runId', runId).eq('stepKey', stepKey),\n\t\t)\n\t\t.collect()\n\treturn decisions.map((decision) => ({\n\t\tstepKey: decision.stepKey,\n\t\tactorRef: decision.actor.actorRef,\n\t\tdecision: decision.decision,\n\t\treason: decision.reason,\n\t\tdecidedAt: decision.decidedAt,\n\t}))\n}\n\nfunction isTerminalDecision(\n\trun: import('./_generated/dataModel').Doc<'approvalRuns'>,\n\tstepKey: string,\n\toutcome: 'approved' | 'rejected',\n): boolean {\n\tif (outcome === 'rejected') return true\n\tconst currentIndex = run.workflow.steps.findIndex(\n\t\t(step) => step.kind === 'decision' && step.key === stepKey,\n\t)\n\treturn !run.workflow.steps.slice(currentIndex + 1).some((step) => step.kind === 'decision')\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"decisions.mjs","names":["decide","mutation","v","zodToConvex","approvalDecision","approvalReason","approvalActor","APPROVAL_RUN_STATES","run","ctx","input","assertCompatible","step","candidate","prior","APPROVAL_ACTOR_DECISION_INDEX","query","classifyPendingRunAt","claimExpiry","decidedAt","evidence","outcome","evaluateDecisionOutcome","item","logApprovalTransition","terminal","isTerminalDecision","finishDecision","list","listDecisionEvidence","listForWorkflow","internalQuery","listDecisionEvidenceForStep","enter","internalMutation","configuredExpiresAt","expiresAt","internal","expire","approvalWorkflow","WorkflowManager","components","canTransitionApprovalRun","now","stepKey","approvalDecisionEventName","APPROVAL_DECISIONS","actual","expected","APPROVAL_DECISION_HISTORY_INDEX","runId","decision","currentIndex"],"sources":["../../../src/components/approvals/decisions.ts"],"sourcesContent":["import { WorkflowManager, type WorkflowId } from '@convex-dev/workflow'\nimport { zodToConvex } from 'convex-helpers/server/zod4'\nimport { v } from 'convex/values'\n\nimport { components, internal } from './_generated/api'\nimport {\n\tinternalMutation,\n\tinternalQuery,\n\tmutation,\n\tquery,\n\ttype QueryCtx,\n} from './_generated/server'\nimport { logApprovalTransition } from './audit'\nimport {\n\tAPPROVAL_ACTOR_DECISION_INDEX,\n\tAPPROVAL_DECISION_HISTORY_INDEX,\n\tAPPROVAL_DECISIONS,\n\tAPPROVAL_RUN_STATES,\n} from './constants'\nimport { canTransitionApprovalRun, classifyPendingRunAt } from './functions'\nimport { approvalActor, approvalDecision, approvalReason } from './validators'\nimport { approvalDecisionEventName, evaluateDecisionOutcome } from './workflow_steps'\n\nexport const decide = mutation({\n\targs: {\n\t\trunId: v.id('approvalRuns'),\n\t\tdecision: zodToConvex(approvalDecision),\n\t\treason: v.optional(zodToConvex(approvalReason)),\n\t\tactor: zodToConvex(approvalActor),\n\t\tcompatibilityKey: v.string(),\n\t},\n\treturns: v.object({\n\t\tstate: v.union(\n\t\t\tv.literal(APPROVAL_RUN_STATES[0]),\n\t\t\tv.literal(APPROVAL_RUN_STATES[1]),\n\t\t\tv.literal(APPROVAL_RUN_STATES[2]),\n\t\t\tv.literal(APPROVAL_RUN_STATES[3]),\n\t\t\tv.literal(APPROVAL_RUN_STATES[4]),\n\t\t),\n\t}),\n\thandler: async (ctx, input) => {\n\t\tconst run = await ctx.db.get(input.runId)\n\t\tif (!run) throw new Error('Approval request not found')\n\t\tassertCompatible(run.workflow.compatibilityKey, input.compatibilityKey)\n\t\tconst step = run.workflow.steps.find(\n\t\t\t(candidate) => candidate.kind === 'decision' && candidate.key === run.currentStepKey,\n\t\t)\n\t\tif (!step || step.kind !== 'decision')\n\t\t\tthrow new Error('Approval request is not waiting for a decision')\n\n\t\tconst prior = await ctx.db\n\t\t\t.query('approvalDecisions')\n\t\t\t.withIndex(APPROVAL_ACTOR_DECISION_INDEX, (query) =>\n\t\t\t\tquery\n\t\t\t\t\t.eq('runId', run._id)\n\t\t\t\t\t.eq('stepKey', step.key)\n\t\t\t\t\t.eq('actor.actorRef', input.actor.actorRef),\n\t\t\t)\n\t\t\t.unique()\n\t\tif (prior) {\n\t\t\tif (prior.decision !== input.decision)\n\t\t\t\tthrow new Error('Actor already submitted a contradictory decision')\n\t\t\treturn {\n\t\t\t\tstate: run.state,\n\t\t\t}\n\t\t}\n\t\tif (run.state !== 'pending') throw new Error(`Approval request is already ${run.state}`)\n\t\tif (\n\t\t\trun.expiresAt !== undefined &&\n\t\t\tclassifyPendingRunAt(Date.now(), run.expiresAt) === 'expired'\n\t\t)\n\t\t\treturn claimExpiry(ctx, run, step.key)\n\t\tif (!step.decisions.includes(input.decision))\n\t\t\tthrow new Error('Decision is not allowed by this workflow step')\n\t\tif (step.makerChecker && input.actor.actorRef === run.requester.actorRef)\n\t\t\tthrow new Error('Requester cannot decide this approval step')\n\n\t\tconst decidedAt = Date.now()\n\t\tawait ctx.db.insert('approvalDecisions', {\n\t\t\trunId: run._id,\n\t\t\tstepKey: step.key,\n\t\t\tactor: input.actor,\n\t\t\tdecision: input.decision,\n\t\t\treason: input.reason,\n\t\t\tdecidedAt,\n\t\t})\n\t\tconst evidence = await ctx.db\n\t\t\t.query('approvalDecisions')\n\t\t\t.withIndex('by_runId_and_stepKey_and_decidedAt', (query) =>\n\t\t\t\tquery.eq('runId', run._id).eq('stepKey', step.key),\n\t\t\t)\n\t\t\t.collect()\n\t\tconst outcome = evaluateDecisionOutcome(\n\t\t\tevidence.map((item) => ({\n\t\t\t\tactorRef: item.actor.actorRef,\n\t\t\t\tdecision: item.decision,\n\t\t\t})),\n\t\t\tstep.quorum.approvals,\n\t\t)\n\t\tawait logApprovalTransition(ctx, {\n\t\t\taction: `approval.decision.${input.decision}`,\n\t\t\tactorRef: input.actor.actorRef,\n\t\t\trunId: run._id,\n\t\t\tresourceType: run.resourceType,\n\t\t\tresourceRef: run.resourceRef,\n\t\t\ttransition: `${step.key}:${input.actor.actorRef}:${input.decision}`,\n\t\t})\n\t\tif (!outcome) return { state: 'pending' as const }\n\t\tconst terminal = isTerminalDecision(run, step.key, outcome)\n\t\tawait finishDecision(ctx, run, step.key, outcome, terminal, {\n\t\t\tactorRef: input.actor.actorRef,\n\t\t\tdecision: input.decision,\n\t\t\treason: input.reason,\n\t\t\tdecidedAt,\n\t\t})\n\t\treturn terminal ? { state: outcome } : { state: 'pending' as const }\n\t},\n})\n\nexport const list = query({\n\targs: { runId: v.id('approvalRuns') },\n\treturns: v.array(\n\t\tv.object({\n\t\t\tstepKey: v.string(),\n\t\t\tactorRef: v.string(),\n\t\t\tdecision: zodToConvex(approvalDecision),\n\t\t\treason: v.optional(zodToConvex(approvalReason)),\n\t\t\tdecidedAt: v.number(),\n\t\t}),\n\t),\n\thandler: (ctx, input) => listDecisionEvidence(ctx, input.runId),\n})\n\nexport const listForWorkflow = internalQuery({\n\targs: { runId: v.id('approvalRuns'), stepKey: v.string() },\n\treturns: v.array(\n\t\tv.object({\n\t\t\tstepKey: v.string(),\n\t\t\tactorRef: v.string(),\n\t\t\tdecision: zodToConvex(approvalDecision),\n\t\t\treason: v.optional(zodToConvex(approvalReason)),\n\t\t\tdecidedAt: v.number(),\n\t\t}),\n\t),\n\thandler: (ctx, input) => listDecisionEvidenceForStep(ctx, input.runId, input.stepKey),\n})\n\nexport const enter = internalMutation({\n\targs: {\n\t\trunId: v.id('approvalRuns'),\n\t\tstepKey: v.string(),\n\t\tworkflowId: v.string(),\n\t\texpiresAfterMs: v.optional(v.number()),\n\t},\n\treturns: v.object({\n\t\tstate: v.union(\n\t\t\tv.literal(APPROVAL_RUN_STATES[0]),\n\t\t\tv.literal(APPROVAL_RUN_STATES[1]),\n\t\t\tv.literal(APPROVAL_RUN_STATES[2]),\n\t\t\tv.literal(APPROVAL_RUN_STATES[3]),\n\t\t\tv.literal(APPROVAL_RUN_STATES[4]),\n\t\t),\n\t\texpiresAt: v.optional(v.number()),\n\t}),\n\thandler: async (ctx, input) => {\n\t\tconst run = await ctx.db.get(input.runId)\n\t\tif (!run) throw new Error('Approval request not found')\n\t\tif (run.workflowId !== input.workflowId)\n\t\t\tthrow new Error('Approval workflow linkage is incomplete')\n\t\tif (run.state !== 'pending')\n\t\t\treturn {\n\t\t\t\tstate: run.state,\n\t\t\t\texpiresAt: run.expiresAt,\n\t\t\t}\n\t\tconst configuredExpiresAt = Number(run.metadata?.approvalExpiresAt)\n\t\tconst expiresAt = Number.isFinite(configuredExpiresAt)\n\t\t\t? configuredExpiresAt\n\t\t\t: input.expiresAfterMs === undefined\n\t\t\t\t? undefined\n\t\t\t\t: Date.now() + input.expiresAfterMs\n\t\tawait ctx.db.patch(run._id, {\n\t\t\tcurrentStepKey: input.stepKey,\n\t\t\texpiresAt,\n\t\t\tupdatedAt: Date.now(),\n\t\t})\n\t\tawait logApprovalTransition(ctx, {\n\t\t\taction: 'approval.waiting',\n\t\t\trunId: run._id,\n\t\t\tresourceType: run.resourceType,\n\t\t\tresourceRef: run.resourceRef,\n\t\t\ttransition: `${input.stepKey}:waiting`,\n\t\t})\n\t\tif (expiresAt !== undefined)\n\t\t\tawait ctx.scheduler.runAt(expiresAt, internal.decisions.expire, {\n\t\t\t\trunId: run._id,\n\t\t\t\tstepKey: input.stepKey,\n\t\t\t})\n\t\treturn {\n\t\t\tstate: 'pending' as const,\n\t\t\texpiresAt: expiresAt,\n\t\t}\n\t},\n})\n\nexport const expire = internalMutation({\n\targs: { runId: v.id('approvalRuns'), stepKey: v.string() },\n\treturns: v.object({\n\t\tstate: v.union(\n\t\t\tv.literal('missing'),\n\t\t\tv.literal(APPROVAL_RUN_STATES[0]),\n\t\t\tv.literal(APPROVAL_RUN_STATES[1]),\n\t\t\tv.literal(APPROVAL_RUN_STATES[2]),\n\t\t\tv.literal(APPROVAL_RUN_STATES[3]),\n\t\t\tv.literal(APPROVAL_RUN_STATES[4]),\n\t\t),\n\t}),\n\thandler: async (ctx, input) => {\n\t\tconst run = await ctx.db.get(input.runId)\n\t\tif (!run) return { state: 'missing' as const }\n\t\tif (\n\t\t\trun.state !== 'pending' ||\n\t\t\trun.currentStepKey !== input.stepKey ||\n\t\t\trun.expiresAt === undefined ||\n\t\t\tclassifyPendingRunAt(Date.now(), run.expiresAt) === 'pending'\n\t\t)\n\t\t\treturn { state: run.state }\n\t\treturn claimExpiry(ctx, run, input.stepKey)\n\t},\n})\n\nconst approvalWorkflow = new WorkflowManager(components.workflow)\n\nasync function claimExpiry(\n\tctx: import('./_generated/server').MutationCtx,\n\trun: import('./_generated/dataModel').Doc<'approvalRuns'>,\n\tstepKey: string,\n): Promise<{ state: 'expired' }> {\n\tif (!canTransitionApprovalRun(run.state, 'expired'))\n\t\tthrow new Error(`Approval request cannot transition from ${run.state}`)\n\tconst now = Date.now()\n\tawait ctx.db.patch(run._id, {\n\t\tstate: 'expired',\n\t\texpiresAt: undefined,\n\t\tupdatedAt: now,\n\t\tterminalAt: now,\n\t})\n\tawait logApprovalTransition(ctx, {\n\t\taction: 'approval.expired',\n\t\trunId: run._id,\n\t\tresourceType: run.resourceType,\n\t\tresourceRef: run.resourceRef,\n\t\ttransition: `${stepKey}:expired`,\n\t})\n\tif (!run.workflowId) throw new Error('Approval workflow is not linked')\n\tawait approvalWorkflow.sendEvent(ctx, {\n\t\t// SAFETY: workflowId was persisted from approvalWorkflow.start when this run was created.\n\t\tworkflowId: run.workflowId as WorkflowId,\n\t\tname: approvalDecisionEventName(run._id, stepKey),\n\t\tvalidator: v.object({ outcome: v.literal(APPROVAL_RUN_STATES[3]) }),\n\t\tvalue: { outcome: 'expired' },\n\t})\n\treturn { state: 'expired' }\n}\n\nasync function finishDecision(\n\tctx: import('./_generated/server').MutationCtx,\n\trun: import('./_generated/dataModel').Doc<'approvalRuns'>,\n\tstepKey: string,\n\toutcome: 'approved' | 'rejected',\n\tterminal: boolean,\n\tterminalEvidence: {\n\t\tactorRef: string\n\t\tdecision: 'approved' | 'rejected'\n\t\treason?: string\n\t\tdecidedAt: number\n\t},\n): Promise<void> {\n\tif (terminal) {\n\t\tif (!canTransitionApprovalRun(run.state, outcome))\n\t\t\tthrow new Error(`Approval request cannot transition from ${run.state}`)\n\t\tconst now = Date.now()\n\t\tawait ctx.db.patch(run._id, {\n\t\t\tstate: outcome,\n\t\t\texpiresAt: undefined,\n\t\t\tupdatedAt: now,\n\t\t\tterminalAt: now,\n\t\t})\n\t\tawait logApprovalTransition(ctx, {\n\t\t\taction: `approval.${outcome}`,\n\t\t\trunId: run._id,\n\t\t\tresourceType: run.resourceType,\n\t\t\tresourceRef: run.resourceRef,\n\t\t\ttransition: `${stepKey}:terminal:${outcome}`,\n\t\t})\n\t}\n\tif (!run.workflowId) throw new Error('Approval workflow is not linked')\n\tawait approvalWorkflow.sendEvent(ctx, {\n\t\t// SAFETY: workflowId was persisted from approvalWorkflow.start when this run was created.\n\t\tworkflowId: run.workflowId as WorkflowId,\n\t\tname: approvalDecisionEventName(run._id, stepKey),\n\t\tvalidator: v.object({\n\t\t\toutcome: v.union(v.literal(APPROVAL_DECISIONS[0]), v.literal(APPROVAL_DECISIONS[1])),\n\t\t\tterminalEvidence: v.object({\n\t\t\t\tactorRef: v.string(),\n\t\t\t\tdecision: zodToConvex(approvalDecision),\n\t\t\t\treason: v.optional(zodToConvex(approvalReason)),\n\t\t\t\tdecidedAt: v.number(),\n\t\t\t}),\n\t\t}),\n\t\tvalue: { outcome, terminalEvidence },\n\t})\n}\n\nfunction assertCompatible(actual: string, expected: string): void {\n\tif (actual !== expected)\n\t\tthrow new Error(\n\t\t\t`Approval workflow compatibility mismatch: expected ${expected}, received ${actual}`,\n\t\t)\n}\n\nasync function listDecisionEvidence(\n\tctx: QueryCtx,\n\trunId: import('./_generated/dataModel').Id<'approvalRuns'>,\n) {\n\tconst decisions = await ctx.db\n\t\t.query('approvalDecisions')\n\t\t.withIndex(APPROVAL_DECISION_HISTORY_INDEX, (query) => query.eq('runId', runId))\n\t\t.collect()\n\treturn decisions.map((decision) => ({\n\t\tstepKey: decision.stepKey,\n\t\tactorRef: decision.actor.actorRef,\n\t\tdecision: decision.decision,\n\t\treason: decision.reason,\n\t\tdecidedAt: decision.decidedAt,\n\t}))\n}\n\nasync function listDecisionEvidenceForStep(\n\tctx: QueryCtx,\n\trunId: import('./_generated/dataModel').Id<'approvalRuns'>,\n\tstepKey: string,\n) {\n\tconst decisions = await ctx.db\n\t\t.query('approvalDecisions')\n\t\t.withIndex('by_runId_and_stepKey_and_decidedAt', (query) =>\n\t\t\tquery.eq('runId', runId).eq('stepKey', stepKey),\n\t\t)\n\t\t.collect()\n\treturn decisions.map((decision) => ({\n\t\tstepKey: decision.stepKey,\n\t\tactorRef: decision.actor.actorRef,\n\t\tdecision: decision.decision,\n\t\treason: decision.reason,\n\t\tdecidedAt: decision.decidedAt,\n\t}))\n}\n\nfunction isTerminalDecision(\n\trun: import('./_generated/dataModel').Doc<'approvalRuns'>,\n\tstepKey: string,\n\toutcome: 'approved' | 'rejected',\n): boolean {\n\tif (outcome === 'rejected') return true\n\tconst currentIndex = run.workflow.steps.findIndex(\n\t\t(step) => step.kind === 'decision' && step.key === stepKey,\n\t)\n\treturn !run.workflow.steps.slice(currentIndex + 1).some((step) => step.kind === 'decision')\n}\n"],"mappings":"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"}
|
|
@@ -2,8 +2,8 @@ import { ApprovalRunState } from "./constants.mjs";
|
|
|
2
2
|
declare namespace functions_d_exports {
|
|
3
3
|
export { canTransitionApprovalRun, classifyPendingRunAt };
|
|
4
4
|
}
|
|
5
|
-
declare function canTransitionApprovalRun(from: ApprovalRunState, to: ApprovalRunState): boolean;
|
|
6
|
-
declare function classifyPendingRunAt(now: number, expiresAt: number): 'pending' | 'expired';
|
|
5
|
+
export declare function canTransitionApprovalRun(from: ApprovalRunState, to: ApprovalRunState): boolean;
|
|
6
|
+
export declare function classifyPendingRunAt(now: number, expiresAt: number): 'pending' | 'expired';
|
|
7
7
|
//#endregion
|
|
8
|
-
export {
|
|
8
|
+
export { functions_d_exports };
|
|
9
9
|
//# sourceMappingURL=functions.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"functions.mjs","names":[],"sources":["../../../src/components/approvals/functions.ts"],"sourcesContent":["import type { ApprovalRunState } from './constants'\n\nexport function canTransitionApprovalRun(from: ApprovalRunState, to: ApprovalRunState): boolean {\n\treturn LEGAL_APPROVAL_RUN_TRANSITIONS[from].some((state) => state === to)\n}\n\nexport function classifyPendingRunAt(now: number, expiresAt: number): 'pending' | 'expired' {\n\treturn now >= expiresAt ? 'expired' : 'pending'\n}\n\nconst LEGAL_APPROVAL_RUN_TRANSITIONS = {\n\tpending: ['approved', 'rejected', 'expired', 'canceled'],\n\tapproved: [],\n\trejected: [],\n\texpired: [],\n\tcanceled: [],\n} as const satisfies Readonly<Record<ApprovalRunState, readonly ApprovalRunState[]>>\n"],"mappings":"AAEA,
|
|
1
|
+
{"version":3,"file":"functions.mjs","names":["canTransitionApprovalRun","LEGAL_APPROVAL_RUN_TRANSITIONS","from","state","to","classifyPendingRunAt","now","expiresAt"],"sources":["../../../src/components/approvals/functions.ts"],"sourcesContent":["import type { ApprovalRunState } from './constants'\n\nexport function canTransitionApprovalRun(from: ApprovalRunState, to: ApprovalRunState): boolean {\n\treturn LEGAL_APPROVAL_RUN_TRANSITIONS[from].some((state) => state === to)\n}\n\nexport function classifyPendingRunAt(now: number, expiresAt: number): 'pending' | 'expired' {\n\treturn now >= expiresAt ? 'expired' : 'pending'\n}\n\nconst LEGAL_APPROVAL_RUN_TRANSITIONS = {\n\tpending: ['approved', 'rejected', 'expired', 'canceled'],\n\tapproved: [],\n\trejected: [],\n\texpired: [],\n\tcanceled: [],\n} as const satisfies Readonly<Record<ApprovalRunState, readonly ApprovalRunState[]>>\n"],"mappings":"AAEA,SAAgBA,EAAyB,EAAwB,EAA+B,CAC/F,OAAOC,EAA+BC,EAAK,CAAC,KAAM,GAAUC,IAAUC,CAAE,CACzE,CAEA,SAAgBC,EAAqB,EAAa,EAA0C,CAC3F,OAAOC,GAAOC,EAAY,UAAY,SACvC,CAEA,MAAMN,EAAiC,CACtC,QAAS,CAAC,WAAY,WAAY,UAAW,UAAU,EACvD,SAAU,CAAC,EACX,SAAU,CAAC,EACX,QAAS,CAAC,EACV,SAAU,CAAC,CACZ"}
|
|
@@ -5,11 +5,11 @@ declare namespace health_d_exports {
|
|
|
5
5
|
* Verifies that the package's component schema and required decision indexes
|
|
6
6
|
* were deployed. A missing schema fails with a cvx-kit-specific diagnostic.
|
|
7
7
|
*/
|
|
8
|
-
declare const check: import("convex/server").RegisteredQuery<"public", {}, Promise<{
|
|
8
|
+
export declare const check: import("convex/server").RegisteredQuery<"public", {}, Promise<{
|
|
9
9
|
status: 'ready';
|
|
10
10
|
schemaVersion: 1;
|
|
11
11
|
requiredIndexes: ("by_runId_and_decidedAt" | "by_runId_and_stepKey_and_actor_actorRef")[];
|
|
12
12
|
}>>;
|
|
13
13
|
//#endregion
|
|
14
|
-
export {
|
|
14
|
+
export { health_d_exports };
|
|
15
15
|
//# sourceMappingURL=health.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"health.mjs","names":[],"sources":["../../../src/components/approvals/health.ts"],"sourcesContent":["import { v } from 'convex/values'\n\nimport { query } from './_generated/server'\nimport { APPROVAL_COMPONENT_SCHEMA_VERSION, APPROVAL_REQUIRED_DECISION_INDEXES } from './constants'\n\n/**\n * Verifies that the package's component schema and required decision indexes\n * were deployed. A missing schema fails with a cvx-kit-specific diagnostic.\n */\nexport const check = query({\n\targs: {},\n\treturns: v.object({\n\t\tstatus: v.literal('ready'),\n\t\tschemaVersion: v.literal(APPROVAL_COMPONENT_SCHEMA_VERSION),\n\t\trequiredIndexes: v.array(v.string()),\n\t}),\n\thandler: async (ctx) => {\n\t\ttry {\n\t\t\tfor (const index of APPROVAL_REQUIRED_DECISION_INDEXES) {\n\t\t\t\tawait ctx.db.query('approvalDecisions').withIndex(index).take(1)\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tthrow new Error(\n\t\t\t\t`cvx-kit approvals schema v${APPROVAL_COMPONENT_SCHEMA_VERSION} is not installed with its required indexes. Remove consumer patches, reinstall cvx-kit, and deploy again. Cause: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t)\n\t\t}\n\n\t\treturn {\n\t\t\tstatus: 'ready' as const,\n\t\t\tschemaVersion: APPROVAL_COMPONENT_SCHEMA_VERSION,\n\t\t\trequiredIndexes: [...APPROVAL_REQUIRED_DECISION_INDEXES],\n\t\t}\n\t},\n})\n"],"mappings":"uJASA,
|
|
1
|
+
{"version":3,"file":"health.mjs","names":["check","query","v","index","APPROVAL_REQUIRED_DECISION_INDEXES","ctx","error"],"sources":["../../../src/components/approvals/health.ts"],"sourcesContent":["import { v } from 'convex/values'\n\nimport { query } from './_generated/server'\nimport { APPROVAL_COMPONENT_SCHEMA_VERSION, APPROVAL_REQUIRED_DECISION_INDEXES } from './constants'\n\n/**\n * Verifies that the package's component schema and required decision indexes\n * were deployed. A missing schema fails with a cvx-kit-specific diagnostic.\n */\nexport const check = query({\n\targs: {},\n\treturns: v.object({\n\t\tstatus: v.literal('ready'),\n\t\tschemaVersion: v.literal(APPROVAL_COMPONENT_SCHEMA_VERSION),\n\t\trequiredIndexes: v.array(v.string()),\n\t}),\n\thandler: async (ctx) => {\n\t\ttry {\n\t\t\tfor (const index of APPROVAL_REQUIRED_DECISION_INDEXES) {\n\t\t\t\tawait ctx.db.query('approvalDecisions').withIndex(index).take(1)\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tthrow new Error(\n\t\t\t\t`cvx-kit approvals schema v${APPROVAL_COMPONENT_SCHEMA_VERSION} is not installed with its required indexes. Remove consumer patches, reinstall cvx-kit, and deploy again. Cause: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t)\n\t\t}\n\n\t\treturn {\n\t\t\tstatus: 'ready' as const,\n\t\t\tschemaVersion: APPROVAL_COMPONENT_SCHEMA_VERSION,\n\t\t\trequiredIndexes: [...APPROVAL_REQUIRED_DECISION_INDEXES],\n\t\t}\n\t},\n})\n"],"mappings":"uJASA,MAAaA,EAAQC,EAAM,CAC1B,KAAM,CAAC,EACP,QAASC,EAAE,OAAO,CACjB,OAAQA,EAAE,QAAQ,OAAO,EACzB,cAAeA,EAAE,QAAA,CAAyC,EAC1D,gBAAiBA,EAAE,MAAMA,EAAE,OAAO,CAAC,CACpC,CAAC,EACD,QAAS,KAAO,IAAQ,CACvB,GAAI,CACH,IAAK,IAAMC,KAASC,EACnB,MAAMC,EAAI,GAAG,MAAM,mBAAmB,CAAC,CAAC,UAAUF,CAAK,CAAC,CAAC,KAAK,CAAC,CAEjE,OAASG,EAAO,CACf,MAAU,MACT,gJAAmLA,aAAiB,MAAQA,EAAM,QAAU,OAAOA,CAAK,GACzO,CACD,CAEA,MAAO,CACN,OAAQ,QACR,cAAA,EACA,gBAAiB,CAAC,GAAGF,CAAkC,CACxD,CACD,CACD,CAAC"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
declare namespace requests_d_exports {
|
|
2
2
|
export { cancel, getForWorkflow, list, recordExecutionTerminal, restart, start, status };
|
|
3
3
|
}
|
|
4
|
-
declare const start: import("convex/server").RegisteredMutation<"public", {
|
|
4
|
+
export declare const start: import("convex/server").RegisteredMutation<"public", {
|
|
5
5
|
metadata?: Record<string, string> | undefined;
|
|
6
6
|
requester: {
|
|
7
7
|
actorRef: string;
|
|
@@ -61,7 +61,7 @@ declare const start: import("convex/server").RegisteredMutation<"public", {
|
|
|
61
61
|
}, Promise<{
|
|
62
62
|
runId: import("convex/values").GenericId<"approvalRuns">;
|
|
63
63
|
}>>;
|
|
64
|
-
declare const cancel: import("convex/server").RegisteredMutation<"public", {
|
|
64
|
+
export declare const cancel: import("convex/server").RegisteredMutation<"public", {
|
|
65
65
|
actor: {
|
|
66
66
|
actorRef: string;
|
|
67
67
|
capabilities: string[];
|
|
@@ -74,11 +74,11 @@ declare const cancel: import("convex/server").RegisteredMutation<"public", {
|
|
|
74
74
|
}, Promise<{
|
|
75
75
|
state: 'canceled';
|
|
76
76
|
}>>;
|
|
77
|
-
declare const restart: import("convex/server").RegisteredMutation<"public", {
|
|
77
|
+
export declare const restart: import("convex/server").RegisteredMutation<"public", {
|
|
78
78
|
compatibilityKey: string;
|
|
79
79
|
runId: import("convex/values").GenericId<"approvalRuns">;
|
|
80
80
|
}, Promise<null>>;
|
|
81
|
-
declare const status: import("convex/server").RegisteredQuery<"public", {
|
|
81
|
+
export declare const status: import("convex/server").RegisteredQuery<"public", {
|
|
82
82
|
compatibilityKey: string;
|
|
83
83
|
runId: import("convex/values").GenericId<"approvalRuns">;
|
|
84
84
|
}, Promise<{
|
|
@@ -160,7 +160,7 @@ declare const status: import("convex/server").RegisteredQuery<"public", {
|
|
|
160
160
|
type: "canceled" | "completed" | "inProgress";
|
|
161
161
|
} | null;
|
|
162
162
|
} | null>>;
|
|
163
|
-
declare const list: import("convex/server").RegisteredQuery<"public", {
|
|
163
|
+
export declare const list: import("convex/server").RegisteredQuery<"public", {
|
|
164
164
|
paginationOpts: {
|
|
165
165
|
id?: number;
|
|
166
166
|
endCursor?: string | null;
|
|
@@ -241,7 +241,7 @@ declare const list: import("convex/server").RegisteredQuery<"public", {
|
|
|
241
241
|
updatedAt: number;
|
|
242
242
|
terminalAt?: number | undefined;
|
|
243
243
|
}>>>;
|
|
244
|
-
declare const getForWorkflow: import("convex/server").RegisteredQuery<"internal", {
|
|
244
|
+
export declare const getForWorkflow: import("convex/server").RegisteredQuery<"internal", {
|
|
245
245
|
runId: import("convex/values").GenericId<"approvalRuns">;
|
|
246
246
|
}, Promise<{
|
|
247
247
|
_creationTime: number;
|
|
@@ -313,11 +313,11 @@ declare const getForWorkflow: import("convex/server").RegisteredQuery<"internal"
|
|
|
313
313
|
updatedAt: number;
|
|
314
314
|
terminalAt?: number | undefined;
|
|
315
315
|
} | null>>;
|
|
316
|
-
declare const recordExecutionTerminal: import("convex/server").RegisteredMutation<"internal", {
|
|
316
|
+
export declare const recordExecutionTerminal: import("convex/server").RegisteredMutation<"internal", {
|
|
317
317
|
failedStepKey?: string | undefined;
|
|
318
318
|
outcome: "completed" | "failed";
|
|
319
319
|
runId: import("convex/values").GenericId<"approvalRuns">;
|
|
320
320
|
}, Promise<null>>;
|
|
321
321
|
//#endregion
|
|
322
|
-
export {
|
|
322
|
+
export { requests_d_exports };
|
|
323
323
|
//# sourceMappingURL=requests.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"requests.mjs","names":["schema"],"sources":["../../../src/components/approvals/requests.ts"],"sourcesContent":["import { WorkflowManager, type WorkflowId } from '@convex-dev/workflow'\nimport { zodToConvex } from 'convex-helpers/server/zod4'\nimport { paginator } from 'convex-helpers/server/pagination'\nimport { paginationOptsValidator, paginationResultValidator } from 'convex/server'\nimport { v } from 'convex/values'\n\nimport { components, internal } from './_generated/api'\nimport { internalMutation, internalQuery, mutation, query } from './_generated/server'\nimport { logApprovalTransition } from './audit'\nimport schema from './schema'\nimport { APPROVAL_EXECUTION_STATES, APPROVAL_RUN_STATES } from './constants'\nimport { canTransitionApprovalRun } from './functions'\nimport {\n\tapprovalActor,\n\tapprovalMetadata,\n\tapprovalName,\n\tapprovalReference,\n\tapprovalRunDocument,\n\tapprovalRunState,\n\tapprovalWorkflowDescriptor,\n} from './validators'\n\nexport const start = mutation({\n\targs: {\n\t\tscopeRef: zodToConvex(approvalReference),\n\t\tresourceType: zodToConvex(approvalReference),\n\t\tresourceRef: zodToConvex(approvalReference),\n\t\trequester: zodToConvex(approvalActor),\n\t\tmetadata: v.optional(zodToConvex(approvalMetadata)),\n\t\tworkflow: zodToConvex(approvalWorkflowDescriptor),\n\t},\n\treturns: v.object({ runId: v.id('approvalRuns') }),\n\thandler: async (ctx, input) => {\n\t\tconst now = Date.now()\n\t\tconst runId = await ctx.db.insert('approvalRuns', {\n\t\t\t...input,\n\t\t\tstate: 'pending',\n\t\t\tcreatedAt: now,\n\t\t\tupdatedAt: now,\n\t\t})\n\t\tconst workflowId: WorkflowId = await approvalWorkflow.start(\n\t\t\tctx,\n\t\t\tinternal.workflow.run,\n\t\t\t{ runId },\n\t\t\t{ startAsync: true },\n\t\t)\n\t\tawait ctx.db.patch(runId, { workflowId, updatedAt: Date.now() })\n\t\tawait logApprovalTransition(ctx, {\n\t\t\taction: 'approval.requested',\n\t\t\tactorRef: input.requester.actorRef,\n\t\t\trunId,\n\t\t\tresourceType: input.resourceType,\n\t\t\tresourceRef: input.resourceRef,\n\t\t\ttransition: 'requested',\n\t\t})\n\t\treturn { runId }\n\t},\n})\n\nexport const cancel = mutation({\n\targs: {\n\t\trunId: v.id('approvalRuns'),\n\t\tactor: zodToConvex(approvalActor),\n\t\tcompatibilityKey: v.string(),\n\t},\n\treturns: v.object({ state: v.literal(APPROVAL_RUN_STATES[4]) }),\n\thandler: async (ctx, input) => {\n\t\tconst run = await ctx.db.get(input.runId)\n\t\tif (!run) throw new Error('Approval request not found')\n\t\tassertCompatible(run.workflow.compatibilityKey, input.compatibilityKey)\n\t\tif (run.state !== 'pending') {\n\t\t\tif (run.state === 'canceled') return { state: 'canceled' as const }\n\t\t\tthrow new Error(`Approval request is already ${run.state}`)\n\t\t}\n\t\tif (!run.workflowId) throw new Error('Approval workflow is not linked')\n\t\t// SAFETY: this run stores the id returned by approvalWorkflow.start.\n\t\tawait approvalWorkflow.cancel(ctx, run.workflowId as WorkflowId)\n\t\tif (!canTransitionApprovalRun(run.state, 'canceled'))\n\t\t\tthrow new Error(`Approval request cannot transition from ${run.state}`)\n\t\tconst now = Date.now()\n\t\tawait ctx.db.patch(run._id, {\n\t\t\tstate: 'canceled',\n\t\t\texpiresAt: undefined,\n\t\t\tupdatedAt: now,\n\t\t\tterminalAt: now,\n\t\t})\n\t\tawait logApprovalTransition(ctx, {\n\t\t\taction: 'approval.canceled',\n\t\t\tactorRef: input.actor.actorRef,\n\t\t\trunId: run._id,\n\t\t\tresourceType: run.resourceType,\n\t\t\tresourceRef: run.resourceRef,\n\t\t\ttransition: 'canceled',\n\t\t})\n\t\treturn { state: 'canceled' as const }\n\t},\n})\n\nexport const restart = mutation({\n\targs: { runId: v.id('approvalRuns'), compatibilityKey: v.string() },\n\treturns: v.null(),\n\thandler: async (ctx, input) => {\n\t\tconst run = await ctx.db.get(input.runId)\n\t\tif (!run) throw new Error('Approval request not found')\n\t\tassertCompatible(run.workflow.compatibilityKey, input.compatibilityKey)\n\t\tif (!run.workflowId) throw new Error('Approval workflow is not linked')\n\t\tif (!run.executionFailedStepKey)\n\t\t\tthrow new Error('Approval workflow has no failed step to restart')\n\t\t// SAFETY: this run stores the id returned by approvalWorkflow.start.\n\t\tawait approvalWorkflow.restart(ctx, run.workflowId as WorkflowId, {\n\t\t\tfrom: run.executionFailedStepKey,\n\t\t\tstartAsync: true,\n\t\t})\n\t\treturn null\n\t},\n})\n\nexport const status = query({\n\targs: { runId: v.id('approvalRuns'), compatibilityKey: v.string() },\n\treturns: v.union(v.null(), approvalStatusValidator()),\n\thandler: async (ctx, input) => {\n\t\tconst run = await ctx.db.get(input.runId)\n\t\tif (!run) return null\n\t\tassertCompatible(run.workflow.compatibilityKey, input.compatibilityKey)\n\t\t// SAFETY: workflowId is the id persisted from approvalWorkflow.start for this run.\n\t\tconst workflowStatus = run.workflowId\n\t\t\t? await approvalWorkflow.status(ctx, run.workflowId as WorkflowId)\n\t\t\t: null\n\t\tconst execution = normalizeWorkflowStatus(workflowStatus)\n\t\treturn { run, execution }\n\t},\n})\n\nexport const list = query({\n\targs: {\n\t\tscopeRef: zodToConvex(approvalReference),\n\t\tstate: v.optional(zodToConvex(approvalRunState)),\n\t\tpaginationOpts: paginationOptsValidator,\n\t},\n\treturns: paginationResultValidator(approvalRunValidator()),\n\thandler: (ctx, input) =>\n\t\tpaginator(ctx.db, schema)\n\t\t\t.query('approvalRuns')\n\t\t\t.withIndex('by_scopeRef_and_state', (query) =>\n\t\t\t\tinput.state === undefined\n\t\t\t\t\t? query.eq('scopeRef', input.scopeRef)\n\t\t\t\t\t: query.eq('scopeRef', input.scopeRef).eq('state', input.state),\n\t\t\t)\n\t\t\t.order('desc')\n\t\t\t.paginate(input.paginationOpts),\n})\n\nexport const getForWorkflow = internalQuery({\n\targs: { runId: v.id('approvalRuns') },\n\treturns: v.union(v.null(), approvalRunValidator()),\n\thandler: (ctx, input) => ctx.db.get(input.runId),\n})\n\nexport const recordExecutionTerminal = internalMutation({\n\targs: {\n\t\trunId: v.id('approvalRuns'),\n\t\toutcome: v.union(\n\t\t\tv.literal(APPROVAL_EXECUTION_STATES[1]),\n\t\t\tv.literal(APPROVAL_EXECUTION_STATES[3]),\n\t\t),\n\t\tfailedStepKey: v.optional(zodToConvex(approvalName)),\n\t},\n\treturns: v.null(),\n\thandler: async (ctx, input) => {\n\t\tconst run = await ctx.db.get(input.runId)\n\t\tif (!run) throw new Error('Approval request not found')\n\t\tawait ctx.db.patch(run._id, {\n\t\t\texecutionFailedStepKey: input.outcome === 'failed' ? input.failedStepKey : undefined,\n\t\t\tupdatedAt: Date.now(),\n\t\t})\n\t\tawait logApprovalTransition(ctx, {\n\t\t\taction: `approval.execution.${input.outcome}`,\n\t\t\trunId: run._id,\n\t\t\tresourceType: run.resourceType,\n\t\t\tresourceRef: run.resourceRef,\n\t\t\ttransition: `execution:${input.outcome}`,\n\t\t\tseverity: input.outcome === 'failed' ? 'error' : 'info',\n\t\t})\n\t\treturn null\n\t},\n})\n\nconst approvalWorkflow = new WorkflowManager(components.workflow)\n\nfunction normalizeWorkflowStatus(\n\tstatus: Awaited<ReturnType<typeof approvalWorkflow.status>> | null,\n) {\n\tif (!status) return null\n\tswitch (status.type) {\n\t\tcase 'failed':\n\t\t\treturn { type: 'failed' as const, error: status.error }\n\t\tcase 'inProgress':\n\t\tcase 'completed':\n\t\tcase 'canceled':\n\t\t\treturn { type: status.type }\n\t}\n}\n\nfunction approvalRunValidator() {\n\treturn v.object({\n\t\t_id: v.id('approvalRuns'),\n\t\t_creationTime: v.number(),\n\t\t...zodToConvex(approvalRunDocument).fields,\n\t})\n}\n\nfunction workflowStatusValidator() {\n\treturn v.union(\n\t\tv.object({ type: v.literal(APPROVAL_EXECUTION_STATES[0]) }),\n\t\tv.object({ type: v.literal(APPROVAL_EXECUTION_STATES[1]) }),\n\t\tv.object({ type: v.literal(APPROVAL_EXECUTION_STATES[2]) }),\n\t\tv.object({\n\t\t\ttype: v.literal(APPROVAL_EXECUTION_STATES[3]),\n\t\t\terror: v.string(),\n\t\t}),\n\t)\n}\n\nfunction approvalStatusValidator() {\n\treturn v.object({\n\t\trun: approvalRunValidator(),\n\t\texecution: v.union(v.null(), workflowStatusValidator()),\n\t})\n}\n\nfunction assertCompatible(actual: string, expected: string): void {\n\tif (actual !== expected)\n\t\tthrow new Error(\n\t\t\t`Approval workflow compatibility mismatch: expected ${expected}, received ${actual}`,\n\t\t)\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"requests.mjs","names":["schema","schema_default","start","mutation","zodToConvex","approvalReference","approvalActor","v","approvalMetadata","approvalWorkflowDescriptor","now","runId","ctx","input","workflowId","approvalWorkflow","internal","logApprovalTransition","cancel","APPROVAL_RUN_STATES","run","assertCompatible","canTransitionApprovalRun","restart","status","query","approvalStatusValidator","normalizeWorkflowStatus","list","approvalRunState","paginationOptsValidator","paginationResultValidator","approvalRunValidator","paginator","getForWorkflow","internalQuery","recordExecutionTerminal","internalMutation","APPROVAL_EXECUTION_STATES","approvalName","WorkflowManager","components","approvalRunDocument","workflowStatusValidator","actual","expected"],"sources":["../../../src/components/approvals/requests.ts"],"sourcesContent":["import { WorkflowManager, type WorkflowId } from '@convex-dev/workflow'\nimport { zodToConvex } from 'convex-helpers/server/zod4'\nimport { paginator } from 'convex-helpers/server/pagination'\nimport { paginationOptsValidator, paginationResultValidator } from 'convex/server'\nimport { v } from 'convex/values'\n\nimport { components, internal } from './_generated/api'\nimport { internalMutation, internalQuery, mutation, query } from './_generated/server'\nimport { logApprovalTransition } from './audit'\nimport schema from './schema'\nimport { APPROVAL_EXECUTION_STATES, APPROVAL_RUN_STATES } from './constants'\nimport { canTransitionApprovalRun } from './functions'\nimport {\n\tapprovalActor,\n\tapprovalMetadata,\n\tapprovalName,\n\tapprovalReference,\n\tapprovalRunDocument,\n\tapprovalRunState,\n\tapprovalWorkflowDescriptor,\n} from './validators'\n\nexport const start = mutation({\n\targs: {\n\t\tscopeRef: zodToConvex(approvalReference),\n\t\tresourceType: zodToConvex(approvalReference),\n\t\tresourceRef: zodToConvex(approvalReference),\n\t\trequester: zodToConvex(approvalActor),\n\t\tmetadata: v.optional(zodToConvex(approvalMetadata)),\n\t\tworkflow: zodToConvex(approvalWorkflowDescriptor),\n\t},\n\treturns: v.object({ runId: v.id('approvalRuns') }),\n\thandler: async (ctx, input) => {\n\t\tconst now = Date.now()\n\t\tconst runId = await ctx.db.insert('approvalRuns', {\n\t\t\t...input,\n\t\t\tstate: 'pending',\n\t\t\tcreatedAt: now,\n\t\t\tupdatedAt: now,\n\t\t})\n\t\tconst workflowId: WorkflowId = await approvalWorkflow.start(\n\t\t\tctx,\n\t\t\tinternal.workflow.run,\n\t\t\t{ runId },\n\t\t\t{ startAsync: true },\n\t\t)\n\t\tawait ctx.db.patch(runId, { workflowId, updatedAt: Date.now() })\n\t\tawait logApprovalTransition(ctx, {\n\t\t\taction: 'approval.requested',\n\t\t\tactorRef: input.requester.actorRef,\n\t\t\trunId,\n\t\t\tresourceType: input.resourceType,\n\t\t\tresourceRef: input.resourceRef,\n\t\t\ttransition: 'requested',\n\t\t})\n\t\treturn { runId }\n\t},\n})\n\nexport const cancel = mutation({\n\targs: {\n\t\trunId: v.id('approvalRuns'),\n\t\tactor: zodToConvex(approvalActor),\n\t\tcompatibilityKey: v.string(),\n\t},\n\treturns: v.object({ state: v.literal(APPROVAL_RUN_STATES[4]) }),\n\thandler: async (ctx, input) => {\n\t\tconst run = await ctx.db.get(input.runId)\n\t\tif (!run) throw new Error('Approval request not found')\n\t\tassertCompatible(run.workflow.compatibilityKey, input.compatibilityKey)\n\t\tif (run.state !== 'pending') {\n\t\t\tif (run.state === 'canceled') return { state: 'canceled' as const }\n\t\t\tthrow new Error(`Approval request is already ${run.state}`)\n\t\t}\n\t\tif (!run.workflowId) throw new Error('Approval workflow is not linked')\n\t\t// SAFETY: this run stores the id returned by approvalWorkflow.start.\n\t\tawait approvalWorkflow.cancel(ctx, run.workflowId as WorkflowId)\n\t\tif (!canTransitionApprovalRun(run.state, 'canceled'))\n\t\t\tthrow new Error(`Approval request cannot transition from ${run.state}`)\n\t\tconst now = Date.now()\n\t\tawait ctx.db.patch(run._id, {\n\t\t\tstate: 'canceled',\n\t\t\texpiresAt: undefined,\n\t\t\tupdatedAt: now,\n\t\t\tterminalAt: now,\n\t\t})\n\t\tawait logApprovalTransition(ctx, {\n\t\t\taction: 'approval.canceled',\n\t\t\tactorRef: input.actor.actorRef,\n\t\t\trunId: run._id,\n\t\t\tresourceType: run.resourceType,\n\t\t\tresourceRef: run.resourceRef,\n\t\t\ttransition: 'canceled',\n\t\t})\n\t\treturn { state: 'canceled' as const }\n\t},\n})\n\nexport const restart = mutation({\n\targs: { runId: v.id('approvalRuns'), compatibilityKey: v.string() },\n\treturns: v.null(),\n\thandler: async (ctx, input) => {\n\t\tconst run = await ctx.db.get(input.runId)\n\t\tif (!run) throw new Error('Approval request not found')\n\t\tassertCompatible(run.workflow.compatibilityKey, input.compatibilityKey)\n\t\tif (!run.workflowId) throw new Error('Approval workflow is not linked')\n\t\tif (!run.executionFailedStepKey)\n\t\t\tthrow new Error('Approval workflow has no failed step to restart')\n\t\t// SAFETY: this run stores the id returned by approvalWorkflow.start.\n\t\tawait approvalWorkflow.restart(ctx, run.workflowId as WorkflowId, {\n\t\t\tfrom: run.executionFailedStepKey,\n\t\t\tstartAsync: true,\n\t\t})\n\t\treturn null\n\t},\n})\n\nexport const status = query({\n\targs: { runId: v.id('approvalRuns'), compatibilityKey: v.string() },\n\treturns: v.union(v.null(), approvalStatusValidator()),\n\thandler: async (ctx, input) => {\n\t\tconst run = await ctx.db.get(input.runId)\n\t\tif (!run) return null\n\t\tassertCompatible(run.workflow.compatibilityKey, input.compatibilityKey)\n\t\t// SAFETY: workflowId is the id persisted from approvalWorkflow.start for this run.\n\t\tconst workflowStatus = run.workflowId\n\t\t\t? await approvalWorkflow.status(ctx, run.workflowId as WorkflowId)\n\t\t\t: null\n\t\tconst execution = normalizeWorkflowStatus(workflowStatus)\n\t\treturn { run, execution }\n\t},\n})\n\nexport const list = query({\n\targs: {\n\t\tscopeRef: zodToConvex(approvalReference),\n\t\tstate: v.optional(zodToConvex(approvalRunState)),\n\t\tpaginationOpts: paginationOptsValidator,\n\t},\n\treturns: paginationResultValidator(approvalRunValidator()),\n\thandler: (ctx, input) =>\n\t\tpaginator(ctx.db, schema)\n\t\t\t.query('approvalRuns')\n\t\t\t.withIndex('by_scopeRef_and_state', (query) =>\n\t\t\t\tinput.state === undefined\n\t\t\t\t\t? query.eq('scopeRef', input.scopeRef)\n\t\t\t\t\t: query.eq('scopeRef', input.scopeRef).eq('state', input.state),\n\t\t\t)\n\t\t\t.order('desc')\n\t\t\t.paginate(input.paginationOpts),\n})\n\nexport const getForWorkflow = internalQuery({\n\targs: { runId: v.id('approvalRuns') },\n\treturns: v.union(v.null(), approvalRunValidator()),\n\thandler: (ctx, input) => ctx.db.get(input.runId),\n})\n\nexport const recordExecutionTerminal = internalMutation({\n\targs: {\n\t\trunId: v.id('approvalRuns'),\n\t\toutcome: v.union(\n\t\t\tv.literal(APPROVAL_EXECUTION_STATES[1]),\n\t\t\tv.literal(APPROVAL_EXECUTION_STATES[3]),\n\t\t),\n\t\tfailedStepKey: v.optional(zodToConvex(approvalName)),\n\t},\n\treturns: v.null(),\n\thandler: async (ctx, input) => {\n\t\tconst run = await ctx.db.get(input.runId)\n\t\tif (!run) throw new Error('Approval request not found')\n\t\tawait ctx.db.patch(run._id, {\n\t\t\texecutionFailedStepKey: input.outcome === 'failed' ? input.failedStepKey : undefined,\n\t\t\tupdatedAt: Date.now(),\n\t\t})\n\t\tawait logApprovalTransition(ctx, {\n\t\t\taction: `approval.execution.${input.outcome}`,\n\t\t\trunId: run._id,\n\t\t\tresourceType: run.resourceType,\n\t\t\tresourceRef: run.resourceRef,\n\t\t\ttransition: `execution:${input.outcome}`,\n\t\t\tseverity: input.outcome === 'failed' ? 'error' : 'info',\n\t\t})\n\t\treturn null\n\t},\n})\n\nconst approvalWorkflow = new WorkflowManager(components.workflow)\n\nfunction normalizeWorkflowStatus(\n\tstatus: Awaited<ReturnType<typeof approvalWorkflow.status>> | null,\n) {\n\tif (!status) return null\n\tswitch (status.type) {\n\t\tcase 'failed':\n\t\t\treturn { type: 'failed' as const, error: status.error }\n\t\tcase 'inProgress':\n\t\tcase 'completed':\n\t\tcase 'canceled':\n\t\t\treturn { type: status.type }\n\t}\n}\n\nfunction approvalRunValidator() {\n\treturn v.object({\n\t\t_id: v.id('approvalRuns'),\n\t\t_creationTime: v.number(),\n\t\t...zodToConvex(approvalRunDocument).fields,\n\t})\n}\n\nfunction workflowStatusValidator() {\n\treturn v.union(\n\t\tv.object({ type: v.literal(APPROVAL_EXECUTION_STATES[0]) }),\n\t\tv.object({ type: v.literal(APPROVAL_EXECUTION_STATES[1]) }),\n\t\tv.object({ type: v.literal(APPROVAL_EXECUTION_STATES[2]) }),\n\t\tv.object({\n\t\t\ttype: v.literal(APPROVAL_EXECUTION_STATES[3]),\n\t\t\terror: v.string(),\n\t\t}),\n\t)\n}\n\nfunction approvalStatusValidator() {\n\treturn v.object({\n\t\trun: approvalRunValidator(),\n\t\texecution: v.union(v.null(), workflowStatusValidator()),\n\t})\n}\n\nfunction assertCompatible(actual: string, expected: string): void {\n\tif (actual !== expected)\n\t\tthrow new Error(\n\t\t\t`Approval workflow compatibility mismatch: expected ${expected}, received ${actual}`,\n\t\t)\n}\n"],"mappings":"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"}
|
|
@@ -2,36 +2,36 @@ import { z } from "zod";
|
|
|
2
2
|
declare namespace validators_d_exports {
|
|
3
3
|
export { ApprovalActor, ApprovalCallbackInput, ApprovalMetadata, ApprovalWorkflowDescriptor, approvalActionCallback, approvalActor, approvalBranchStep, approvalCallback, approvalCallbackArgs, approvalCallbackInput, approvalCallbackKind, approvalCallbackStep, approvalDecision, approvalDecisionDocument, approvalDecisionStep, approvalMetadata, approvalMutationCallback, approvalName, approvalNotifyStep, approvalQuorum, approvalQuorumKind, approvalReason, approvalReference, approvalRunDocument, approvalRunState, approvalStepKind, approvalWorkflowDescriptor, approvalWorkflowStep };
|
|
4
4
|
}
|
|
5
|
-
declare const approvalRunState: z.ZodEnum<{
|
|
5
|
+
export declare const approvalRunState: z.ZodEnum<{
|
|
6
6
|
approved: "approved";
|
|
7
7
|
canceled: "canceled";
|
|
8
8
|
expired: "expired";
|
|
9
9
|
pending: "pending";
|
|
10
10
|
rejected: "rejected";
|
|
11
11
|
}>;
|
|
12
|
-
declare const approvalDecision: z.ZodEnum<{
|
|
12
|
+
export declare const approvalDecision: z.ZodEnum<{
|
|
13
13
|
approved: "approved";
|
|
14
14
|
rejected: "rejected";
|
|
15
15
|
}>;
|
|
16
|
-
declare const approvalStepKind: z.ZodEnum<{
|
|
16
|
+
export declare const approvalStepKind: z.ZodEnum<{
|
|
17
17
|
action: "action";
|
|
18
18
|
branch: "branch";
|
|
19
19
|
decision: "decision";
|
|
20
20
|
mutation: "mutation";
|
|
21
21
|
notify: "notify";
|
|
22
22
|
}>;
|
|
23
|
-
declare const approvalCallbackKind: z.ZodEnum<{
|
|
23
|
+
export declare const approvalCallbackKind: z.ZodEnum<{
|
|
24
24
|
action: "action";
|
|
25
25
|
mutation: "mutation";
|
|
26
26
|
}>;
|
|
27
|
-
declare const approvalQuorumKind: z.ZodEnum<{
|
|
27
|
+
export declare const approvalQuorumKind: z.ZodEnum<{
|
|
28
28
|
count: "count";
|
|
29
29
|
}>;
|
|
30
|
-
declare const approvalReference: z.ZodString;
|
|
31
|
-
declare const approvalName: z.ZodString;
|
|
32
|
-
declare const approvalReason: z.ZodString;
|
|
33
|
-
declare const approvalMetadata: z.ZodRecord<z.ZodString, z.ZodString>;
|
|
34
|
-
declare const approvalCallbackInput: z.ZodObject<{
|
|
30
|
+
export declare const approvalReference: z.ZodString;
|
|
31
|
+
export declare const approvalName: z.ZodString;
|
|
32
|
+
export declare const approvalReason: z.ZodString;
|
|
33
|
+
export declare const approvalMetadata: z.ZodRecord<z.ZodString, z.ZodString>;
|
|
34
|
+
export declare const approvalCallbackInput: z.ZodObject<{
|
|
35
35
|
runId: z.ZodString;
|
|
36
36
|
scopeRef: z.ZodString;
|
|
37
37
|
resourceType: z.ZodString;
|
|
@@ -65,7 +65,7 @@ declare const approvalCallbackInput: z.ZodObject<{
|
|
|
65
65
|
}, z.core.$strict>>;
|
|
66
66
|
}, z.core.$strict>;
|
|
67
67
|
/** Convex argument validator for approval mutation, action, and notify callbacks. */
|
|
68
|
-
declare const approvalCallbackArgs: import("convex/values").VObject<{
|
|
68
|
+
export declare const approvalCallbackArgs: import("convex/values").VObject<{
|
|
69
69
|
runId: string;
|
|
70
70
|
scopeRef: string;
|
|
71
71
|
resourceType: string;
|
|
@@ -147,22 +147,22 @@ declare const approvalCallbackArgs: import("convex/values").VObject<{
|
|
|
147
147
|
}, "optional", "actorRef" | "decidedAt" | "decision" | "reason">;
|
|
148
148
|
}, "optional", "evidence" | "outcome" | "stepKey" | "terminalEvidence" | "terminalEvidence.actorRef" | "terminalEvidence.decidedAt" | "terminalEvidence.decision" | "terminalEvidence.reason">;
|
|
149
149
|
}, "required", "decision" | "decision.evidence" | "decision.outcome" | "decision.stepKey" | "decision.terminalEvidence" | "decision.terminalEvidence.actorRef" | "decision.terminalEvidence.decidedAt" | "decision.terminalEvidence.decision" | "decision.terminalEvidence.reason" | "metadata" | "resourceRef" | "resourceType" | "runId" | "scopeRef" | `metadata.${string}`>;
|
|
150
|
-
declare const approvalActor: z.ZodObject<{
|
|
150
|
+
export declare const approvalActor: z.ZodObject<{
|
|
151
151
|
actorRef: z.ZodString;
|
|
152
152
|
capabilities: z.ZodArray<z.ZodString>;
|
|
153
153
|
metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
154
154
|
}, z.core.$strict>;
|
|
155
|
-
declare const approvalMutationCallback: z.ZodObject<{
|
|
155
|
+
export declare const approvalMutationCallback: z.ZodObject<{
|
|
156
156
|
kind: z.ZodLiteral<"mutation">;
|
|
157
157
|
handle: z.ZodString;
|
|
158
158
|
retry: z.ZodBoolean;
|
|
159
159
|
}, z.core.$strict>;
|
|
160
|
-
declare const approvalActionCallback: z.ZodObject<{
|
|
160
|
+
export declare const approvalActionCallback: z.ZodObject<{
|
|
161
161
|
kind: z.ZodLiteral<"action">;
|
|
162
162
|
handle: z.ZodString;
|
|
163
163
|
retry: z.ZodBoolean;
|
|
164
164
|
}, z.core.$strict>;
|
|
165
|
-
declare const approvalCallback: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
165
|
+
export declare const approvalCallback: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
166
166
|
kind: z.ZodLiteral<"mutation">;
|
|
167
167
|
handle: z.ZodString;
|
|
168
168
|
retry: z.ZodBoolean;
|
|
@@ -171,13 +171,13 @@ declare const approvalCallback: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
|
171
171
|
handle: z.ZodString;
|
|
172
172
|
retry: z.ZodBoolean;
|
|
173
173
|
}, z.core.$strict>], "kind">;
|
|
174
|
-
declare const approvalQuorum: z.ZodObject<{
|
|
174
|
+
export declare const approvalQuorum: z.ZodObject<{
|
|
175
175
|
kind: z.ZodEnum<{
|
|
176
176
|
count: "count";
|
|
177
177
|
}>;
|
|
178
178
|
approvals: z.ZodNumber;
|
|
179
179
|
}, z.core.$strict>;
|
|
180
|
-
declare const approvalCallbackStep: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
180
|
+
export declare const approvalCallbackStep: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
181
181
|
kind: z.ZodLiteral<"mutation">;
|
|
182
182
|
key: z.ZodString;
|
|
183
183
|
callback: z.ZodObject<{
|
|
@@ -194,7 +194,7 @@ declare const approvalCallbackStep: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
|
194
194
|
retry: z.ZodBoolean;
|
|
195
195
|
}, z.core.$strict>;
|
|
196
196
|
}, z.core.$strict>], "kind">;
|
|
197
|
-
declare const approvalNotifyStep: z.ZodObject<{
|
|
197
|
+
export declare const approvalNotifyStep: z.ZodObject<{
|
|
198
198
|
kind: z.ZodLiteral<"notify">;
|
|
199
199
|
key: z.ZodString;
|
|
200
200
|
callback: z.ZodObject<{
|
|
@@ -203,7 +203,7 @@ declare const approvalNotifyStep: z.ZodObject<{
|
|
|
203
203
|
retry: z.ZodBoolean;
|
|
204
204
|
}, z.core.$strict>;
|
|
205
205
|
}, z.core.$strict>;
|
|
206
|
-
declare const approvalDecisionStep: z.ZodObject<{
|
|
206
|
+
export declare const approvalDecisionStep: z.ZodObject<{
|
|
207
207
|
kind: z.ZodLiteral<"decision">;
|
|
208
208
|
key: z.ZodString;
|
|
209
209
|
decisions: z.ZodArray<z.ZodEnum<{
|
|
@@ -219,13 +219,13 @@ declare const approvalDecisionStep: z.ZodObject<{
|
|
|
219
219
|
makerChecker: z.ZodBoolean;
|
|
220
220
|
expiresAfterMs: z.ZodOptional<z.ZodNumber>;
|
|
221
221
|
}, z.core.$strict>;
|
|
222
|
-
declare const approvalBranchStep: z.ZodObject<{
|
|
222
|
+
export declare const approvalBranchStep: z.ZodObject<{
|
|
223
223
|
kind: z.ZodLiteral<"branch">;
|
|
224
224
|
key: z.ZodString;
|
|
225
225
|
approvedStepKey: z.ZodString;
|
|
226
226
|
rejectedStepKey: z.ZodString;
|
|
227
227
|
}, z.core.$strict>;
|
|
228
|
-
declare const approvalWorkflowStep: z.ZodDiscriminatedUnion<[z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
228
|
+
export declare const approvalWorkflowStep: z.ZodDiscriminatedUnion<[z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
229
229
|
kind: z.ZodLiteral<"mutation">;
|
|
230
230
|
key: z.ZodString;
|
|
231
231
|
callback: z.ZodObject<{
|
|
@@ -270,7 +270,7 @@ declare const approvalWorkflowStep: z.ZodDiscriminatedUnion<[z.ZodDiscriminatedU
|
|
|
270
270
|
approvedStepKey: z.ZodString;
|
|
271
271
|
rejectedStepKey: z.ZodString;
|
|
272
272
|
}, z.core.$strict>], "kind">;
|
|
273
|
-
declare const approvalWorkflowDescriptor: z.ZodObject<{
|
|
273
|
+
export declare const approvalWorkflowDescriptor: z.ZodObject<{
|
|
274
274
|
schemaVersion: z.ZodLiteral<1>;
|
|
275
275
|
compatibilityKey: z.ZodString;
|
|
276
276
|
name: z.ZodString;
|
|
@@ -320,7 +320,7 @@ declare const approvalWorkflowDescriptor: z.ZodObject<{
|
|
|
320
320
|
rejectedStepKey: z.ZodString;
|
|
321
321
|
}, z.core.$strict>], "kind">>;
|
|
322
322
|
}, z.core.$strict>;
|
|
323
|
-
declare const approvalRunDocument: z.ZodObject<{
|
|
323
|
+
export declare const approvalRunDocument: z.ZodObject<{
|
|
324
324
|
scopeRef: z.ZodString;
|
|
325
325
|
resourceType: z.ZodString;
|
|
326
326
|
resourceRef: z.ZodString;
|
|
@@ -395,7 +395,7 @@ declare const approvalRunDocument: z.ZodObject<{
|
|
|
395
395
|
updatedAt: z.ZodNumber;
|
|
396
396
|
terminalAt: z.ZodOptional<z.ZodNumber>;
|
|
397
397
|
}, z.core.$strict>;
|
|
398
|
-
declare const approvalDecisionDocument: z.ZodObject<{
|
|
398
|
+
export declare const approvalDecisionDocument: z.ZodObject<{
|
|
399
399
|
runId: import("convex-helpers/server/zod4").Zid<"approvalRuns">;
|
|
400
400
|
stepKey: z.ZodString;
|
|
401
401
|
actor: z.ZodObject<{
|
|
@@ -410,10 +410,10 @@ declare const approvalDecisionDocument: z.ZodObject<{
|
|
|
410
410
|
reason: z.ZodOptional<z.ZodString>;
|
|
411
411
|
decidedAt: z.ZodNumber;
|
|
412
412
|
}, z.core.$strict>;
|
|
413
|
-
type ApprovalWorkflowDescriptor = z.infer<typeof approvalWorkflowDescriptor>;
|
|
414
|
-
type ApprovalActor = z.infer<typeof approvalActor>;
|
|
415
|
-
type ApprovalMetadata = z.infer<typeof approvalMetadata>;
|
|
416
|
-
type ApprovalCallbackInput = Readonly<z.infer<typeof approvalCallbackInput>>;
|
|
413
|
+
export type ApprovalWorkflowDescriptor = z.infer<typeof approvalWorkflowDescriptor>;
|
|
414
|
+
export type ApprovalActor = z.infer<typeof approvalActor>;
|
|
415
|
+
export type ApprovalMetadata = z.infer<typeof approvalMetadata>;
|
|
416
|
+
export type ApprovalCallbackInput = Readonly<z.infer<typeof approvalCallbackInput>>;
|
|
417
417
|
//#endregion
|
|
418
|
-
export {
|
|
418
|
+
export { validators_d_exports };
|
|
419
419
|
//# sourceMappingURL=validators.d.mts.map
|