@ddse/acm-examples 0.5.0

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.
Files changed (182) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +113 -0
  3. package/bin/acm-demo.ts +495 -0
  4. package/data/coaching/agents.json +16 -0
  5. package/data/coaching/transcripts.json +37 -0
  6. package/data/documents.json +72 -0
  7. package/data/entitlement/customers.json +38 -0
  8. package/data/entitlement/policies.json +38 -0
  9. package/data/incidents/incidents.json +30 -0
  10. package/data/incidents/routing_rules.json +36 -0
  11. package/data/invoices/invoices.json +38 -0
  12. package/data/invoices/purchase-orders.json +38 -0
  13. package/data/issues.json +99 -0
  14. package/data/knowledge/docs/kb-001.md +7 -0
  15. package/data/knowledge/docs/kb-002.md +7 -0
  16. package/data/knowledge/docs/kb-003.md +9 -0
  17. package/data/knowledge/index.json +25 -0
  18. package/data/orders.json +106 -0
  19. package/dist/bin/acm-demo.d.ts +3 -0
  20. package/dist/bin/acm-demo.d.ts.map +1 -0
  21. package/dist/bin/acm-demo.js +392 -0
  22. package/dist/bin/acm-demo.js.map +1 -0
  23. package/dist/src/context/directives.d.ts +3 -0
  24. package/dist/src/context/directives.d.ts.map +1 -0
  25. package/dist/src/context/directives.js +325 -0
  26. package/dist/src/context/directives.js.map +1 -0
  27. package/dist/src/context/index.d.ts +2 -0
  28. package/dist/src/context/index.d.ts.map +1 -0
  29. package/dist/src/context/index.js +2 -0
  30. package/dist/src/context/index.js.map +1 -0
  31. package/dist/src/data/coaching.d.ts +19 -0
  32. package/dist/src/data/coaching.d.ts.map +1 -0
  33. package/dist/src/data/coaching.js +22 -0
  34. package/dist/src/data/coaching.js.map +1 -0
  35. package/dist/src/data/entitlement.d.ts +25 -0
  36. package/dist/src/data/entitlement.d.ts.map +1 -0
  37. package/dist/src/data/entitlement.js +26 -0
  38. package/dist/src/data/entitlement.js.map +1 -0
  39. package/dist/src/data/incidents.d.ts +23 -0
  40. package/dist/src/data/incidents.d.ts.map +1 -0
  41. package/dist/src/data/incidents.js +37 -0
  42. package/dist/src/data/incidents.js.map +1 -0
  43. package/dist/src/data/invoices.d.ts +34 -0
  44. package/dist/src/data/invoices.d.ts.map +1 -0
  45. package/dist/src/data/invoices.js +49 -0
  46. package/dist/src/data/invoices.js.map +1 -0
  47. package/dist/src/data/knowledge.d.ts +11 -0
  48. package/dist/src/data/knowledge.d.ts.map +1 -0
  49. package/dist/src/data/knowledge.js +57 -0
  50. package/dist/src/data/knowledge.js.map +1 -0
  51. package/dist/src/data/loader.d.ts +4 -0
  52. package/dist/src/data/loader.d.ts.map +1 -0
  53. package/dist/src/data/loader.js +69 -0
  54. package/dist/src/data/loader.js.map +1 -0
  55. package/dist/src/examples/scenarios.d.ts +23 -0
  56. package/dist/src/examples/scenarios.d.ts.map +1 -0
  57. package/dist/src/examples/scenarios.js +609 -0
  58. package/dist/src/examples/scenarios.js.map +1 -0
  59. package/dist/src/goals/index.d.ts +8 -0
  60. package/dist/src/goals/index.d.ts.map +1 -0
  61. package/dist/src/goals/index.js +12 -0
  62. package/dist/src/goals/index.js.map +1 -0
  63. package/dist/src/policy.d.ts +5 -0
  64. package/dist/src/policy.d.ts.map +1 -0
  65. package/dist/src/policy.js +24 -0
  66. package/dist/src/policy.js.map +1 -0
  67. package/dist/src/registries.d.ts +18 -0
  68. package/dist/src/registries.d.ts.map +1 -0
  69. package/dist/src/registries.js +38 -0
  70. package/dist/src/registries.js.map +1 -0
  71. package/dist/src/renderer.d.ts +9 -0
  72. package/dist/src/renderer.d.ts.map +1 -0
  73. package/dist/src/renderer.js +76 -0
  74. package/dist/src/renderer.js.map +1 -0
  75. package/dist/src/search/bm25.d.ts +68 -0
  76. package/dist/src/search/bm25.d.ts.map +1 -0
  77. package/dist/src/search/bm25.js +131 -0
  78. package/dist/src/search/bm25.js.map +1 -0
  79. package/dist/src/search/index.d.ts +2 -0
  80. package/dist/src/search/index.d.ts.map +1 -0
  81. package/dist/src/search/index.js +3 -0
  82. package/dist/src/search/index.js.map +1 -0
  83. package/dist/src/tasks/coaching.d.ts +30 -0
  84. package/dist/src/tasks/coaching.d.ts.map +1 -0
  85. package/dist/src/tasks/coaching.js +143 -0
  86. package/dist/src/tasks/coaching.js.map +1 -0
  87. package/dist/src/tasks/entitlement.d.ts +29 -0
  88. package/dist/src/tasks/entitlement.d.ts.map +1 -0
  89. package/dist/src/tasks/entitlement.js +135 -0
  90. package/dist/src/tasks/entitlement.js.map +1 -0
  91. package/dist/src/tasks/incidents.d.ts +42 -0
  92. package/dist/src/tasks/incidents.d.ts.map +1 -0
  93. package/dist/src/tasks/incidents.js +189 -0
  94. package/dist/src/tasks/incidents.js.map +1 -0
  95. package/dist/src/tasks/index.d.ts +7 -0
  96. package/dist/src/tasks/index.d.ts.map +1 -0
  97. package/dist/src/tasks/index.js +7 -0
  98. package/dist/src/tasks/index.js.map +1 -0
  99. package/dist/src/tasks/invoices.d.ts +40 -0
  100. package/dist/src/tasks/invoices.d.ts.map +1 -0
  101. package/dist/src/tasks/invoices.js +180 -0
  102. package/dist/src/tasks/invoices.js.map +1 -0
  103. package/dist/src/tasks/knowledge.d.ts +23 -0
  104. package/dist/src/tasks/knowledge.d.ts.map +1 -0
  105. package/dist/src/tasks/knowledge.js +115 -0
  106. package/dist/src/tasks/knowledge.js.map +1 -0
  107. package/dist/src/tasks/legacy.d.ts +50 -0
  108. package/dist/src/tasks/legacy.d.ts.map +1 -0
  109. package/dist/src/tasks/legacy.js +85 -0
  110. package/dist/src/tasks/legacy.js.map +1 -0
  111. package/dist/src/tools/coaching/index.d.ts +49 -0
  112. package/dist/src/tools/coaching/index.d.ts.map +1 -0
  113. package/dist/src/tools/coaching/index.js +119 -0
  114. package/dist/src/tools/coaching/index.js.map +1 -0
  115. package/dist/src/tools/entitlement/index.d.ts +52 -0
  116. package/dist/src/tools/entitlement/index.d.ts.map +1 -0
  117. package/dist/src/tools/entitlement/index.js +120 -0
  118. package/dist/src/tools/entitlement/index.js.map +1 -0
  119. package/dist/src/tools/incidents/index.d.ts +55 -0
  120. package/dist/src/tools/incidents/index.d.ts.map +1 -0
  121. package/dist/src/tools/incidents/index.js +109 -0
  122. package/dist/src/tools/incidents/index.js.map +1 -0
  123. package/dist/src/tools/index.d.ts +90 -0
  124. package/dist/src/tools/index.d.ts.map +1 -0
  125. package/dist/src/tools/index.js +109 -0
  126. package/dist/src/tools/index.js.map +1 -0
  127. package/dist/src/tools/invoices/index.d.ts +56 -0
  128. package/dist/src/tools/invoices/index.d.ts.map +1 -0
  129. package/dist/src/tools/invoices/index.js +85 -0
  130. package/dist/src/tools/invoices/index.js.map +1 -0
  131. package/dist/src/tools/knowledge/index.d.ts +52 -0
  132. package/dist/src/tools/knowledge/index.d.ts.map +1 -0
  133. package/dist/src/tools/knowledge/index.js +120 -0
  134. package/dist/src/tools/knowledge/index.js.map +1 -0
  135. package/dist/tests/bm25.test.d.ts +2 -0
  136. package/dist/tests/bm25.test.d.ts.map +1 -0
  137. package/dist/tests/bm25.test.js +98 -0
  138. package/dist/tests/bm25.test.js.map +1 -0
  139. package/dist/tests/integration.test.d.ts +2 -0
  140. package/dist/tests/integration.test.d.ts.map +1 -0
  141. package/dist/tests/integration.test.js +126 -0
  142. package/dist/tests/integration.test.js.map +1 -0
  143. package/dist/tests/plan-hydration.test.d.ts +2 -0
  144. package/dist/tests/plan-hydration.test.d.ts.map +1 -0
  145. package/dist/tests/plan-hydration.test.js +28 -0
  146. package/dist/tests/plan-hydration.test.js.map +1 -0
  147. package/dist/tsconfig.tsbuildinfo +1 -0
  148. package/docs/examples-architecture.md +144 -0
  149. package/docs/successrun.md +1022 -0
  150. package/package.json +33 -0
  151. package/src/context/directives.ts +366 -0
  152. package/src/context/index.ts +1 -0
  153. package/src/data/coaching.ts +50 -0
  154. package/src/data/entitlement.ts +60 -0
  155. package/src/data/incidents.ts +78 -0
  156. package/src/data/invoices.ts +103 -0
  157. package/src/data/knowledge.ts +77 -0
  158. package/src/data/loader.ts +80 -0
  159. package/src/examples/scenarios.ts +724 -0
  160. package/src/goals/index.ts +18 -0
  161. package/src/policy.ts +30 -0
  162. package/src/registries.ts +48 -0
  163. package/src/renderer.ts +82 -0
  164. package/src/search/bm25.ts +173 -0
  165. package/src/search/index.ts +2 -0
  166. package/src/tasks/coaching.ts +217 -0
  167. package/src/tasks/entitlement.ts +197 -0
  168. package/src/tasks/incidents.ts +277 -0
  169. package/src/tasks/index.ts +6 -0
  170. package/src/tasks/invoices.ts +269 -0
  171. package/src/tasks/knowledge.ts +169 -0
  172. package/src/tasks/legacy.ts +112 -0
  173. package/src/tools/coaching/index.ts +197 -0
  174. package/src/tools/entitlement/index.ts +199 -0
  175. package/src/tools/incidents/index.ts +185 -0
  176. package/src/tools/index.ts +192 -0
  177. package/src/tools/invoices/index.ts +165 -0
  178. package/src/tools/knowledge/index.ts +203 -0
  179. package/tests/bm25.test.ts +129 -0
  180. package/tests/integration.test.ts +163 -0
  181. package/tests/plan-hydration.test.ts +33 -0
  182. package/tsconfig.json +18 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entitlement.d.ts","sourceRoot":"","sources":["../../../src/tasks/entitlement.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,KAAK,UAAU,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EACL,KAAK,yBAAyB,EAC9B,KAAK,0BAA0B,EAC/B,KAAK,wBAAwB,EAC7B,KAAK,yBAAyB,EAC9B,KAAK,qBAAqB,IAAI,gCAAgC,EAC9D,KAAK,sBAAsB,IAAI,iCAAiC,EACjE,MAAM,+BAA+B,CAAC;AAEvC,qBAAa,2BAA4B,SAAQ,IAAI,CACnD,yBAAyB,EACzB,0BAA0B,CAC3B;;IAKC,OAAO,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,yBAAyB,GAAG,MAAM,GAAG,SAAS;IAI/E,WAAW,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,yBAAyB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAOxF,YAAY,IAAI,MAAM,EAAE;IAIlB,OAAO,CACX,GAAG,EAAE,UAAU,EACf,KAAK,EAAE,yBAAyB,GAC/B,OAAO,CAAC,0BAA0B,CAAC;CAcvC;AAED,MAAM,WAAW,4BAA6B,SAAQ,wBAAwB;IAC5E,QAAQ,CAAC,EAAE,eAAe,CAAC;CAC5B;AAED,qBAAa,uBAAwB,SAAQ,IAAI,CAC/C,4BAA4B,EAC5B,yBAAyB,CAC1B;;IAKC,WAAW,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,4BAA4B,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAQ3F,YAAY,IAAI,MAAM,EAAE;IAQlB,OAAO,CACX,GAAG,EAAE,UAAU,EACf,KAAK,EAAE,4BAA4B,GAClC,OAAO,CAAC,yBAAyB,CAAC;CAiBtC;AAED,MAAM,MAAM,+BAA+B,GAAG,gCAAgC,GAAG;IAC/E,QAAQ,EAAE,OAAO,GAAG,MAAM,CAAC;CAC5B,CAAC;AAEF,qBAAa,0BAA2B,SAAQ,IAAI,CAClD,+BAA+B,EAC/B,iCAAiC,CAClC;;IAKC,WAAW,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,+BAA+B,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAS9F,YAAY,IAAI,MAAM,EAAE;IAIlB,OAAO,CACX,GAAG,EAAE,UAAU,EACf,KAAK,EAAE,+BAA+B,GACrC,OAAO,CAAC,iCAAiC,CAAC;CAiE9C"}
