@turingpulse/sdk 1.0.1

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 (160) hide show
  1. package/.github/dependabot.yml +38 -0
  2. package/.github/workflows/ci.yml +246 -0
  3. package/.github/workflows/framework-compat.yml +169 -0
  4. package/.github/workflows/security.yml +336 -0
  5. package/CHANGELOG.md +29 -0
  6. package/LICENSE +13 -0
  7. package/MIGRATION.md +30 -0
  8. package/README.md +221 -0
  9. package/dist/attachments.d.ts +28 -0
  10. package/dist/attachments.d.ts.map +1 -0
  11. package/dist/attachments.js +59 -0
  12. package/dist/attachments.js.map +1 -0
  13. package/dist/config.d.ts +72 -0
  14. package/dist/config.d.ts.map +1 -0
  15. package/dist/config.js +78 -0
  16. package/dist/config.js.map +1 -0
  17. package/dist/context.d.ts +126 -0
  18. package/dist/context.d.ts.map +1 -0
  19. package/dist/context.js +163 -0
  20. package/dist/context.js.map +1 -0
  21. package/dist/decorators.d.ts +6 -0
  22. package/dist/decorators.d.ts.map +1 -0
  23. package/dist/decorators.js +52 -0
  24. package/dist/decorators.js.map +1 -0
  25. package/dist/deploy.d.ts +89 -0
  26. package/dist/deploy.d.ts.map +1 -0
  27. package/dist/deploy.js +203 -0
  28. package/dist/deploy.js.map +1 -0
  29. package/dist/errors.d.ts +18 -0
  30. package/dist/errors.d.ts.map +1 -0
  31. package/dist/errors.js +34 -0
  32. package/dist/errors.js.map +1 -0
  33. package/dist/eventBuilder.d.ts +21 -0
  34. package/dist/eventBuilder.d.ts.map +1 -0
  35. package/dist/eventBuilder.js +127 -0
  36. package/dist/eventBuilder.js.map +1 -0
  37. package/dist/fingerprint.d.ts +158 -0
  38. package/dist/fingerprint.d.ts.map +1 -0
  39. package/dist/fingerprint.js +339 -0
  40. package/dist/fingerprint.js.map +1 -0
  41. package/dist/governance.d.ts +47 -0
  42. package/dist/governance.d.ts.map +1 -0
  43. package/dist/governance.js +104 -0
  44. package/dist/governance.js.map +1 -0
  45. package/dist/http.d.ts +62 -0
  46. package/dist/http.d.ts.map +1 -0
  47. package/dist/http.js +181 -0
  48. package/dist/http.js.map +1 -0
  49. package/dist/index.d.ts +15 -0
  50. package/dist/index.d.ts.map +1 -0
  51. package/dist/index.js +23 -0
  52. package/dist/index.js.map +1 -0
  53. package/dist/instrumentation.d.ts +40 -0
  54. package/dist/instrumentation.d.ts.map +1 -0
  55. package/dist/instrumentation.js +31 -0
  56. package/dist/instrumentation.js.map +1 -0
  57. package/dist/integrations/mastra.d.ts +64 -0
  58. package/dist/integrations/mastra.d.ts.map +1 -0
  59. package/dist/integrations/mastra.js +256 -0
  60. package/dist/integrations/mastra.js.map +1 -0
  61. package/dist/kpi.d.ts +21 -0
  62. package/dist/kpi.d.ts.map +1 -0
  63. package/dist/kpi.js +83 -0
  64. package/dist/kpi.js.map +1 -0
  65. package/dist/llmDetector.d.ts +22 -0
  66. package/dist/llmDetector.d.ts.map +1 -0
  67. package/dist/llmDetector.js +269 -0
  68. package/dist/llmDetector.js.map +1 -0
  69. package/dist/plugin.d.ts +33 -0
  70. package/dist/plugin.d.ts.map +1 -0
  71. package/dist/plugin.js +312 -0
  72. package/dist/plugin.js.map +1 -0
  73. package/dist/registry.d.ts +13 -0
  74. package/dist/registry.d.ts.map +1 -0
  75. package/dist/registry.js +18 -0
  76. package/dist/registry.js.map +1 -0
  77. package/dist/tracing.d.ts +10 -0
  78. package/dist/tracing.d.ts.map +1 -0
  79. package/dist/tracing.js +30 -0
  80. package/dist/tracing.js.map +1 -0
  81. package/dist/triggerState.d.ts +5 -0
  82. package/dist/triggerState.d.ts.map +1 -0
  83. package/dist/triggerState.js +19 -0
  84. package/dist/triggerState.js.map +1 -0
  85. package/dist/utils.d.ts +27 -0
  86. package/dist/utils.d.ts.map +1 -0
  87. package/dist/utils.js +72 -0
  88. package/dist/utils.js.map +1 -0
  89. package/package.json +37 -0
  90. package/packages/anthropic/package.json +16 -0
  91. package/packages/anthropic/src/index.ts +5 -0
  92. package/packages/anthropic/src/wrapper.ts +102 -0
  93. package/packages/anthropic/tsconfig.build.json +20 -0
  94. package/packages/langchain/package.json +16 -0
  95. package/packages/langchain/src/index.ts +7 -0
  96. package/packages/langchain/src/wrapper.ts +51 -0
  97. package/packages/mastra/package.json +17 -0
  98. package/packages/mastra/src/index.ts +8 -0
  99. package/packages/mastra/src/wrapper.ts +301 -0
  100. package/packages/openai/package.json +16 -0
  101. package/packages/openai/src/index.ts +8 -0
  102. package/packages/openai/src/wrapper.ts +103 -0
  103. package/packages/openai/tsconfig.build.json +20 -0
  104. package/packages/openclaw/openclaw.plugin.json +100 -0
  105. package/packages/openclaw/package.json +41 -0
  106. package/packages/openclaw/src/buffer.ts +99 -0
  107. package/packages/openclaw/src/config.ts +139 -0
  108. package/packages/openclaw/src/hooks/governance.ts +267 -0
  109. package/packages/openclaw/src/hooks/lifecycle.ts +75 -0
  110. package/packages/openclaw/src/hooks/telemetry.ts +207 -0
  111. package/packages/openclaw/src/index.ts +91 -0
  112. package/packages/openclaw/src/mapper.ts +233 -0
  113. package/packages/openclaw/src/session-tracker.ts +181 -0
  114. package/packages/openclaw/src/types.ts +220 -0
  115. package/packages/openclaw/tests/buffer.test.ts +148 -0
  116. package/packages/openclaw/tests/config.test.ts +122 -0
  117. package/packages/openclaw/tests/governance.test.ts +232 -0
  118. package/packages/openclaw/tests/mapper.test.ts +242 -0
  119. package/packages/openclaw/tests/session-tracker.test.ts +124 -0
  120. package/packages/openclaw/tsconfig.json +18 -0
  121. package/packages/openclaw/vitest.config.ts +8 -0
  122. package/packages/vercel-ai/package.json +16 -0
  123. package/packages/vercel-ai/src/index.ts +5 -0
  124. package/packages/vercel-ai/src/wrapper.ts +49 -0
  125. package/scripts/bump-version.sh +58 -0
  126. package/scripts/update-readme-compat.mjs +151 -0
  127. package/src/__tests__/fingerprint.test.ts +328 -0
  128. package/src/attachments.ts +88 -0
  129. package/src/config.ts +164 -0
  130. package/src/context.ts +258 -0
  131. package/src/decorators.ts +61 -0
  132. package/src/deploy.ts +260 -0
  133. package/src/errors.ts +44 -0
  134. package/src/eventBuilder.ts +153 -0
  135. package/src/fingerprint.ts +421 -0
  136. package/src/governance.ts +156 -0
  137. package/src/http.ts +241 -0
  138. package/src/index.ts +57 -0
  139. package/src/instrumentation.ts +68 -0
  140. package/src/integrations/mastra.ts +335 -0
  141. package/src/kpi.ts +112 -0
  142. package/src/llmDetector.ts +330 -0
  143. package/src/plugin.ts +384 -0
  144. package/src/registry.ts +27 -0
  145. package/src/tracing.ts +39 -0
  146. package/src/triggerState.ts +27 -0
  147. package/src/utils.ts +78 -0
  148. package/tests/compat/anthropic.test.ts +61 -0
  149. package/tests/compat/cohere.test.ts +57 -0
  150. package/tests/compat/google-genai.test.ts +61 -0
  151. package/tests/compat/langchain-openai.test.ts +41 -0
  152. package/tests/compat/langchain.test.ts +64 -0
  153. package/tests/compat/mistral.test.ts +58 -0
  154. package/tests/compat/openai.test.ts +71 -0
  155. package/tests/compat/vercel-ai.test.ts +56 -0
  156. package/tests/plugins/anthropic-wrapper.test.ts +120 -0
  157. package/tests/plugins/langchain-wrapper.test.ts +128 -0
  158. package/tests/plugins/openai-wrapper.test.ts +165 -0
  159. package/tsconfig.json +21 -0
  160. package/vitest.config.ts +9 -0
@@ -0,0 +1,89 @@
1
+ /**
2
+ * Deploy tracking for change detection and root cause analysis.
3
+ */
4
+ /**
5
+ * Information about a deployment.
6
+ */
7
+ export interface DeployInfo {
8
+ /** CI/CD provider (github, gitlab, jenkins, etc.) */
9
+ provider: string;
10
+ /** Git commit SHA */
11
+ gitSha?: string;
12
+ /** Version tag or branch name */
13
+ versionTag?: string;
14
+ /** Commit message */
15
+ commitMessage?: string;
16
+ /** Deployment timestamp */
17
+ deployedAt?: Date;
18
+ /** Additional metadata */
19
+ metadata?: Record<string, unknown>;
20
+ }
21
+ /**
22
+ * Automatically detect deployment info from CI/CD environment variables.
23
+ *
24
+ * Supports:
25
+ * - GitHub Actions
26
+ * - GitLab CI
27
+ * - CircleCI
28
+ * - Jenkins
29
+ * - Azure DevOps
30
+ * - Bitbucket Pipelines
31
+ * - Travis CI
32
+ */
33
+ export declare class AutoDeployDetector {
34
+ /**
35
+ * Detect deployment info from environment variables.
36
+ *
37
+ * @returns DeployInfo if running in a known CI/CD environment, undefined otherwise
38
+ */
39
+ static detect(): DeployInfo | undefined;
40
+ }
41
+ /**
42
+ * Options for registering a deploy.
43
+ */
44
+ export interface RegisterDeployOptions {
45
+ /** The workflow ID this deployment affects */
46
+ workflowId: string;
47
+ /** Version tag (e.g., "v1.2.3") */
48
+ version?: string;
49
+ /** Git commit SHA */
50
+ gitSha?: string;
51
+ /** Git commit message */
52
+ commitMessage?: string;
53
+ /** Additional metadata */
54
+ metadata?: Record<string, unknown>;
55
+ /** Deployment timestamp (defaults to now) */
56
+ deployedAt?: Date;
57
+ /** If true, auto-detect from CI/CD environment variables */
58
+ autoDetect?: boolean;
59
+ }
60
+ /**
61
+ * Register a deployment event with TuringPulse.
62
+ *
63
+ * Call this from your CI/CD pipeline or application startup to track deployments.
64
+ * Deployment events are correlated with anomalies and drifts for root cause analysis.
65
+ *
66
+ * @param options - Deploy registration options
67
+ * @returns True if deploy was registered successfully, false otherwise
68
+ *
69
+ * @example
70
+ * ```typescript
71
+ * import { registerDeploy } from '@turingpulse/sdk';
72
+ *
73
+ * // Manual registration
74
+ * await registerDeploy({
75
+ * workflowId: 'chat-assistant',
76
+ * version: 'v1.2.3',
77
+ * gitSha: process.env.GIT_SHA,
78
+ * commitMessage: process.env.GIT_COMMIT_MSG,
79
+ * });
80
+ *
81
+ * // Auto-detect from CI/CD environment
82
+ * await registerDeploy({
83
+ * workflowId: 'chat-assistant',
84
+ * autoDetect: true,
85
+ * });
86
+ * ```
87
+ */
88
+ export declare function registerDeploy(options: RegisterDeployOptions): Promise<boolean>;
89
+ //# sourceMappingURL=deploy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../src/deploy.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,qDAAqD;IACrD,QAAQ,EAAE,MAAM,CAAC;IACjB,qBAAqB;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iCAAiC;IACjC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,qBAAqB;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,2BAA2B;IAC3B,UAAU,CAAC,EAAE,IAAI,CAAC;IAClB,0BAA0B;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAuFD;;;;;;;;;;;GAWG;AACH,qBAAa,kBAAkB;IAC7B;;;;OAIG;IACH,MAAM,CAAC,MAAM,IAAI,UAAU,GAAG,SAAS;CAkCxC;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,8CAA8C;IAC9C,UAAU,EAAE,MAAM,CAAC;IACnB,mCAAmC;IACnC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,qBAAqB;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,yBAAyB;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,0BAA0B;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,6CAA6C;IAC7C,UAAU,CAAC,EAAE,IAAI,CAAC;IAClB,4DAA4D;IAC5D,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,OAAO,CAAC,CA8CrF"}
package/dist/deploy.js ADDED
@@ -0,0 +1,203 @@
1
+ /**
2
+ * Deploy tracking for change detection and root cause analysis.
3
+ */
4
+ import { getInstance } from './plugin';
5
+ import { PluginNotInitializedError } from './errors';
6
+ import { safeEnv, safeErrorMessage } from './utils';
7
+ /**
8
+ * CI/CD provider detection and variable mapping.
9
+ */
10
+ const PROVIDERS = {
11
+ github: {
12
+ detect: ['GITHUB_ACTIONS'],
13
+ sha: ['GITHUB_SHA'],
14
+ ref: ['GITHUB_REF', 'GITHUB_REF_NAME'],
15
+ message: ['GITHUB_EVENT_HEAD_COMMIT_MESSAGE'],
16
+ run_id: ['GITHUB_RUN_ID'],
17
+ workflow: ['GITHUB_WORKFLOW'],
18
+ actor: ['GITHUB_ACTOR'],
19
+ },
20
+ gitlab: {
21
+ detect: ['GITLAB_CI'],
22
+ sha: ['CI_COMMIT_SHA'],
23
+ ref: ['CI_COMMIT_REF_NAME', 'CI_COMMIT_TAG'],
24
+ message: ['CI_COMMIT_MESSAGE'],
25
+ pipeline_id: ['CI_PIPELINE_ID'],
26
+ job_name: ['CI_JOB_NAME'],
27
+ user: ['GITLAB_USER_LOGIN'],
28
+ },
29
+ circleci: {
30
+ detect: ['CIRCLECI'],
31
+ sha: ['CIRCLE_SHA1'],
32
+ ref: ['CIRCLE_TAG', 'CIRCLE_BRANCH'],
33
+ build_num: ['CIRCLE_BUILD_NUM'],
34
+ workflow_id: ['CIRCLE_WORKFLOW_ID'],
35
+ username: ['CIRCLE_USERNAME'],
36
+ },
37
+ jenkins: {
38
+ detect: ['JENKINS_URL', 'BUILD_NUMBER'],
39
+ sha: ['GIT_COMMIT'],
40
+ ref: ['GIT_BRANCH', 'BUILD_TAG'],
41
+ build_num: ['BUILD_NUMBER'],
42
+ job_name: ['JOB_NAME'],
43
+ user: ['BUILD_USER'],
44
+ },
45
+ azure: {
46
+ detect: ['TF_BUILD', 'AZURE_PIPELINES'],
47
+ sha: ['BUILD_SOURCEVERSION'],
48
+ ref: ['BUILD_SOURCEBRANCH', 'BUILD_SOURCEBRANCHNAME'],
49
+ build_id: ['BUILD_BUILDID'],
50
+ pipeline_name: ['BUILD_DEFINITIONNAME'],
51
+ requester: ['BUILD_REQUESTEDFOR'],
52
+ },
53
+ bitbucket: {
54
+ detect: ['BITBUCKET_PIPELINE_UUID'],
55
+ sha: ['BITBUCKET_COMMIT'],
56
+ ref: ['BITBUCKET_TAG', 'BITBUCKET_BRANCH'],
57
+ build_num: ['BITBUCKET_BUILD_NUMBER'],
58
+ pipeline_uuid: ['BITBUCKET_PIPELINE_UUID'],
59
+ },
60
+ travis: {
61
+ detect: ['TRAVIS'],
62
+ sha: ['TRAVIS_COMMIT'],
63
+ ref: ['TRAVIS_TAG', 'TRAVIS_BRANCH'],
64
+ message: ['TRAVIS_COMMIT_MESSAGE'],
65
+ build_id: ['TRAVIS_BUILD_ID'],
66
+ job_id: ['TRAVIS_JOB_ID'],
67
+ },
68
+ };
69
+ /**
70
+ * Get the first non-empty environment variable value.
71
+ */
72
+ function getFirstEnv(envVars) {
73
+ for (const varName of envVars) {
74
+ const value = safeEnv(varName);
75
+ if (value) {
76
+ return value;
77
+ }
78
+ }
79
+ return undefined;
80
+ }
81
+ /**
82
+ * Automatically detect deployment info from CI/CD environment variables.
83
+ *
84
+ * Supports:
85
+ * - GitHub Actions
86
+ * - GitLab CI
87
+ * - CircleCI
88
+ * - Jenkins
89
+ * - Azure DevOps
90
+ * - Bitbucket Pipelines
91
+ * - Travis CI
92
+ */
93
+ export class AutoDeployDetector {
94
+ /**
95
+ * Detect deployment info from environment variables.
96
+ *
97
+ * @returns DeployInfo if running in a known CI/CD environment, undefined otherwise
98
+ */
99
+ static detect() {
100
+ for (const [provider, config] of Object.entries(PROVIDERS)) {
101
+ const detectVars = config.detect || [];
102
+ if (!detectVars.every((v) => safeEnv(v))) {
103
+ continue;
104
+ }
105
+ const gitSha = getFirstEnv(config.sha || []);
106
+ const versionTag = getFirstEnv(config.ref || []);
107
+ const commitMessage = getFirstEnv(config.message || []);
108
+ const metadata = {};
109
+ for (const [key, envVars] of Object.entries(config)) {
110
+ if (['detect', 'sha', 'ref', 'message'].includes(key)) {
111
+ continue;
112
+ }
113
+ const value = getFirstEnv(envVars || []);
114
+ if (value) {
115
+ metadata[key] = value;
116
+ }
117
+ }
118
+ return {
119
+ provider,
120
+ gitSha,
121
+ versionTag,
122
+ commitMessage,
123
+ deployedAt: new Date(),
124
+ metadata: Object.keys(metadata).length > 0 ? metadata : undefined,
125
+ };
126
+ }
127
+ return undefined;
128
+ }
129
+ }
130
+ /**
131
+ * Register a deployment event with TuringPulse.
132
+ *
133
+ * Call this from your CI/CD pipeline or application startup to track deployments.
134
+ * Deployment events are correlated with anomalies and drifts for root cause analysis.
135
+ *
136
+ * @param options - Deploy registration options
137
+ * @returns True if deploy was registered successfully, false otherwise
138
+ *
139
+ * @example
140
+ * ```typescript
141
+ * import { registerDeploy } from '@turingpulse/sdk';
142
+ *
143
+ * // Manual registration
144
+ * await registerDeploy({
145
+ * workflowId: 'chat-assistant',
146
+ * version: 'v1.2.3',
147
+ * gitSha: process.env.GIT_SHA,
148
+ * commitMessage: process.env.GIT_COMMIT_MSG,
149
+ * });
150
+ *
151
+ * // Auto-detect from CI/CD environment
152
+ * await registerDeploy({
153
+ * workflowId: 'chat-assistant',
154
+ * autoDetect: true,
155
+ * });
156
+ * ```
157
+ */
158
+ export async function registerDeploy(options) {
159
+ let { version, gitSha, commitMessage, metadata, deployedAt } = options;
160
+ const { workflowId, autoDetect = true } = options;
161
+ if (autoDetect) {
162
+ const detected = AutoDeployDetector.detect();
163
+ if (detected) {
164
+ gitSha = gitSha || detected.gitSha;
165
+ version = version || detected.versionTag;
166
+ commitMessage = commitMessage || detected.commitMessage;
167
+ deployedAt = deployedAt || detected.deployedAt;
168
+ if (detected.metadata) {
169
+ metadata = { ...(detected.metadata || {}), ...(metadata || {}) };
170
+ }
171
+ }
172
+ }
173
+ let plugin;
174
+ try {
175
+ plugin = getInstance();
176
+ }
177
+ catch (error) {
178
+ if (error instanceof PluginNotInitializedError) {
179
+ // eslint-disable-next-line no-console
180
+ console.warn('Cannot register deploy: TuringPulse plugin not initialized');
181
+ return false;
182
+ }
183
+ throw error;
184
+ }
185
+ const payload = {
186
+ workflow_id: workflowId,
187
+ version_tag: version,
188
+ git_sha: gitSha,
189
+ commit_message: commitMessage,
190
+ deployed_at: (deployedAt || new Date()).toISOString(),
191
+ metadata: metadata || {},
192
+ };
193
+ try {
194
+ const result = (await plugin.client.postDeploy(payload));
195
+ return result?.success ?? false;
196
+ }
197
+ catch (error) {
198
+ // eslint-disable-next-line no-console
199
+ console.warn('Failed to register deploy:', safeErrorMessage(error));
200
+ return false;
201
+ }
202
+ }
203
+ //# sourceMappingURL=deploy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy.js","sourceRoot":"","sources":["../src/deploy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ export declare class TuringPulsePluginError extends Error {
2
+ constructor(message: string);
3
+ }
4
+ export declare class PluginNotInitializedError extends TuringPulsePluginError {
5
+ constructor();
6
+ }
7
+ export declare class TriggerNotFoundError extends TuringPulsePluginError {
8
+ constructor(key: string);
9
+ }
10
+ export declare class GovernanceBlockedError extends TuringPulsePluginError {
11
+ readonly reason: string | undefined;
12
+ readonly policyIds: string[];
13
+ constructor(reason?: string, policyIds?: string[]);
14
+ }
15
+ export declare class ConfigurationError extends TuringPulsePluginError {
16
+ constructor(message: string);
17
+ }
18
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,sBAAuB,SAAQ,KAAK;gBACnC,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,yBAA0B,SAAQ,sBAAsB;;CAQpE;AAED,qBAAa,oBAAqB,SAAQ,sBAAsB;gBAClD,GAAG,EAAE,MAAM;CAIxB;AAED,qBAAa,sBAAuB,SAAQ,sBAAsB;IAChE,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC;gBAEjB,MAAM,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE;CAQlD;AAED,qBAAa,kBAAmB,SAAQ,sBAAsB;gBAChD,OAAO,EAAE,MAAM;CAI5B"}
package/dist/errors.js ADDED
@@ -0,0 +1,34 @@
1
+ export class TuringPulsePluginError extends Error {
2
+ constructor(message) {
3
+ super(message);
4
+ this.name = 'TuringPulsePluginError';
5
+ }
6
+ }
7
+ export class PluginNotInitializedError extends TuringPulsePluginError {
8
+ constructor() {
9
+ super('TuringPulse plugin is not initialized. ' +
10
+ 'Call init(...) once or set TP_API_KEY env var.');
11
+ this.name = 'PluginNotInitializedError';
12
+ }
13
+ }
14
+ export class TriggerNotFoundError extends TuringPulsePluginError {
15
+ constructor(key) {
16
+ super(`No trigger registered for key "${key}".`);
17
+ this.name = 'TriggerNotFoundError';
18
+ }
19
+ }
20
+ export class GovernanceBlockedError extends TuringPulsePluginError {
21
+ constructor(reason, policyIds) {
22
+ super(`Execution blocked by governance policy: ${reason ?? 'no reason provided'}`);
23
+ this.name = 'GovernanceBlockedError';
24
+ this.reason = reason;
25
+ this.policyIds = policyIds ?? [];
26
+ }
27
+ }
28
+ export class ConfigurationError extends TuringPulsePluginError {
29
+ constructor(message) {
30
+ super(message);
31
+ this.name = 'ConfigurationError';
32
+ }
33
+ }
34
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,sBAAuB,SAAQ,KAAK;IAC/C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;IACvC,CAAC;CACF;AAED,MAAM,OAAO,yBAA0B,SAAQ,sBAAsB;IACnE;QACE,KAAK,CACH,yCAAyC;YACzC,gDAAgD,CACjD,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,2BAA2B,CAAC;IAC1C,CAAC;CACF;AAED,MAAM,OAAO,oBAAqB,SAAQ,sBAAsB;IAC9D,YAAY,GAAW;QACrB,KAAK,CAAC,kCAAkC,GAAG,IAAI,CAAC,CAAC;QACjD,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;IACrC,CAAC;CACF;AAED,MAAM,OAAO,sBAAuB,SAAQ,sBAAsB;IAIhE,YAAY,MAAe,EAAE,SAAoB;QAC/C,KAAK,CACH,2CAA2C,MAAM,IAAI,oBAAoB,EAAE,CAC5E,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;QACrC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,SAAS,GAAG,SAAS,IAAI,EAAE,CAAC;IACnC,CAAC;CACF;AAED,MAAM,OAAO,kBAAmB,SAAQ,sBAAsB;IAC5D,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Event construction extracted from the plugin to satisfy SRP.
3
+ *
4
+ * EventBuilder handles AgentEvent assembly from ExecutionContext,
5
+ * including metadata, tokens, tool calls, and KPI results.
6
+ */
7
+ import type { AgentEvent } from '@turingpulse/interfaces';
8
+ import { TuringPulseConfig } from './config';
9
+ import { ExecutionContext } from './context';
10
+ import { InstrumentationOptions } from './instrumentation';
11
+ import { KPIResult } from './kpi';
12
+ export declare class EventBuilder {
13
+ private readonly config;
14
+ private readonly redactFieldNames;
15
+ constructor(config: TuringPulseConfig);
16
+ build(context: ExecutionContext, options: InstrumentationOptions, kpiResults: KPIResult[]): AgentEvent;
17
+ private assembleMetadata;
18
+ private applyRedaction;
19
+ private redactValue;
20
+ }
21
+ //# sourceMappingURL=eventBuilder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eventBuilder.d.ts","sourceRoot":"","sources":["../src/eventBuilder.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAE1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAE7C,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAe,MAAM,OAAO,CAAC;AAI/C,qBAAa,YAAY;IAGX,OAAO,CAAC,QAAQ,CAAC,MAAM;IAFnC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAc;gBAElB,MAAM,EAAE,iBAAiB;IAMtD,KAAK,CACH,OAAO,EAAE,gBAAgB,EACzB,OAAO,EAAE,sBAAsB,EAC/B,UAAU,EAAE,SAAS,EAAE,GACtB,UAAU;IAsBb,OAAO,CAAC,gBAAgB;IA2ExB,OAAO,CAAC,cAAc;IAStB,OAAO,CAAC,WAAW;CAgBpB"}
@@ -0,0 +1,127 @@
1
+ /**
2
+ * Event construction extracted from the plugin to satisfy SRP.
3
+ *
4
+ * EventBuilder handles AgentEvent assembly from ExecutionContext,
5
+ * including metadata, tokens, tool calls, and KPI results.
6
+ */
7
+ import { kpiMetadata } from './kpi';
8
+ const MAX_FIELD_SIZE = 500000;
9
+ export class EventBuilder {
10
+ constructor(config) {
11
+ this.config = config;
12
+ this.redactFieldNames = new Set((config.redactFields ?? []).map((f) => f.toLowerCase()));
13
+ }
14
+ build(context, options, kpiResults) {
15
+ const metadata = this.assembleMetadata(context, options, kpiResults);
16
+ return {
17
+ runId: context.runId,
18
+ agentId: context.agentId,
19
+ timestamp: (context.completedAt ?? context.startedAt).toISOString(),
20
+ type: 'agent_step',
21
+ payload: {
22
+ name: context.operation,
23
+ durationMs: context.durationMs,
24
+ status: context.status,
25
+ metadata,
26
+ tokens: context.tokensInput > 0 || context.tokensOutput > 0
27
+ ? { prompt: context.tokensInput, completion: context.tokensOutput }
28
+ : undefined,
29
+ costUsd: context.costUsd > 0 ? context.costUsd : undefined,
30
+ },
31
+ };
32
+ }
33
+ assembleMetadata(context, options, kpiResults) {
34
+ const metadata = {
35
+ ...Object.fromEntries(Object.entries(context.labels).map(([k, v]) => [k, String(v)])),
36
+ ...Object.fromEntries(Object.entries(context.metadata).map(([k, v]) => [k, String(v)])),
37
+ 'agent.status': context.status,
38
+ 'agent.hidden_entrypoint': String(context.hiddenEntrypoint),
39
+ 'agent.run_id': context.runId,
40
+ 'agent.operation': context.operation,
41
+ span_id: context.spanId,
42
+ depth: String(context.depth),
43
+ };
44
+ if (context.parentSpanId)
45
+ metadata['parent_span_id'] = context.parentSpanId;
46
+ if (context.model)
47
+ metadata['model'] = context.model;
48
+ if (context.provider)
49
+ metadata['provider'] = context.provider;
50
+ if (context.nodeType)
51
+ metadata['node_type'] = context.nodeType;
52
+ if (context.framework)
53
+ metadata['framework'] = context.framework;
54
+ if (context.promptText)
55
+ metadata['prompt'] = context.promptText.slice(0, MAX_FIELD_SIZE);
56
+ if (context.systemPrompt)
57
+ metadata['system_prompt'] = context.systemPrompt.slice(0, MAX_FIELD_SIZE);
58
+ if (context.inputData)
59
+ metadata['input'] = context.inputData.slice(0, MAX_FIELD_SIZE);
60
+ if (context.outputData)
61
+ metadata['output'] = context.outputData.slice(0, MAX_FIELD_SIZE);
62
+ if (context.availableTools?.length) {
63
+ metadata['available_tools'] = JSON.stringify(context.availableTools);
64
+ }
65
+ if (context.workflowName)
66
+ metadata['workflow_name'] = context.workflowName;
67
+ if (context.triggerKey)
68
+ metadata['agent.trigger_key'] = context.triggerKey;
69
+ if (context.error instanceof Error) {
70
+ metadata['error.type'] = context.error.name;
71
+ metadata['error.message'] = context.error.message;
72
+ }
73
+ if (options.governance) {
74
+ metadata['governance.hitl'] = String(options.governance.hitl);
75
+ metadata['governance.hatl'] = String(options.governance.hatl);
76
+ metadata['governance.hotl'] = String(options.governance.hotl);
77
+ }
78
+ for (const result of kpiResults) {
79
+ Object.assign(metadata, kpiMetadata(result));
80
+ }
81
+ if (context.attachments.length > 0) {
82
+ metadata['attachments'] = JSON.stringify(context.attachments);
83
+ }
84
+ if (context.inputContext) {
85
+ metadata['input_context'] = context.inputContext.slice(0, MAX_FIELD_SIZE);
86
+ }
87
+ if (context.toolCalls.length > 0) {
88
+ metadata['tool_calls'] = JSON.stringify(context.toolCalls.map((tc) => ({
89
+ tool_name: tc.toolName,
90
+ tool_args: this.redactValue(tc.toolArgs),
91
+ tool_result: tc.toolResult ?? '',
92
+ tool_id: tc.toolId ?? '',
93
+ success: tc.success,
94
+ error_message: tc.errorMessage,
95
+ })));
96
+ }
97
+ this.applyRedaction(metadata);
98
+ return metadata;
99
+ }
100
+ applyRedaction(metadata) {
101
+ if (this.redactFieldNames.size === 0)
102
+ return;
103
+ for (const key of Object.keys(metadata)) {
104
+ if (this.redactFieldNames.has(key.toLowerCase())) {
105
+ metadata[key] = '[REDACTED]';
106
+ }
107
+ }
108
+ }
109
+ redactValue(value, depth = 0) {
110
+ if (depth > 20 || this.redactFieldNames.size === 0)
111
+ return value;
112
+ if (typeof value === 'object' && value !== null && !Array.isArray(value)) {
113
+ const result = {};
114
+ for (const [k, v] of Object.entries(value)) {
115
+ result[k] = this.redactFieldNames.has(k.toLowerCase())
116
+ ? '[REDACTED]'
117
+ : this.redactValue(v, depth + 1);
118
+ }
119
+ return result;
120
+ }
121
+ if (Array.isArray(value)) {
122
+ return value.map((item) => this.redactValue(item, depth + 1));
123
+ }
124
+ return value;
125
+ }
126
+ }
127
+ //# sourceMappingURL=eventBuilder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eventBuilder.js","sourceRoot":"","sources":["../src/eventBuilder.ts"],"names":[],"mappings":"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"}