@@ -0,0 +1,135 @@
1
+ import { Task } from '@ddse/acm-sdk';
2
+ export class RetrieveCustomerProfileTask extends Task {
3
+ constructor() {
4
+ super('task-entitlement-fetch-customer', 'entitlement.fetch_customer_profile');
5
+ }
6
+ idemKey(_ctx, input) {
7
+ return input?.customerId ? `entitlement:customer:${input.customerId}` : undefined;
8
+ }
9
+ policyInput(_ctx, input) {
10
+ return {
11
+ action: 'fetch_customer_profile',
12
+ customerId: input.customerId,
13
+ };
14
+ }
15
+ verification() {
16
+ return ['output.customer !== undefined'];
17
+ }
18
+ async execute(ctx, input) {
19
+ const tool = ctx.getTool('fetch_customer_profile');
20
+ if (!tool) {
21
+ throw new Error('fetch_customer_profile tool is not registered');
22
+ }
23
+ const result = (await tool.call(input));
24
+ ctx.stream?.emit('task', {
25
+ taskId: this.id,
26
+ stage: 'customer_profile_loaded',
27
+ customerId: input.customerId,
28
+ });
29
+ return result;
30
+ }
31
+ }
32
+ export class EvaluateEntitlementTask extends Task {
33
+ constructor() {
34
+ super('task-entitlement-evaluate', 'entitlement.evaluate');
35
+ }
36
+ policyInput(_ctx, input) {
37
+ return {
38
+ action: 'evaluate_entitlement',
39
+ customerId: input.customerId,
40
+ benefitCode: input.benefitCode,
41
+ };
42
+ }
43
+ verification() {
44
+ return [
45
+ "output.decision === 'allow' || output.decision === 'deny'",
46
+ 'output.policy !== undefined',
47
+ 'Array.isArray(output.rationale)',
48
+ ];
49
+ }
50
+ async execute(ctx, input) {
51
+ const tool = ctx.getTool('evaluate_entitlement');
52
+ if (!tool) {
53
+ throw new Error('evaluate_entitlement tool is not registered');
54
+ }
55
+ const result = (await tool.call(input));
56
+ ctx.stream?.emit('task', {
57
+ taskId: this.id,
58
+ stage: 'entitlement_evaluated',
59
+ customerId: input.customerId,
60
+ benefitCode: input.benefitCode,
61
+ decision: result.decision,
62
+ violations: result.violations,
63
+ });
64
+ return result;
65
+ }
66
+ }
67
+ export class SupervisorNotificationTask extends Task {
68
+ constructor() {
69
+ super('task-entitlement-notify-supervisor', 'entitlement.notify_supervisor');
70
+ }
71
+ policyInput(_ctx, input) {
72
+ return {
73
+ action: 'notify_supervisor',
74
+ customerId: input.customerId,
75
+ channel: input.channel ?? 'email',
76
+ decision: input.decision,
77
+ };
78
+ }
79
+ verification() {
80
+ return ['output.notified === true', 'typeof output.messageId === "string"'];
81
+ }
82
+ async execute(ctx, input) {
83
+ const tool = ctx.getTool('notify_supervisor');
84
+ if (!tool) {
85
+ throw new Error('notify_supervisor tool is not registered');
86
+ }
87
+ const normalizedInput = {
88
+ ...input,
89
+ };
90
+ const evaluationOutput = ctx.outputs?.['task-entitlement-evaluate'] ?? {};
91
+ const customerProfile = ctx.outputs?.['task-entitlement-fetch-customer']?.customer ?? {};
92
+ const normalizeString = (value) => {
93
+ if (typeof value !== 'string') {
94
+ return undefined;
95
+ }
96
+ const trimmed = value.trim();
97
+ return trimmed.length > 0 ? trimmed : undefined;
98
+ };
99
+ const customerId = normalizeString(normalizedInput.customerId) ??
100
+ normalizeString(evaluationOutput?.customer?.id) ??
101
+ normalizeString(customerProfile?.id) ??
102
+ normalizeString(ctx.context?.facts?.customerId);
103
+ if (customerId) {
104
+ normalizedInput.customerId = customerId.toUpperCase();
105
+ }
106
+ const benefitCode = normalizeString(evaluationOutput?.policy?.benefitCode) ??
107
+ normalizeString(ctx.context?.facts?.benefitCode);
108
+ const benefitCodeUpper = benefitCode ? benefitCode.toUpperCase() : undefined;
109
+ if (!normalizeString(normalizedInput.channel)) {
110
+ normalizedInput.channel = 'email';
111
+ }
112
+ const decision = normalizeString(normalizedInput.decision)?.toLowerCase() ??
113
+ evaluationOutput?.decision ??
114
+ 'allow';
115
+ normalizedInput.decision = decision;
116
+ if (!normalizeString(normalizedInput.message)) {
117
+ const customerName = normalizeString(customerProfile?.name) ??
118
+ normalizeString(evaluationOutput?.customer?.name) ??
119
+ 'customer';
120
+ const renderedBenefit = benefitCodeUpper ?? 'benefit';
121
+ const renderedCustomer = normalizedInput.customerId ?? 'UNKNOWN-ID';
122
+ normalizedInput.message = `Entitlement decision ${decision} for ${customerName} (${renderedCustomer}) regarding ${renderedBenefit}.`;
123
+ }
124
+ const result = (await tool.call(normalizedInput));
125
+ ctx.stream?.emit('task', {
126
+ taskId: this.id,
127
+ stage: 'supervisor_notified',
128
+ customerId: normalizedInput.customerId,
129
+ decision: normalizedInput.decision,
130
+ channel: result.channel,
131
+ });
132
+ return result;
133
+ }
134
+ }
135
+ //# sourceMappingURL=entitlement.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entitlement.js","sourceRoot":"","sources":["../../../src/tasks/entitlement.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAmB,MAAM,eAAe,CAAC;AAWtD,MAAM,OAAO,2BAA4B,SAAQ,IAGhD;IACC;QACE,KAAK,CAAC,iCAAiC,EAAE,oCAAoC,CAAC,CAAC;IACjF,CAAC;IAED,OAAO,CAAC,IAAgB,EAAE,KAAgC;QACxD,OAAO,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,wBAAwB,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IACpF,CAAC;IAED,WAAW,CAAC,IAAgB,EAAE,KAAgC;QAC5D,OAAO;YACL,MAAM,EAAE,wBAAwB;YAChC,UAAU,EAAE,KAAK,CAAC,UAAU;SAC7B,CAAC;IACJ,CAAC;IAED,YAAY;QACV,OAAO,CAAC,+BAA+B,CAAC,CAAC;IAC3C,CAAC;IAED,KAAK,CAAC,OAAO,CACX,GAAe,EACf,KAAgC;QAEhC,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAC;QACnD,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;QACnE,CAAC;QAED,MAAM,MAAM,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAA+B,CAAC;QACtE,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE;YACvB,MAAM,EAAE,IAAI,CAAC,EAAE;YACf,KAAK,EAAE,yBAAyB;YAChC,UAAU,EAAE,KAAK,CAAC,UAAU;SAC7B,CAAC,CAAC;QACH,OAAO,MAAM,CAAC;IAChB,CAAC;CACF;AAMD,MAAM,OAAO,uBAAwB,SAAQ,IAG5C;IACC;QACE,KAAK,CAAC,2BAA2B,EAAE,sBAAsB,CAAC,CAAC;IAC7D,CAAC;IAED,WAAW,CAAC,IAAgB,EAAE,KAAmC;QAC/D,OAAO;YACL,MAAM,EAAE,sBAAsB;YAC9B,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,WAAW,EAAE,KAAK,CAAC,WAAW;SAC/B,CAAC;IACJ,CAAC;IAED,YAAY;QACV,OAAO;YACL,2DAA2D;YAC3D,6BAA6B;YAC7B,iCAAiC;SAClC,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,OAAO,CACX,GAAe,EACf,KAAmC;QAEnC,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;QACjD,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;QACjE,CAAC;QAED,MAAM,MAAM,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAA8B,CAAC;QACrE,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE;YACvB,MAAM,EAAE,IAAI,CAAC,EAAE;YACf,KAAK,EAAE,uBAAuB;YAC9B,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,UAAU,EAAE,MAAM,CAAC,UAAU;SAC9B,CAAC,CAAC;QACH,OAAO,MAAM,CAAC;IAChB,CAAC;CACF;AAMD,MAAM,OAAO,0BAA2B,SAAQ,IAG/C;IACC;QACE,KAAK,CAAC,oCAAoC,EAAE,+BAA+B,CAAC,CAAC;IAC/E,CAAC;IAED,WAAW,CAAC,IAAgB,EAAE,KAAsC;QAClE,OAAO;YACL,MAAM,EAAE,mBAAmB;YAC3B,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,OAAO;YACjC,QAAQ,EAAE,KAAK,CAAC,QAAQ;SACzB,CAAC;IACJ,CAAC;IAED,YAAY;QACV,OAAO,CAAC,0BAA0B,EAAE,sCAAsC,CAAC,CAAC;IAC9E,CAAC;IAED,KAAK,CAAC,OAAO,CACX,GAAe,EACf,KAAsC;QAEtC,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;QAC9C,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;QAC9D,CAAC;QAED,MAAM,eAAe,GAAoC;YACvD,GAAG,KAAK;SACT,CAAC;QAEF,MAAM,gBAAgB,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC,2BAA2B,CAAC,IAAI,EAAE,CAAC;QAC1E,MAAM,eAAe,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC,iCAAiC,CAAC,EAAE,QAAQ,IAAI,EAAE,CAAC;QAEzF,MAAM,eAAe,GAAG,CAAC,KAAc,EAAsB,EAAE;YAC7D,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;gBAC9B,OAAO,SAAS,CAAC;YACnB,CAAC;YACD,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;YAC7B,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;QAClD,CAAC,CAAC;QAEF,MAAM,UAAU,GACd,eAAe,CAAC,eAAe,CAAC,UAAU,CAAC;YAC3C,eAAe,CAAC,gBAAgB,EAAE,QAAQ,EAAE,EAAE,CAAC;YAC/C,eAAe,CAAC,eAAe,EAAE,EAAE,CAAC;YACpC,eAAe,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;QAClD,IAAI,UAAU,EAAE,CAAC;YACf,eAAe,CAAC,UAAU,GAAG,UAAU,CAAC,WAAW,EAAE,CAAC;QACxD,CAAC;QAED,MAAM,WAAW,GACf,eAAe,CAAC,gBAAgB,EAAE,MAAM,EAAE,WAAW,CAAC;YACtD,eAAe,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC;QACnD,MAAM,gBAAgB,GAAG,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;QAE7E,IAAI,CAAC,eAAe,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC;YAC9C,eAAe,CAAC,OAAO,GAAG,OAAO,CAAC;QACpC,CAAC;QAED,MAAM,QAAQ,GACX,eAAe,CAAC,eAAe,CAAC,QAAQ,CAAC,EAAE,WAAW,EAAmC;YAC1F,gBAAgB,EAAE,QAAQ;YAC1B,OAAO,CAAC;QACV,eAAe,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAEpC,IAAI,CAAC,eAAe,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC;YAC9C,MAAM,YAAY,GAChB,eAAe,CAAC,eAAe,EAAE,IAAI,CAAC;gBACtC,eAAe,CAAC,gBAAgB,EAAE,QAAQ,EAAE,IAAI,CAAC;gBACjD,UAAU,CAAC;YACjB,MAAM,eAAe,GAAG,gBAAgB,IAAI,SAAS,CAAC;YAClD,MAAM,gBAAgB,GAAG,eAAe,CAAC,UAAU,IAAI,YAAY,CAAC;YACpE,eAAe,CAAC,OAAO,GAAG,wBAAwB,QAAQ,QAAQ,YAAY,KAAK,gBAAgB,eAAe,eAAe,GAAG,CAAC;QACvI,CAAC;QAED,MAAM,MAAM,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,CAAsC,CAAC;QACvF,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE;YACvB,MAAM,EAAE,IAAI,CAAC,EAAE;YACf,KAAK,EAAE,qBAAqB;YAC5B,UAAU,EAAE,eAAe,CAAC,UAAU;YACtC,QAAQ,EAAE,eAAe,CAAC,QAAQ;YAClC,OAAO,EAAE,MAAM,CAAC,OAAO;SACxB,CAAC,CAAC;QACH,OAAO,MAAM,CAAC;IAChB,CAAC;CACF"}
@@ -0,0 +1,42 @@
1
+ import { Task, type RunContext } from '@ddse/acm-sdk';
2
+ import type { IncidentRecord, IncidentSeverity } from '../data/incidents.js';
3
+ import { type FetchIncidentInput, type FetchIncidentOutput, type ClassifySeverityOutput, type SelectQueueOutput, type EscalateIncidentInput, type EscalateIncidentOutput } from '../tools/incidents/index.js';
4
+ export declare class FetchIncidentTask extends Task<FetchIncidentInput, FetchIncidentOutput> {
5
+ constructor();
6
+ idemKey(_ctx: RunContext, input: FetchIncidentInput): string | undefined;
7
+ policyInput(_ctx: RunContext, input: FetchIncidentInput): Record<string, unknown>;
8
+ verification(): string[];
9
+ execute(ctx: RunContext, input: FetchIncidentInput): Promise<FetchIncidentOutput>;
10
+ }
11
+ export interface ClassifySeverityTaskInput {
12
+ incident?: IncidentRecord;
13
+ incidentId?: string;
14
+ }
15
+ export declare class ClassifySeverityTask extends Task<ClassifySeverityTaskInput, ClassifySeverityOutput> {
16
+ constructor();
17
+ policyInput(_ctx: RunContext, input: ClassifySeverityTaskInput): Record<string, unknown>;
18
+ verification(): string[];
19
+ execute(ctx: RunContext, input: ClassifySeverityTaskInput): Promise<ClassifySeverityOutput>;
20
+ private resolveIncident;
21
+ }
22
+ export interface SelectQueueTaskInput {
23
+ incident?: IncidentRecord;
24
+ incidentId?: string;
25
+ severityOverride?: IncidentSeverity;
26
+ }
27
+ export declare class SelectQueueTask extends Task<SelectQueueTaskInput, SelectQueueOutput> {
28
+ constructor();
29
+ policyInput(_ctx: RunContext, input: SelectQueueTaskInput): Record<string, unknown>;
30
+ verification(): string[];
31
+ execute(ctx: RunContext, input: SelectQueueTaskInput): Promise<SelectQueueOutput>;
32
+ private resolveIncident;
33
+ private resolveSeverityOverride;
34
+ }
35
+ export declare class EscalateIncidentTask extends Task<EscalateIncidentInput, EscalateIncidentOutput> {
36
+ constructor();
37
+ policyInput(_ctx: RunContext, input: EscalateIncidentInput): Record<string, unknown>;
38
+ verification(): string[];
39
+ execute(ctx: RunContext, input: EscalateIncidentInput): Promise<EscalateIncidentOutput>;
40
+ private resolveEscalationInput;
41
+ }
42
+ //# sourceMappingURL=incidents.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"incidents.d.ts","sourceRoot":"","sources":["../../../src/tasks/incidents.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,KAAK,UAAU,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC7E,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,EACxB,KAAK,sBAAsB,EAC3B,KAAK,iBAAiB,EACtB,KAAK,qBAAqB,EAC1B,KAAK,sBAAsB,EAC5B,MAAM,6BAA6B,CAAC;AAErC,qBAAa,iBAAkB,SAAQ,IAAI,CAAC,kBAAkB,EAAE,mBAAmB,CAAC;;IAKlF,OAAO,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,kBAAkB,GAAG,MAAM,GAAG,SAAS;IAIxE,WAAW,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,kBAAkB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAOjF,YAAY,IAAI,MAAM,EAAE;IAIlB,OAAO,CACX,GAAG,EAAE,UAAU,EACf,KAAK,EAAE,kBAAkB,GACxB,OAAO,CAAC,mBAAmB,CAAC;CAchC;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,oBAAqB,SAAQ,IAAI,CAC5C,yBAAyB,EACzB,sBAAsB,CACvB;;IAKC,WAAW,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,yBAAyB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAQxF,YAAY,IAAI,MAAM,EAAE;IAIlB,OAAO,CACX,GAAG,EAAE,UAAU,EACf,KAAK,EAAE,yBAAyB,GAC/B,OAAO,CAAC,sBAAsB,CAAC;IAsBlC,OAAO,CAAC,eAAe;CAoBxB;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;CACrC;AAED,qBAAa,eAAgB,SAAQ,IAAI,CAAC,oBAAoB,EAAE,iBAAiB,CAAC;;IAKhF,WAAW,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,oBAAoB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAUnF,YAAY,IAAI,MAAM,EAAE;IAIlB,OAAO,CACX,GAAG,EAAE,UAAU,EACf,KAAK,EAAE,oBAAoB,GAC1B,OAAO,CAAC,iBAAiB,CAAC;IAuB7B,OAAO,CAAC,eAAe;IAqBvB,OAAO,CAAC,uBAAuB;CAWhC;AAED,qBAAa,oBAAqB,SAAQ,IAAI,CAC5C,qBAAqB,EACrB,sBAAsB,CACvB;;IAKC,WAAW,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,qBAAqB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IASpF,YAAY,IAAI,MAAM,EAAE;IAIlB,OAAO,CACX,GAAG,EAAE,UAAU,EACf,KAAK,EAAE,qBAAqB,GAC3B,OAAO,CAAC,sBAAsB,CAAC;IAkBlC,OAAO,CAAC,sBAAsB;CA2B/B"}
@@ -0,0 +1,189 @@
1
+ import { Task } from '@ddse/acm-sdk';
2
+ export class FetchIncidentTask extends Task {
3
+ constructor() {
4
+ super('task-incident-fetch', 'incident.fetch');
5
+ }
6
+ idemKey(_ctx, input) {
7
+ return input?.incidentId ? `incident:${input.incidentId}` : undefined;
8
+ }
9
+ policyInput(_ctx, input) {
10
+ return {
11
+ action: 'fetch_incident',
12
+ incidentId: input.incidentId,
13
+ };
14
+ }
15
+ verification() {
16
+ return ['output.incident !== undefined'];
17
+ }
18
+ async execute(ctx, input) {
19
+ const tool = ctx.getTool('fetch_incident');
20
+ if (!tool) {
21
+ throw new Error('fetch_incident tool is not registered');
22
+ }
23
+ const result = (await tool.call(input));
24
+ ctx.stream?.emit('task', {
25
+ taskId: this.id,
26
+ stage: 'incident_loaded',
27
+ incidentId: input.incidentId,
28
+ });
29
+ return result;
30
+ }
31
+ }
32
+ export class ClassifySeverityTask extends Task {
33
+ constructor() {
34
+ super('task-incident-classify', 'incident.classify_severity');
35
+ }
36
+ policyInput(_ctx, input) {
37
+ const incident = this.resolveIncident(_ctx, input);
38
+ return {
39
+ action: 'classify_severity',
40
+ incidentId: incident?.id ?? input.incidentId,
41
+ };
42
+ }
43
+ verification() {
44
+ return ['output.severity !== undefined', 'typeof output.score === "number"'];
45
+ }
46
+ async execute(ctx, input) {
47
+ const tool = ctx.getTool('classify_severity');
48
+ if (!tool) {
49
+ throw new Error('classify_severity tool is not registered');
50
+ }
51
+ const incident = this.resolveIncident(ctx, input);
52
+ if (!incident) {
53
+ throw new Error('incident is required');
54
+ }
55
+ const result = (await tool.call({ incident }));
56
+ ctx.stream?.emit('task', {
57
+ taskId: this.id,
58
+ stage: 'incident_severity_classified',
59
+ incidentId: incident.id,
60
+ severity: result.severity,
61
+ score: result.score,
62
+ });
63
+ return result;
64
+ }
65
+ resolveIncident(ctx, input) {
66
+ if (input?.incident) {
67
+ return input.incident;
68
+ }
69
+ const fetchOutput = ctx.outputs?.['task-incident-fetch'];
70
+ const incident = fetchOutput?.incident;
71
+ if (!incident) {
72
+ return undefined;
73
+ }
74
+ if (!input?.incidentId || incident.id === input.incidentId) {
75
+ return incident;
76
+ }
77
+ return undefined;
78
+ }
79
+ }
80
+ export class SelectQueueTask extends Task {
81
+ constructor() {
82
+ super('task-incident-route', 'incident.select_queue');
83
+ }
84
+ policyInput(_ctx, input) {
85
+ const incident = this.resolveIncident(_ctx, input);
86
+ const severityOverride = this.resolveSeverityOverride(_ctx, input);
87
+ return {
88
+ action: 'select_queue',
89
+ incidentId: incident?.id ?? input.incidentId,
90
+ severityOverride,
91
+ };
92
+ }
93
+ verification() {
94
+ return ['typeof output.queue === "string"', 'output.rule !== undefined'];
95
+ }
96
+ async execute(ctx, input) {
97
+ const tool = ctx.getTool('select_queue');
98
+ if (!tool) {
99
+ throw new Error('select_queue tool is not registered');
100
+ }
101
+ const incident = this.resolveIncident(ctx, input);
102
+ if (!incident) {
103
+ throw new Error('incident is required');
104
+ }
105
+ const severityOverride = this.resolveSeverityOverride(ctx, input);
106
+ const result = (await tool.call({ incident, severityOverride }));
107
+ ctx.stream?.emit('task', {
108
+ taskId: this.id,
109
+ stage: 'incident_queue_selected',
110
+ incidentId: incident.id,
111
+ queue: result.queue,
112
+ escalationRequired: result.escalationRequired,
113
+ });
114
+ return result;
115
+ }
116
+ resolveIncident(ctx, input) {
117
+ if (input?.incident) {
118
+ return input.incident;
119
+ }
120
+ const fetchOutput = ctx.outputs?.['task-incident-fetch'];
121
+ const incident = fetchOutput?.incident;
122
+ if (!incident) {
123
+ return undefined;
124
+ }
125
+ if (!input?.incidentId || incident.id === input.incidentId) {
126
+ return incident;
127
+ }
128
+ return undefined;
129
+ }
130
+ resolveSeverityOverride(ctx, input) {
131
+ if (input?.severityOverride) {
132
+ return input.severityOverride;
133
+ }
134
+ const classifyOutput = ctx.outputs?.['task-incident-classify'];
135
+ return classifyOutput?.severity;
136
+ }
137
+ }
138
+ export class EscalateIncidentTask extends Task {
139
+ constructor() {
140
+ super('task-incident-escalate', 'incident.escalate');
141
+ }
142
+ policyInput(_ctx, input) {
143
+ const resolved = this.resolveEscalationInput(_ctx, input);
144
+ return {
145
+ action: 'escalate_incident',
146
+ incidentId: resolved.incidentId,
147
+ target: resolved.target,
148
+ };
149
+ }
150
+ verification() {
151
+ return ['output.escalated === true', 'typeof output.ticketId === "string"'];
152
+ }
153
+ async execute(ctx, input) {
154
+ const tool = ctx.getTool('escalate_incident');
155
+ if (!tool) {
156
+ throw new Error('escalate_incident tool is not registered');
157
+ }
158
+ const resolved = this.resolveEscalationInput(ctx, input);
159
+ const result = (await tool.call(resolved));
160
+ ctx.stream?.emit('task', {
161
+ taskId: this.id,
162
+ stage: 'incident_escalated',
163
+ incidentId: resolved.incidentId,
164
+ target: result.target,
165
+ ticketId: result.ticketId,
166
+ });
167
+ return result;
168
+ }
169
+ resolveEscalationInput(ctx, input) {
170
+ const fetchOutput = ctx.outputs?.['task-incident-fetch'];
171
+ const selectOutput = ctx.outputs?.['task-incident-route'];
172
+ const incidentId = input?.incidentId ?? fetchOutput?.incident?.id;
173
+ const target = input?.target ?? selectOutput?.rule?.escalatesTo ?? 'incident-manager@northwind.example';
174
+ const reason = input?.reason ??
175
+ (selectOutput?.rationale?.join(' ') || 'Escalation triggered by routing decision.');
176
+ if (!incidentId) {
177
+ throw new Error('incidentId is required for escalation');
178
+ }
179
+ if (!target) {
180
+ throw new Error('Escalation target could not be determined');
181
+ }
182
+ return {
183
+ incidentId,
184
+ target,
185
+ reason,
186
+ };
187
+ }
188
+ }
189
+ //# sourceMappingURL=incidents.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"incidents.js","sourceRoot":"","sources":["../../../src/tasks/incidents.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAmB,MAAM,eAAe,CAAC;AAWtD,MAAM,OAAO,iBAAkB,SAAQ,IAA6C;IAClF;QACE,KAAK,CAAC,qBAAqB,EAAE,gBAAgB,CAAC,CAAC;IACjD,CAAC;IAED,OAAO,CAAC,IAAgB,EAAE,KAAyB;QACjD,OAAO,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IACxE,CAAC;IAED,WAAW,CAAC,IAAgB,EAAE,KAAyB;QACrD,OAAO;YACL,MAAM,EAAE,gBAAgB;YACxB,UAAU,EAAE,KAAK,CAAC,UAAU;SAC7B,CAAC;IACJ,CAAC;IAED,YAAY;QACV,OAAO,CAAC,+BAA+B,CAAC,CAAC;IAC3C,CAAC;IAED,KAAK,CAAC,OAAO,CACX,GAAe,EACf,KAAyB;QAEzB,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;QAC3C,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;QAC3D,CAAC;QAED,MAAM,MAAM,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAwB,CAAC;QAC/D,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE;YACvB,MAAM,EAAE,IAAI,CAAC,EAAE;YACf,KAAK,EAAE,iBAAiB;YACxB,UAAU,EAAE,KAAK,CAAC,UAAU;SAC7B,CAAC,CAAC;QACH,OAAO,MAAM,CAAC;IAChB,CAAC;CACF;AAOD,MAAM,OAAO,oBAAqB,SAAQ,IAGzC;IACC;QACE,KAAK,CAAC,wBAAwB,EAAE,4BAA4B,CAAC,CAAC;IAChE,CAAC;IAED,WAAW,CAAC,IAAgB,EAAE,KAAgC;QAC5D,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACnD,OAAO;YACL,MAAM,EAAE,mBAAmB;YAC3B,UAAU,EAAE,QAAQ,EAAE,EAAE,IAAI,KAAK,CAAC,UAAU;SAC7C,CAAC;IACJ,CAAC;IAED,YAAY;QACV,OAAO,CAAC,+BAA+B,EAAE,kCAAkC,CAAC,CAAC;IAC/E,CAAC;IAED,KAAK,CAAC,OAAO,CACX,GAAe,EACf,KAAgC;QAEhC,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;QAC9C,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;QAC9D,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAClD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;QAC1C,CAAC;QAED,MAAM,MAAM,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,CAAC,CAA2B,CAAC;QACzE,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE;YACvB,MAAM,EAAE,IAAI,CAAC,EAAE;YACf,KAAK,EAAE,8BAA8B;YACrC,UAAU,EAAE,QAAQ,CAAC,EAAE;YACvB,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,KAAK,EAAE,MAAM,CAAC,KAAK;SACpB,CAAC,CAAC;QACH,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,eAAe,CACrB,GAAe,EACf,KAAgC;QAEhC,IAAI,KAAK,EAAE,QAAQ,EAAE,CAAC;YACpB,OAAO,KAAK,CAAC,QAAQ,CAAC;QACxB,CAAC;QAED,MAAM,WAAW,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC,qBAAqB,CAAoC,CAAC;QAC5F,MAAM,QAAQ,GAAG,WAAW,EAAE,QAAQ,CAAC;QACvC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,IAAI,CAAC,KAAK,EAAE,UAAU,IAAI,QAAQ,CAAC,EAAE,KAAK,KAAK,CAAC,UAAU,EAAE,CAAC;YAC3D,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;CACF;AAQD,MAAM,OAAO,eAAgB,SAAQ,IAA6C;IAChF;QACE,KAAK,CAAC,qBAAqB,EAAE,uBAAuB,CAAC,CAAC;IACxD,CAAC;IAED,WAAW,CAAC,IAAgB,EAAE,KAA2B;QACvD,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACnD,MAAM,gBAAgB,GAAG,IAAI,CAAC,uBAAuB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACnE,OAAO;YACL,MAAM,EAAE,cAAc;YACtB,UAAU,EAAE,QAAQ,EAAE,EAAE,IAAI,KAAK,CAAC,UAAU;YAC5C,gBAAgB;SACjB,CAAC;IACJ,CAAC;IAED,YAAY;QACV,OAAO,CAAC,kCAAkC,EAAE,2BAA2B,CAAC,CAAC;IAC3E,CAAC;IAED,KAAK,CAAC,OAAO,CACX,GAAe,EACf,KAA2B;QAE3B,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;QACzC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;QACzD,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAClD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;QAC1C,CAAC;QAED,MAAM,gBAAgB,GAAG,IAAI,CAAC,uBAAuB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAClE,MAAM,MAAM,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,gBAAgB,EAAE,CAAC,CAAsB,CAAC;QACtF,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE;YACvB,MAAM,EAAE,IAAI,CAAC,EAAE;YACf,KAAK,EAAE,yBAAyB;YAChC,UAAU,EAAE,QAAQ,CAAC,EAAE;YACvB,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,kBAAkB,EAAE,MAAM,CAAC,kBAAkB;SAC9C,CAAC,CAAC;QACH,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,eAAe,CACrB,GAAe,EACf,KAA2B;QAE3B,IAAI,KAAK,EAAE,QAAQ,EAAE,CAAC;YACpB,OAAO,KAAK,CAAC,QAAQ,CAAC;QACxB,CAAC;QAED,MAAM,WAAW,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC,qBAAqB,CAAoC,CAAC;QAC5F,MAAM,QAAQ,GAAG,WAAW,EAAE,QAAQ,CAAC;QACvC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,IAAI,CAAC,KAAK,EAAE,UAAU,IAAI,QAAQ,CAAC,EAAE,KAAK,KAAK,CAAC,UAAU,EAAE,CAAC;YAC3D,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAEO,uBAAuB,CAC7B,GAAe,EACf,KAA2B;QAE3B,IAAI,KAAK,EAAE,gBAAgB,EAAE,CAAC;YAC5B,OAAO,KAAK,CAAC,gBAAgB,CAAC;QAChC,CAAC;QAED,MAAM,cAAc,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC,wBAAwB,CAAuC,CAAC;QACrG,OAAO,cAAc,EAAE,QAAQ,CAAC;IAClC,CAAC;CACF;AAED,MAAM,OAAO,oBAAqB,SAAQ,IAGzC;IACC;QACE,KAAK,CAAC,wBAAwB,EAAE,mBAAmB,CAAC,CAAC;IACvD,CAAC;IAED,WAAW,CAAC,IAAgB,EAAE,KAA4B;QACxD,MAAM,QAAQ,GAAG,IAAI,CAAC,sBAAsB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAC1D,OAAO;YACL,MAAM,EAAE,mBAAmB;YAC3B,UAAU,EAAE,QAAQ,CAAC,UAAU;YAC/B,MAAM,EAAE,QAAQ,CAAC,MAAM;SACxB,CAAC;IACJ,CAAC;IAED,YAAY;QACV,OAAO,CAAC,2BAA2B,EAAE,qCAAqC,CAAC,CAAC;IAC9E,CAAC;IAED,KAAK,CAAC,OAAO,CACX,GAAe,EACf,KAA4B;QAE5B,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;QAC9C,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;QAC9D,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,sBAAsB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACzD,MAAM,MAAM,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAA2B,CAAC;QACrE,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE;YACvB,MAAM,EAAE,IAAI,CAAC,EAAE;YACf,KAAK,EAAE,oBAAoB;YAC3B,UAAU,EAAE,QAAQ,CAAC,UAAU;YAC/B,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,QAAQ,EAAE,MAAM,CAAC,QAAQ;SAC1B,CAAC,CAAC;QACH,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,sBAAsB,CAC5B,GAAe,EACf,KAA4B;QAE5B,MAAM,WAAW,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC,qBAAqB,CAAoC,CAAC;QAC5F,MAAM,YAAY,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC,qBAAqB,CAAkC,CAAC;QAE3F,MAAM,UAAU,GAAG,KAAK,EAAE,UAAU,IAAI,WAAW,EAAE,QAAQ,EAAE,EAAE,CAAC;QAClE,MAAM,MAAM,GAAG,KAAK,EAAE,MAAM,IAAI,YAAY,EAAE,IAAI,EAAE,WAAW,IAAI,oCAAoC,CAAC;QACxG,MAAM,MAAM,GACV,KAAK,EAAE,MAAM;YACb,CAAC,YAAY,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,2CAA2C,CAAC,CAAC;QAEtF,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;QAC3D,CAAC;QAED,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;QAC/D,CAAC;QAED,OAAO;YACL,UAAU;YACV,MAAM;YACN,MAAM;SACP,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,7 @@
1
+ export * from './legacy.js';
2
+ export * from './entitlement.js';
3
+ export * from './knowledge.js';
4
+ export * from './incidents.js';
5
+ export * from './invoices.js';
6
+ export * from './coaching.js';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tasks/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC"}
@@ -0,0 +1,7 @@
1
+ export * from './legacy.js';
2
+ export * from './entitlement.js';
3
+ export * from './knowledge.js';
4
+ export * from './incidents.js';
5
+ export * from './invoices.js';
6
+ export * from './coaching.js';
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tasks/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC"}
@@ -0,0 +1,40 @@
1
+ import { Task, type RunContext } from '@ddse/acm-sdk';
2
+ import { type FetchInvoiceInput, type FetchInvoiceOutput, type FetchPurchaseOrderInput, type FetchPurchaseOrderOutput, type CompareLineItemsInput, type CompareLineItemsOutput, type RecordFindingsInput, type RecordFindingsOutput } from '../tools/invoices/index.js';
3
+ export declare class FetchInvoiceTask extends Task<FetchInvoiceInput, FetchInvoiceOutput> {
4
+ constructor();
5
+ idemKey(_ctx: RunContext, input: FetchInvoiceInput): string | undefined;
6
+ policyInput(_ctx: RunContext, input: FetchInvoiceInput): Record<string, unknown>;
7
+ verification(): string[];
8
+ execute(ctx: RunContext, input: FetchInvoiceInput): Promise<FetchInvoiceOutput>;
9
+ }
10
+ export declare class FetchPurchaseOrderTask extends Task<FetchPurchaseOrderInput, FetchPurchaseOrderOutput> {
11
+ constructor();
12
+ idemKey(_ctx: RunContext, input: FetchPurchaseOrderInput): string | undefined;
13
+ policyInput(_ctx: RunContext, input: FetchPurchaseOrderInput): Record<string, unknown>;
14
+ verification(): string[];
15
+ execute(ctx: RunContext, input: FetchPurchaseOrderInput): Promise<FetchPurchaseOrderOutput>;
16
+ }
17
+ export interface CompareLineItemsTaskInput extends Partial<CompareLineItemsInput> {
18
+ invoiceId?: string;
19
+ purchaseOrderId?: string;
20
+ }
21
+ export declare class CompareLineItemsTask extends Task<CompareLineItemsTaskInput, CompareLineItemsOutput> {
22
+ constructor();
23
+ policyInput(_ctx: RunContext, input: CompareLineItemsTaskInput): Record<string, unknown>;
24
+ verification(): string[];
25
+ execute(ctx: RunContext, input: CompareLineItemsTaskInput): Promise<CompareLineItemsOutput>;
26
+ private resolveInvoice;
27
+ private resolvePurchaseOrder;
28
+ }
29
+ export interface RecordFindingsTaskInput extends Partial<RecordFindingsInput> {
30
+ invoiceId?: string;
31
+ purchaseOrderId?: string;
32
+ }
33
+ export declare class RecordFindingsTask extends Task<RecordFindingsTaskInput, RecordFindingsOutput> {
34
+ constructor();
35
+ policyInput(_ctx: RunContext, input: RecordFindingsTaskInput): Record<string, unknown>;
36
+ verification(): string[];
37
+ execute(ctx: RunContext, input: RecordFindingsTaskInput): Promise<RecordFindingsOutput>;
38
+ private resolveInput;
39
+ }
40
+ //# sourceMappingURL=invoices.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invoices.d.ts","sourceRoot":"","sources":["../../../src/tasks/invoices.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,KAAK,UAAU,EAAE,MAAM,eAAe,CAAC;AAEtD,OAAO,EACL,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACvB,KAAK,uBAAuB,EAC5B,KAAK,wBAAwB,EAC7B,KAAK,qBAAqB,EAC1B,KAAK,sBAAsB,EAC3B,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,EAC1B,MAAM,4BAA4B,CAAC;AAEpC,qBAAa,gBAAiB,SAAQ,IAAI,CAAC,iBAAiB,EAAE,kBAAkB,CAAC;;IAK/E,OAAO,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,iBAAiB,GAAG,MAAM,GAAG,SAAS;IAIvE,WAAW,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,iBAAiB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAOhF,YAAY,IAAI,MAAM,EAAE;IAIlB,OAAO,CACX,GAAG,EAAE,UAAU,EACf,KAAK,EAAE,iBAAiB,GACvB,OAAO,CAAC,kBAAkB,CAAC;CAc/B;AAED,qBAAa,sBAAuB,SAAQ,IAAI,CAC9C,uBAAuB,EACvB,wBAAwB,CACzB;;IAKC,OAAO,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,uBAAuB,GAAG,MAAM,GAAG,SAAS;IAI7E,WAAW,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,uBAAuB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAOtF,YAAY,IAAI,MAAM,EAAE;IAIlB,OAAO,CACX,GAAG,EAAE,UAAU,EACf,KAAK,EAAE,uBAAuB,GAC7B,OAAO,CAAC,wBAAwB,CAAC;CAcrC;AAED,MAAM,WAAW,yBAA0B,SAAQ,OAAO,CAAC,qBAAqB,CAAC;IAC/E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,qBAAa,oBAAqB,SAAQ,IAAI,CAC5C,yBAAyB,EACzB,sBAAsB,CACvB;;IAKC,WAAW,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,yBAAyB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAUxF,YAAY,IAAI,MAAM,EAAE;IAIlB,OAAO,CACX,GAAG,EAAE,UAAU,EACf,KAAK,EAAE,yBAAyB,GAC/B,OAAO,CAAC,sBAAsB,CAAC;IAyBlC,OAAO,CAAC,cAAc;IAqBtB,OAAO,CAAC,oBAAoB;CAoB7B;AAED,MAAM,WAAW,uBAAwB,SAAQ,OAAO,CAAC,mBAAmB,CAAC;IAC3E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,qBAAa,kBAAmB,SAAQ,IAAI,CAC1C,uBAAuB,EACvB,oBAAoB,CACrB;;IAKC,WAAW,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,uBAAuB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAUtF,YAAY,IAAI,MAAM,EAAE;IAIlB,OAAO,CACX,GAAG,EAAE,UAAU,EACf,KAAK,EAAE,uBAAuB,GAC7B,OAAO,CAAC,oBAAoB,CAAC;IAmBhC,OAAO,CAAC,YAAY;CA2BrB"}
@@ -0,0 +1,180 @@
1
+ import { Task } from '@ddse/acm-sdk';
2
+ export class FetchInvoiceTask extends Task {
3
+ constructor() {
4
+ super('task-invoice-fetch', 'invoice.fetch');
5
+ }
6
+ idemKey(_ctx, input) {
7
+ return input?.invoiceId ? `invoice:${input.invoiceId}` : undefined;
8
+ }
9
+ policyInput(_ctx, input) {
10
+ return {
11
+ action: 'fetch_invoice',
12
+ invoiceId: input.invoiceId,
13
+ };
14
+ }
15
+ verification() {
16
+ return ['output.invoice !== undefined'];
17
+ }
18
+ async execute(ctx, input) {
19
+ const tool = ctx.getTool('fetch_invoice');
20
+ if (!tool) {
21
+ throw new Error('fetch_invoice tool is not registered');
22
+ }
23
+ const result = (await tool.call(input));
24
+ ctx.stream?.emit('task', {
25
+ taskId: this.id,
26
+ stage: 'invoice_loaded',
27
+ invoiceId: input.invoiceId,
28
+ });
29
+ return result;
30
+ }
31
+ }
32
+ export class FetchPurchaseOrderTask extends Task {
33
+ constructor() {
34
+ super('task-invoice-fetch-po', 'invoice.fetch_purchase_order');
35
+ }
36
+ idemKey(_ctx, input) {
37
+ return input?.purchaseOrderId ? `purchase-order:${input.purchaseOrderId}` : undefined;
38
+ }
39
+ policyInput(_ctx, input) {
40
+ return {
41
+ action: 'fetch_purchase_order',
42
+ purchaseOrderId: input.purchaseOrderId,
43
+ };
44
+ }
45
+ verification() {
46
+ return ['output.purchaseOrder !== undefined'];
47
+ }
48
+ async execute(ctx, input) {
49
+ const tool = ctx.getTool('fetch_purchase_order');
50
+ if (!tool) {
51
+ throw new Error('fetch_purchase_order tool is not registered');
52
+ }
53
+ const result = (await tool.call(input));
54
+ ctx.stream?.emit('task', {
55
+ taskId: this.id,
56
+ stage: 'purchase_order_loaded',
57
+ purchaseOrderId: input.purchaseOrderId,
58
+ });
59
+ return result;
60
+ }
61
+ }
62
+ export class CompareLineItemsTask extends Task {
63
+ constructor() {
64
+ super('task-invoice-compare-lines', 'invoice.compare_line_items');
65
+ }
66
+ policyInput(_ctx, input) {
67
+ const invoice = this.resolveInvoice(_ctx, input);
68
+ const purchaseOrder = this.resolvePurchaseOrder(_ctx, input);
69
+ return {
70
+ action: 'compare_line_items',
71
+ invoiceId: invoice?.id ?? input.invoiceId,
72
+ purchaseOrderId: purchaseOrder?.id ?? input.purchaseOrderId,
73
+ };
74
+ }
75
+ verification() {
76
+ return ['Array.isArray(output.discrepancies)', 'typeof output.variance === "number"'];
77
+ }
78
+ async execute(ctx, input) {
79
+ const tool = ctx.getTool('compare_line_items');
80
+ if (!tool) {
81
+ throw new Error('compare_line_items tool is not registered');
82
+ }
83
+ const invoice = this.resolveInvoice(ctx, input);
84
+ const purchaseOrder = this.resolvePurchaseOrder(ctx, input);
85
+ if (!invoice || !purchaseOrder) {
86
+ throw new Error('invoice and purchaseOrder are required');
87
+ }
88
+ const result = (await tool.call({ invoice, purchaseOrder }));
89
+ ctx.stream?.emit('task', {
90
+ taskId: this.id,
91
+ stage: 'invoice_line_items_compared',
92
+ invoiceId: invoice.id,
93
+ purchaseOrderId: purchaseOrder.id,
94
+ discrepancies: result.discrepancies.length,
95
+ variance: result.variance,
96
+ });
97
+ return result;
98
+ }
99
+ resolveInvoice(ctx, input) {
100
+ if (input?.invoice) {
101
+ return input.invoice;
102
+ }
103
+ const fetchOutput = ctx.outputs?.['task-invoice-fetch'];
104
+ const invoice = fetchOutput?.invoice;
105
+ if (!invoice) {
106
+ return undefined;
107
+ }
108
+ if (!input?.invoiceId || invoice.id === input.invoiceId) {
109
+ return invoice;
110
+ }
111
+ return undefined;
112
+ }
113
+ resolvePurchaseOrder(ctx, input) {
114
+ if (input?.purchaseOrder) {
115
+ return input.purchaseOrder;
116
+ }
117
+ const fetchOutput = ctx.outputs?.['task-invoice-fetch-po'];
118
+ const purchaseOrder = fetchOutput?.purchaseOrder;
119
+ if (!purchaseOrder) {
120
+ return undefined;
121
+ }
122
+ if (!input?.purchaseOrderId || purchaseOrder.id === input.purchaseOrderId) {
123
+ return purchaseOrder;
124
+ }
125
+ return undefined;
126
+ }
127
+ }
128
+ export class RecordFindingsTask extends Task {
129
+ constructor() {
130
+ super('task-invoice-record-findings', 'invoice.record_findings');
131
+ }
132
+ policyInput(_ctx, input) {
133
+ const resolved = this.resolveInput(_ctx, input);
134
+ return {
135
+ action: 'record_findings',
136
+ invoiceId: resolved.invoice.id,
137
+ purchaseOrderId: resolved.purchaseOrder.id,
138
+ discrepancyCount: resolved.discrepancies.length,
139
+ };
140
+ }
141
+ verification() {
142
+ return ['typeof output.reportId === "string"', 'Array.isArray(output.nextSteps)'];
143
+ }
144
+ async execute(ctx, input) {
145
+ const tool = ctx.getTool('record_findings');
146
+ if (!tool) {
147
+ throw new Error('record_findings tool is not registered');
148
+ }
149
+ const resolved = this.resolveInput(ctx, input);
150
+ const result = (await tool.call(resolved));
151
+ ctx.stream?.emit('task', {
152
+ taskId: this.id,
153
+ stage: 'invoice_findings_recorded',
154
+ invoiceId: resolved.invoice.id,
155
+ purchaseOrderId: resolved.purchaseOrder.id,
156
+ status: result.status,
157
+ });
158
+ return result;
159
+ }
160
+ resolveInput(ctx, input) {
161
+ const invoice = input.invoice ?? ctx.outputs?.['task-invoice-fetch']?.invoice;
162
+ const purchaseOrder = input.purchaseOrder ?? ctx.outputs?.['task-invoice-fetch-po']?.purchaseOrder;
163
+ const compareOutput = ctx.outputs?.['task-invoice-compare-lines'];
164
+ if (!invoice) {
165
+ throw new Error('invoice is required for recording findings');
166
+ }
167
+ if (!purchaseOrder) {
168
+ throw new Error('purchaseOrder is required for recording findings');
169
+ }
170
+ const discrepancies = input.discrepancies ?? compareOutput?.discrepancies ?? [];
171
+ const variance = input.variance ?? compareOutput?.variance ?? 0;
172
+ return {
173
+ invoice,
174
+ purchaseOrder,
175
+ discrepancies,
176
+ variance,
177
+ };
178
+ }
179
+ }
180
+ //# sourceMappingURL=invoices.js.map