optimus-tool-call 0.1.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 (131) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +191 -0
  3. package/dist/index.d.ts +9 -0
  4. package/dist/index.d.ts.map +1 -0
  5. package/dist/index.js +128 -0
  6. package/dist/index.js.map +1 -0
  7. package/dist/lib/classify/builtins.d.ts +7 -0
  8. package/dist/lib/classify/builtins.d.ts.map +1 -0
  9. package/dist/lib/classify/builtins.js +107 -0
  10. package/dist/lib/classify/builtins.js.map +1 -0
  11. package/dist/lib/classify/constants.d.ts +36 -0
  12. package/dist/lib/classify/constants.d.ts.map +1 -0
  13. package/dist/lib/classify/constants.js +35 -0
  14. package/dist/lib/classify/constants.js.map +1 -0
  15. package/dist/lib/classify/dispatch.d.ts +8 -0
  16. package/dist/lib/classify/dispatch.d.ts.map +1 -0
  17. package/dist/lib/classify/dispatch.js +95 -0
  18. package/dist/lib/classify/dispatch.js.map +1 -0
  19. package/dist/lib/classify/flags.d.ts +6 -0
  20. package/dist/lib/classify/flags.d.ts.map +1 -0
  21. package/dist/lib/classify/flags.js +19 -0
  22. package/dist/lib/classify/flags.js.map +1 -0
  23. package/dist/lib/classify/handlers/database-cli.d.ts +3 -0
  24. package/dist/lib/classify/handlers/database-cli.d.ts.map +1 -0
  25. package/dist/lib/classify/handlers/database-cli.js +68 -0
  26. package/dist/lib/classify/handlers/database-cli.js.map +1 -0
  27. package/dist/lib/classify/handlers/docker.d.ts +6 -0
  28. package/dist/lib/classify/handlers/docker.d.ts.map +1 -0
  29. package/dist/lib/classify/handlers/docker.js +27 -0
  30. package/dist/lib/classify/handlers/docker.js.map +1 -0
  31. package/dist/lib/classify/handlers/fs-delete.d.ts +6 -0
  32. package/dist/lib/classify/handlers/fs-delete.d.ts.map +1 -0
  33. package/dist/lib/classify/handlers/fs-delete.js +14 -0
  34. package/dist/lib/classify/handlers/fs-delete.js.map +1 -0
  35. package/dist/lib/classify/handlers/git.d.ts +6 -0
  36. package/dist/lib/classify/handlers/git.d.ts.map +1 -0
  37. package/dist/lib/classify/handlers/git.js +83 -0
  38. package/dist/lib/classify/handlers/git.js.map +1 -0
  39. package/dist/lib/classify/handlers/network-http.d.ts +10 -0
  40. package/dist/lib/classify/handlers/network-http.d.ts.map +1 -0
  41. package/dist/lib/classify/handlers/network-http.js +46 -0
  42. package/dist/lib/classify/handlers/network-http.js.map +1 -0
  43. package/dist/lib/classify/handlers/packages.d.ts +6 -0
  44. package/dist/lib/classify/handlers/packages.d.ts.map +1 -0
  45. package/dist/lib/classify/handlers/packages.js +18 -0
  46. package/dist/lib/classify/handlers/packages.js.map +1 -0
  47. package/dist/lib/classify/handlers/sed-awk.d.ts +10 -0
  48. package/dist/lib/classify/handlers/sed-awk.d.ts.map +1 -0
  49. package/dist/lib/classify/handlers/sed-awk.js +40 -0
  50. package/dist/lib/classify/handlers/sed-awk.js.map +1 -0
  51. package/dist/lib/classify/handlers/shell-and-runtime.d.ts +14 -0
  52. package/dist/lib/classify/handlers/shell-and-runtime.d.ts.map +1 -0
  53. package/dist/lib/classify/handlers/shell-and-runtime.js +75 -0
  54. package/dist/lib/classify/handlers/shell-and-runtime.js.map +1 -0
  55. package/dist/lib/classify/index.d.ts +6 -0
  56. package/dist/lib/classify/index.d.ts.map +1 -0
  57. package/dist/lib/classify/index.js +6 -0
  58. package/dist/lib/classify/index.js.map +1 -0
  59. package/dist/lib/classify/interpreter.d.ts +5 -0
  60. package/dist/lib/classify/interpreter.d.ts.map +1 -0
  61. package/dist/lib/classify/interpreter.js +16 -0
  62. package/dist/lib/classify/interpreter.js.map +1 -0
  63. package/dist/lib/classify/pipeline.d.ts +10 -0
  64. package/dist/lib/classify/pipeline.d.ts.map +1 -0
  65. package/dist/lib/classify/pipeline.js +105 -0
  66. package/dist/lib/classify/pipeline.js.map +1 -0
  67. package/dist/lib/classify.d.ts +2 -0
  68. package/dist/lib/classify.d.ts.map +1 -0
  69. package/dist/lib/classify.js +2 -0
  70. package/dist/lib/classify.js.map +1 -0
  71. package/dist/lib/streaming.d.ts +17 -0
  72. package/dist/lib/streaming.d.ts.map +1 -0
  73. package/dist/lib/streaming.js +166 -0
  74. package/dist/lib/streaming.js.map +1 -0
  75. package/dist/lib/telemetry/build-event.d.ts +6 -0
  76. package/dist/lib/telemetry/build-event.d.ts.map +1 -0
  77. package/dist/lib/telemetry/build-event.js +115 -0
  78. package/dist/lib/telemetry/build-event.js.map +1 -0
  79. package/dist/lib/telemetry/command-tokenize.d.ts +6 -0
  80. package/dist/lib/telemetry/command-tokenize.d.ts.map +1 -0
  81. package/dist/lib/telemetry/command-tokenize.js +38 -0
  82. package/dist/lib/telemetry/command-tokenize.js.map +1 -0
  83. package/dist/lib/telemetry/index.d.ts +9 -0
  84. package/dist/lib/telemetry/index.d.ts.map +1 -0
  85. package/dist/lib/telemetry/index.js +9 -0
  86. package/dist/lib/telemetry/index.js.map +1 -0
  87. package/dist/lib/telemetry/sensitivity.d.ts +7 -0
  88. package/dist/lib/telemetry/sensitivity.d.ts.map +1 -0
  89. package/dist/lib/telemetry/sensitivity.js +81 -0
  90. package/dist/lib/telemetry/sensitivity.js.map +1 -0
  91. package/dist/lib/telemetry/serialize.d.ts +3 -0
  92. package/dist/lib/telemetry/serialize.d.ts.map +1 -0
  93. package/dist/lib/telemetry/serialize.js +17 -0
  94. package/dist/lib/telemetry/serialize.js.map +1 -0
  95. package/dist/lib/telemetry/types.d.ts +36 -0
  96. package/dist/lib/telemetry/types.d.ts.map +1 -0
  97. package/dist/lib/telemetry/types.js +14 -0
  98. package/dist/lib/telemetry/types.js.map +1 -0
  99. package/dist/lib/telemetry.d.ts +2 -0
  100. package/dist/lib/telemetry.d.ts.map +1 -0
  101. package/dist/lib/telemetry.js +2 -0
  102. package/dist/lib/telemetry.js.map +1 -0
  103. package/dist/test/classify.test.d.ts +2 -0
  104. package/dist/test/classify.test.d.ts.map +1 -0
  105. package/dist/test/classify.test.js +210 -0
  106. package/dist/test/classify.test.js.map +1 -0
  107. package/dist/test/index.test.d.ts +2 -0
  108. package/dist/test/index.test.d.ts.map +1 -0
  109. package/dist/test/index.test.js +376 -0
  110. package/dist/test/index.test.js.map +1 -0
  111. package/dist/test/pipeline.test.d.ts +2 -0
  112. package/dist/test/pipeline.test.d.ts.map +1 -0
  113. package/dist/test/pipeline.test.js +139 -0
  114. package/dist/test/pipeline.test.js.map +1 -0
  115. package/dist/test/sensitivity.test.d.ts +2 -0
  116. package/dist/test/sensitivity.test.d.ts.map +1 -0
  117. package/dist/test/sensitivity.test.js +192 -0
  118. package/dist/test/sensitivity.test.js.map +1 -0
  119. package/dist/test/streaming.test.d.ts +2 -0
  120. package/dist/test/streaming.test.d.ts.map +1 -0
  121. package/dist/test/streaming.test.js +202 -0
  122. package/dist/test/streaming.test.js.map +1 -0
  123. package/dist/test/telemetry.test.d.ts +2 -0
  124. package/dist/test/telemetry.test.d.ts.map +1 -0
  125. package/dist/test/telemetry.test.js +204 -0
  126. package/dist/test/telemetry.test.js.map +1 -0
  127. package/dist/test/tokenize.test.d.ts +2 -0
  128. package/dist/test/tokenize.test.d.ts.map +1 -0
  129. package/dist/test/tokenize.test.js +157 -0
  130. package/dist/test/tokenize.test.js.map +1 -0
  131. package/package.json +47 -0
@@ -0,0 +1,192 @@
1
+ import { test } from "node:test";
2
+ import assert from "node:assert";
3
+ import { isSensitivePath, isCredentialSearchPattern, isSensitiveUrl, } from "../lib/telemetry/sensitivity.js";
4
+ // isSensitivePath tests
5
+ test("isSensitivePath - ssh directory", () => {
6
+ assert.strictEqual(isSensitivePath("~/.ssh/id_rsa"), true);
7
+ });
8
+ test("isSensitivePath - aws directory", () => {
9
+ assert.strictEqual(isSensitivePath("~/.aws/credentials"), true);
10
+ });
11
+ test("isSensitivePath - gnupg directory", () => {
12
+ assert.strictEqual(isSensitivePath("~/.gnupg/pubring.gpg"), true);
13
+ });
14
+ test("isSensitivePath - docker directory", () => {
15
+ assert.strictEqual(isSensitivePath("~/.docker/config.json"), true);
16
+ });
17
+ test("isSensitivePath - kubernetes directory", () => {
18
+ assert.strictEqual(isSensitivePath("~/.kube/config"), true);
19
+ });
20
+ test("isSensitivePath - gcloud directory", () => {
21
+ assert.strictEqual(isSensitivePath("~/.config/gcloud/application_default_credentials.json"), true);
22
+ });
23
+ test("isSensitivePath - gh directory", () => {
24
+ assert.strictEqual(isSensitivePath("~/.config/gh/hosts.yml"), true);
25
+ });
26
+ test("isSensitivePath - git credentials", () => {
27
+ assert.strictEqual(isSensitivePath("~/.git-credentials"), true);
28
+ });
29
+ test("isSensitivePath - netrc", () => {
30
+ assert.strictEqual(isSensitivePath("~/.netrc"), true);
31
+ });
32
+ test("isSensitivePath - env files", () => {
33
+ assert.strictEqual(isSensitivePath("/.env"), true);
34
+ assert.strictEqual(isSensitivePath("/.env.local"), true);
35
+ assert.strictEqual(isSensitivePath("/app/.env.production"), true);
36
+ });
37
+ test("isSensitivePath - npmrc", () => {
38
+ assert.strictEqual(isSensitivePath("/.npmrc"), true);
39
+ });
40
+ test("isSensitivePath - pypirc", () => {
41
+ assert.strictEqual(isSensitivePath("/.pypirc"), true);
42
+ });
43
+ test("isSensitivePath - credentials filename", () => {
44
+ assert.strictEqual(isSensitivePath("/credentials"), true);
45
+ assert.strictEqual(isSensitivePath("/path/credentials"), true);
46
+ });
47
+ test("isSensitivePath - secret filename", () => {
48
+ assert.strictEqual(isSensitivePath("/secret"), true);
49
+ assert.strictEqual(isSensitivePath("/app/secret"), true);
50
+ });
51
+ test("isSensitivePath - token filename", () => {
52
+ assert.strictEqual(isSensitivePath("/token"), true);
53
+ });
54
+ test("isSensitivePath - id_rsa", () => {
55
+ assert.strictEqual(isSensitivePath("id_rsa"), true);
56
+ });
57
+ test("isSensitivePath - id_ed25519", () => {
58
+ assert.strictEqual(isSensitivePath("id_ed25519"), true);
59
+ });
60
+ test("isSensitivePath - private key", () => {
61
+ assert.strictEqual(isSensitivePath("private_key.pem"), true);
62
+ });
63
+ test("isSensitivePath - normal path", () => {
64
+ assert.strictEqual(isSensitivePath("/tmp/file.txt"), false);
65
+ assert.strictEqual(isSensitivePath("/home/user/documents/file.txt"), false);
66
+ assert.strictEqual(isSensitivePath("/var/log/app.log"), false);
67
+ });
68
+ test("isSensitivePath - case insensitive", () => {
69
+ assert.strictEqual(isSensitivePath("~/.SSH/id_rsa"), true);
70
+ assert.strictEqual(isSensitivePath("~/.AWS/credentials"), true);
71
+ });
72
+ test("isSensitivePath - empty string", () => {
73
+ assert.strictEqual(isSensitivePath(""), false);
74
+ });
75
+ test("isSensitivePath - null/undefined handling", () => {
76
+ // @ts-ignore - testing runtime behavior
77
+ assert.strictEqual(isSensitivePath(null), false);
78
+ // @ts-ignore
79
+ assert.strictEqual(isSensitivePath(undefined), false);
80
+ });
81
+ // isCredentialSearchPattern tests
82
+ test("isCredentialSearchPattern - password", () => {
83
+ assert.strictEqual(isCredentialSearchPattern("password"), true);
84
+ });
85
+ test("isCredentialSearchPattern - secret", () => {
86
+ assert.strictEqual(isCredentialSearchPattern("secret"), true);
87
+ });
88
+ test("isCredentialSearchPattern - token", () => {
89
+ assert.strictEqual(isCredentialSearchPattern("token"), true);
90
+ });
91
+ test("isCredentialSearchPattern - api_key", () => {
92
+ assert.strictEqual(isCredentialSearchPattern("api_key"), true);
93
+ });
94
+ test("isCredentialSearchPattern - apikey", () => {
95
+ assert.strictEqual(isCredentialSearchPattern("apikey"), true);
96
+ });
97
+ test("isCredentialSearchPattern - private_key", () => {
98
+ assert.strictEqual(isCredentialSearchPattern("private_key"), true);
99
+ });
100
+ test("isCredentialSearchPattern - begin private (regex)", () => {
101
+ assert.strictEqual(isCredentialSearchPattern("begin.*private"), true);
102
+ });
103
+ test("isCredentialSearchPattern - aws_secret", () => {
104
+ assert.strictEqual(isCredentialSearchPattern("aws_secret"), true);
105
+ });
106
+ test("isCredentialSearchPattern - bearer", () => {
107
+ assert.strictEqual(isCredentialSearchPattern("bearer"), true);
108
+ });
109
+ test("isCredentialSearchPattern - authorization", () => {
110
+ assert.strictEqual(isCredentialSearchPattern("authorization"), true);
111
+ });
112
+ test("isCredentialSearchPattern - case insensitive", () => {
113
+ assert.strictEqual(isCredentialSearchPattern("PASSWORD"), true);
114
+ assert.strictEqual(isCredentialSearchPattern("Secret"), true);
115
+ });
116
+ test("isCredentialSearchPattern - normal pattern", () => {
117
+ assert.strictEqual(isCredentialSearchPattern("TODO"), false);
118
+ assert.strictEqual(isCredentialSearchPattern("function\\s+\\w+"), false);
119
+ assert.strictEqual(isCredentialSearchPattern("version"), false);
120
+ });
121
+ test("isCredentialSearchPattern - empty string", () => {
122
+ assert.strictEqual(isCredentialSearchPattern(""), false);
123
+ });
124
+ test("isCredentialSearchPattern - partial match", () => {
125
+ assert.strictEqual(isCredentialSearchPattern("my_api_key"), true);
126
+ assert.strictEqual(isCredentialSearchPattern("password_hash"), true);
127
+ });
128
+ // isSensitiveUrl tests
129
+ test("isSensitiveUrl - file protocol", () => {
130
+ assert.strictEqual(isSensitiveUrl("file:///etc/passwd"), true);
131
+ });
132
+ test("isSensitiveUrl - localhost", () => {
133
+ assert.strictEqual(isSensitiveUrl("http://localhost:8080"), true);
134
+ });
135
+ test("isSensitiveUrl - 127.0.0.1", () => {
136
+ assert.strictEqual(isSensitiveUrl("http://127.0.0.1:3000"), true);
137
+ });
138
+ test("isSensitiveUrl - 0.0.0.0", () => {
139
+ assert.strictEqual(isSensitiveUrl("http://0.0.0.0:8000"), true);
140
+ });
141
+ test("isSensitiveUrl - AWS metadata service", () => {
142
+ assert.strictEqual(isSensitiveUrl("http://169.254.169.254"), true);
143
+ });
144
+ test("isSensitiveUrl - private IP 10.x", () => {
145
+ assert.strictEqual(isSensitiveUrl("http://10.0.0.1"), true);
146
+ assert.strictEqual(isSensitiveUrl("http://10.255.255.255"), true);
147
+ });
148
+ test("isSensitiveUrl - private IP 172.16-31", () => {
149
+ assert.strictEqual(isSensitiveUrl("http://172.16.0.1"), true);
150
+ assert.strictEqual(isSensitiveUrl("http://172.31.255.255"), true);
151
+ });
152
+ test("isSensitiveUrl - private IP 192.168", () => {
153
+ assert.strictEqual(isSensitiveUrl("http://192.168.0.1"), true);
154
+ assert.strictEqual(isSensitiveUrl("http://192.168.255.255"), true);
155
+ });
156
+ test("isSensitiveUrl - internal subdomain", () => {
157
+ assert.strictEqual(isSensitiveUrl("http://internal.example.com"), true);
158
+ });
159
+ test("isSensitiveUrl - local domain", () => {
160
+ assert.strictEqual(isSensitiveUrl("http://api.local"), true);
161
+ });
162
+ test("isSensitiveUrl - internal domain", () => {
163
+ assert.strictEqual(isSensitiveUrl("http://api.internal"), true);
164
+ });
165
+ test("isSensitiveUrl - public URL", () => {
166
+ assert.strictEqual(isSensitiveUrl("https://www.example.com"), false);
167
+ assert.strictEqual(isSensitiveUrl("https://api.github.com"), false);
168
+ });
169
+ test("isSensitiveUrl - https localhost", () => {
170
+ assert.strictEqual(isSensitiveUrl("https://localhost:3000"), true);
171
+ });
172
+ test("isSensitiveUrl - case insensitive", () => {
173
+ assert.strictEqual(isSensitiveUrl("HTTP://LOCALHOST:8080"), true);
174
+ assert.strictEqual(isSensitiveUrl("FILE:///etc/passwd"), true);
175
+ });
176
+ test("isSensitiveUrl - empty string", () => {
177
+ assert.strictEqual(isSensitiveUrl(""), false);
178
+ });
179
+ test("isSensitiveUrl - null/undefined handling", () => {
180
+ // @ts-ignore - testing runtime behavior
181
+ assert.strictEqual(isSensitiveUrl(null), false);
182
+ // @ts-ignore
183
+ assert.strictEqual(isSensitiveUrl(undefined), false);
184
+ });
185
+ test("isSensitiveUrl - port numbers", () => {
186
+ assert.strictEqual(isSensitiveUrl("http://192.168.1.1:8000"), true);
187
+ assert.strictEqual(isSensitiveUrl("http://10.0.0.1:5432"), true);
188
+ });
189
+ test("isSensitiveUrl - path component doesn't override", () => {
190
+ assert.strictEqual(isSensitiveUrl("http://10.0.0.1/api/v1/users"), true);
191
+ });
192
+ //# sourceMappingURL=sensitivity.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sensitivity.test.js","sourceRoot":"","sources":["../../src/test/sensitivity.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=streaming.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"streaming.test.d.ts","sourceRoot":"","sources":["../../src/test/streaming.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,202 @@
1
+ import { test } from "node:test";
2
+ import assert from "node:assert";
3
+ // Note: These tests are basic structure tests. Full integration tests with actual HTTP
4
+ // would require mocking fetch/http, which is done in integration tests.
5
+ // Helper to create a mock event
6
+ function createMockEvent() {
7
+ return {
8
+ timestamp: new Date().toISOString(),
9
+ agent_identity: "test-agent",
10
+ event_type: "tool_call",
11
+ session_id: "test-session",
12
+ tool_use_id: "test-tool-use",
13
+ hook_event_name: "preToolUse",
14
+ working_directory: "/tmp",
15
+ tool_call_metadata: {
16
+ tool_name: "Bash",
17
+ action_type: "filesystem_read",
18
+ command_components: ["ls", "-la"],
19
+ },
20
+ };
21
+ }
22
+ test("Event object structure - has required fields", () => {
23
+ const event = createMockEvent();
24
+ assert.strictEqual(typeof event.timestamp, "string");
25
+ assert.strictEqual(event.agent_identity, "test-agent");
26
+ assert.strictEqual(event.event_type, "tool_call");
27
+ assert(event.tool_call_metadata);
28
+ assert.strictEqual(event.tool_call_metadata.tool_name, "Bash");
29
+ assert.strictEqual(event.tool_call_metadata.action_type, "filesystem_read");
30
+ });
31
+ test("Event object - metadata structure", () => {
32
+ const event = createMockEvent();
33
+ const meta = event.tool_call_metadata;
34
+ assert.strictEqual(typeof meta.tool_name, "string");
35
+ assert.strictEqual(typeof meta.action_type, "string");
36
+ assert(Array.isArray(meta.command_components) || meta.command_components === undefined);
37
+ });
38
+ test("Event object - optional fields can be null", () => {
39
+ const event = {
40
+ timestamp: new Date().toISOString(),
41
+ agent_identity: "test",
42
+ event_type: "tool_call",
43
+ tool_call_metadata: {
44
+ tool_name: "Read",
45
+ action_type: "filesystem_read",
46
+ },
47
+ };
48
+ assert.strictEqual(event.session_id, undefined);
49
+ assert.strictEqual(event.tool_use_id, undefined);
50
+ });
51
+ test("Event serialization - JSON.stringify works", () => {
52
+ const event = createMockEvent();
53
+ const json = JSON.stringify(event);
54
+ assert(typeof json === "string");
55
+ const parsed = JSON.parse(json);
56
+ assert.strictEqual(parsed.agent_identity, "test-agent");
57
+ });
58
+ test("Event batch structure", () => {
59
+ const events = [createMockEvent(), createMockEvent(), createMockEvent()];
60
+ const batch = { events };
61
+ assert.strictEqual(batch.events.length, 3);
62
+ const json = JSON.stringify(batch);
63
+ const parsed = JSON.parse(json);
64
+ assert.strictEqual(parsed.events.length, 3);
65
+ });
66
+ test("MCP event - has mcp_server and mcp_tool", () => {
67
+ const event = {
68
+ timestamp: new Date().toISOString(),
69
+ agent_identity: "claude",
70
+ event_type: "tool_call",
71
+ tool_call_metadata: {
72
+ tool_name: "mcp__filesystem__read_file",
73
+ action_type: "mcp_tool_call",
74
+ mcp_server: "filesystem",
75
+ mcp_tool: "read_file",
76
+ },
77
+ };
78
+ assert.strictEqual(event.tool_call_metadata.mcp_server, "filesystem");
79
+ assert.strictEqual(event.tool_call_metadata.mcp_tool, "read_file");
80
+ });
81
+ test("Event - excludes undefined nested fields in serialization", () => {
82
+ const event = {
83
+ timestamp: new Date().toISOString(),
84
+ agent_identity: "test",
85
+ event_type: "tool_call",
86
+ tool_call_metadata: {
87
+ tool_name: "Read",
88
+ action_type: "filesystem_read",
89
+ },
90
+ };
91
+ const json = JSON.stringify(event);
92
+ const parsed = JSON.parse(json);
93
+ // undefined fields should not appear in JSON
94
+ assert(!("session_id" in parsed) || parsed.session_id === undefined);
95
+ });
96
+ test("Event with all optional fields", () => {
97
+ const event = {
98
+ timestamp: "2024-01-01T00:00:00Z",
99
+ agent_identity: "claude-code",
100
+ event_type: "tool_call",
101
+ session_id: "session-123",
102
+ tool_use_id: "tooluse-456",
103
+ hook_event_name: "preToolUse",
104
+ working_directory: "/home/user/project",
105
+ tool_call_metadata: {
106
+ tool_name: "Bash",
107
+ action_type: "git_history_rewrite",
108
+ command_components: ["git", "push", "--force"],
109
+ file_path: null,
110
+ pattern: null,
111
+ tool_input: { command: "git push --force" },
112
+ },
113
+ };
114
+ assert.strictEqual(event.session_id, "session-123");
115
+ assert.strictEqual(event.working_directory, "/home/user/project");
116
+ assert.strictEqual(event.tool_call_metadata.command_components[0], "git");
117
+ });
118
+ test("Event - different action types", () => {
119
+ const actionTypes = [
120
+ "filesystem_read",
121
+ "filesystem_write",
122
+ "filesystem_delete",
123
+ "git_safe",
124
+ "git_write",
125
+ "git_remote_write",
126
+ "git_history_rewrite",
127
+ "network_outbound",
128
+ "network_write",
129
+ "package_install",
130
+ "lang_exec",
131
+ "container_exec",
132
+ "unknown",
133
+ ];
134
+ for (const actionType of actionTypes) {
135
+ const event = {
136
+ timestamp: new Date().toISOString(),
137
+ agent_identity: "test",
138
+ event_type: "tool_call",
139
+ tool_call_metadata: {
140
+ tool_name: "Test",
141
+ action_type: actionType,
142
+ },
143
+ };
144
+ assert.strictEqual(event.tool_call_metadata.action_type, actionType);
145
+ }
146
+ });
147
+ test("Event - different agent identities", () => {
148
+ const agents = ["claude", "cursor", "copilot", "unknown"];
149
+ for (const agent of agents) {
150
+ const event = {
151
+ timestamp: new Date().toISOString(),
152
+ agent_identity: agent,
153
+ event_type: "tool_call",
154
+ tool_call_metadata: {
155
+ tool_name: "Read",
156
+ action_type: "filesystem_read",
157
+ },
158
+ };
159
+ assert.strictEqual(event.agent_identity, agent);
160
+ }
161
+ });
162
+ test("Batch payload validation", () => {
163
+ const events = Array.from({ length: 50 }, (_, i) => ({
164
+ ...createMockEvent(),
165
+ tool_use_id: `tool-${i}`,
166
+ }));
167
+ const batch = { events };
168
+ assert.strictEqual(batch.events.length, 50);
169
+ // All should be serializable
170
+ const json = JSON.stringify(batch);
171
+ assert(json.length > 0);
172
+ const parsed = JSON.parse(json);
173
+ assert.strictEqual(parsed.events.length, 50);
174
+ });
175
+ test("Event timestamp format", () => {
176
+ const event = createMockEvent();
177
+ const timestamp = new Date(event.timestamp);
178
+ assert(!isNaN(timestamp.getTime()));
179
+ assert(event.timestamp.includes("T"));
180
+ assert(event.timestamp.includes("Z") || event.timestamp.includes("+"));
181
+ });
182
+ test("Tool input preservation", () => {
183
+ const toolInput = {
184
+ file_path: "/tmp/test.txt",
185
+ custom_field: "custom_value",
186
+ nested: { key: "value" },
187
+ };
188
+ const event = {
189
+ timestamp: new Date().toISOString(),
190
+ agent_identity: "test",
191
+ event_type: "tool_call",
192
+ tool_call_metadata: {
193
+ tool_name: "Read",
194
+ action_type: "filesystem_read",
195
+ tool_input: toolInput,
196
+ },
197
+ };
198
+ assert.strictEqual(event.tool_call_metadata.tool_input.file_path, "/tmp/test.txt");
199
+ assert.strictEqual(event.tool_call_metadata.tool_input.custom_field, "custom_value");
200
+ assert.deepStrictEqual(event.tool_call_metadata.tool_input.nested, { key: "value" });
201
+ });
202
+ //# sourceMappingURL=streaming.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"streaming.test.js","sourceRoot":"","sources":["../../src/test/streaming.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=telemetry.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry.test.d.ts","sourceRoot":"","sources":["../../src/test/telemetry.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,204 @@
1
+ import { test } from "node:test";
2
+ import assert from "node:assert";
3
+ import { buildTelemetryEvent, eventToDict } from "../lib/telemetry.js";
4
+ test("buildTelemetryEvent - null input returns null", () => {
5
+ assert.strictEqual(buildTelemetryEvent(null), null);
6
+ assert.strictEqual(buildTelemetryEvent(undefined), null);
7
+ });
8
+ test("buildTelemetryEvent - filesystem read", () => {
9
+ const inv = {
10
+ tool_name: "Read",
11
+ tool_input: { file_path: "/etc/passwd" },
12
+ };
13
+ const event = buildTelemetryEvent(inv, "test-agent");
14
+ assert(event);
15
+ assert.strictEqual(event.agent_identity, "test-agent");
16
+ assert.strictEqual(event.event_type, "tool_call");
17
+ assert.strictEqual(event.tool_call_metadata.action_type, "filesystem_read");
18
+ assert.strictEqual(event.tool_call_metadata.file_path, "/etc/passwd");
19
+ });
20
+ test("buildTelemetryEvent - filesystem write", () => {
21
+ const inv = {
22
+ tool_name: "Write",
23
+ tool_input: { file_path: "/tmp/test.txt" },
24
+ };
25
+ const event = buildTelemetryEvent(inv, "claude");
26
+ assert(event);
27
+ assert.strictEqual(event.tool_call_metadata.action_type, "filesystem_write");
28
+ });
29
+ test("buildTelemetryEvent - filesystem edit", () => {
30
+ const inv = {
31
+ tool_name: "Edit",
32
+ tool_input: { file_path: "/tmp/edit.txt" },
33
+ };
34
+ const event = buildTelemetryEvent(inv, "claude");
35
+ assert(event);
36
+ assert.strictEqual(event.tool_call_metadata.action_type, "filesystem_write");
37
+ });
38
+ test("buildTelemetryEvent - sensitive path access", () => {
39
+ const inv = {
40
+ tool_name: "Read",
41
+ tool_input: { file_path: "~/.ssh/id_rsa" },
42
+ };
43
+ const event = buildTelemetryEvent(inv, "claude");
44
+ assert(event);
45
+ assert.strictEqual(event.tool_call_metadata.action_type, "credential_access");
46
+ });
47
+ test("buildTelemetryEvent - credential search with grep", () => {
48
+ const inv = {
49
+ tool_name: "Grep",
50
+ tool_input: { pattern: "password" },
51
+ };
52
+ const event = buildTelemetryEvent(inv, "claude");
53
+ assert(event);
54
+ assert.strictEqual(event.tool_call_metadata.action_type, "credential_search");
55
+ assert.strictEqual(event.tool_call_metadata.pattern, "password");
56
+ });
57
+ test("buildTelemetryEvent - webfetch", () => {
58
+ const inv = {
59
+ tool_name: "WebFetch",
60
+ tool_input: { url: "https://example.com" },
61
+ };
62
+ const event = buildTelemetryEvent(inv, "claude");
63
+ assert(event);
64
+ assert.strictEqual(event.tool_call_metadata.action_type, "webfetch");
65
+ });
66
+ test("buildTelemetryEvent - websearch", () => {
67
+ const inv = {
68
+ tool_name: "WebSearch",
69
+ tool_input: { query: "security" },
70
+ };
71
+ const event = buildTelemetryEvent(inv, "claude");
72
+ assert(event);
73
+ assert.strictEqual(event.tool_call_metadata.action_type, "websearch");
74
+ });
75
+ test("buildTelemetryEvent - shell command classification", () => {
76
+ const inv = {
77
+ tool_name: "Shell",
78
+ tool_input: { command: "git push origin main" },
79
+ };
80
+ const event = buildTelemetryEvent(inv, "claude");
81
+ assert(event);
82
+ assert.strictEqual(event.tool_call_metadata.action_type, "git_remote_write");
83
+ assert(event.tool_call_metadata.command_components);
84
+ assert(event.tool_call_metadata.command_components.length > 0);
85
+ });
86
+ test("buildTelemetryEvent - bash command from Bash tool", () => {
87
+ const inv = {
88
+ tool_name: "Bash",
89
+ tool_input: { command: "rm -rf /tmp/test" },
90
+ };
91
+ const event = buildTelemetryEvent(inv, "claude");
92
+ assert(event);
93
+ assert.strictEqual(event.tool_call_metadata.action_type, "filesystem_delete");
94
+ });
95
+ test("buildTelemetryEvent - MCP tool call", () => {
96
+ const inv = {
97
+ tool_name: "mcp__filesystem__read_file",
98
+ tool_input: { path: "/etc/hosts" },
99
+ };
100
+ const event = buildTelemetryEvent(inv, "claude");
101
+ assert(event);
102
+ assert.strictEqual(event.tool_call_metadata.action_type, "mcp_tool_call");
103
+ assert.strictEqual(event.tool_call_metadata.mcp_server, "filesystem");
104
+ assert.strictEqual(event.tool_call_metadata.mcp_tool, "read_file");
105
+ });
106
+ test("buildTelemetryEvent - preserves session id and tool use id", () => {
107
+ const inv = {
108
+ tool_name: "Read",
109
+ tool_input: { file_path: "/tmp/test" },
110
+ tool_use_id: "tooluse_123",
111
+ cwd: "/home/user",
112
+ hook_event_name: "preToolUse",
113
+ };
114
+ const event = buildTelemetryEvent(inv, "cursor", "session_abc");
115
+ assert(event);
116
+ assert.strictEqual(event.session_id, "session_abc");
117
+ assert.strictEqual(event.tool_use_id, "tooluse_123");
118
+ assert.strictEqual(event.working_directory, "/home/user");
119
+ assert.strictEqual(event.hook_event_name, "preToolUse");
120
+ });
121
+ test("eventToDict - converts event to dictionary", () => {
122
+ const inv = {
123
+ tool_name: "Read",
124
+ tool_input: { file_path: "/etc/hosts" },
125
+ };
126
+ const event = buildTelemetryEvent(inv, "test-agent");
127
+ assert(event);
128
+ const dict = eventToDict(event);
129
+ assert.strictEqual(dict.agent_identity, "test-agent");
130
+ assert.strictEqual(dict.event_type, "tool_call");
131
+ assert.strictEqual(dict.action_type, "filesystem_read");
132
+ assert.strictEqual(dict.file_path, "/etc/hosts");
133
+ });
134
+ test("buildTelemetryEvent - unknown tool", () => {
135
+ const inv = {
136
+ tool_name: "CustomUnknownTool",
137
+ tool_input: {},
138
+ };
139
+ const event = buildTelemetryEvent(inv, "claude");
140
+ assert(event);
141
+ assert.strictEqual(event.tool_call_metadata.action_type, "unknown");
142
+ });
143
+ test("buildTelemetryEvent - timestamp is ISO string", () => {
144
+ const inv = {
145
+ tool_name: "Read",
146
+ tool_input: { file_path: "/tmp" },
147
+ };
148
+ const event = buildTelemetryEvent(inv);
149
+ assert(event);
150
+ assert(typeof event.timestamp === "string");
151
+ const parsed = new Date(event.timestamp);
152
+ assert(!isNaN(parsed.getTime()));
153
+ });
154
+ test("buildTelemetryEvent - normalizes tool name casing", () => {
155
+ const inv = {
156
+ tool_name: "read",
157
+ tool_input: { file_path: "/tmp" },
158
+ };
159
+ const event = buildTelemetryEvent(inv, "claude");
160
+ assert(event);
161
+ assert.strictEqual(event.tool_call_metadata.tool_name, "read");
162
+ assert.strictEqual(event.tool_call_metadata.action_type, "filesystem_read");
163
+ });
164
+ test("buildTelemetryEvent - handles command from raw_event", () => {
165
+ const inv = {
166
+ tool_name: "Bash",
167
+ tool_input: {},
168
+ raw_event: { command: "ls -la /tmp" },
169
+ };
170
+ const event = buildTelemetryEvent(inv);
171
+ assert(event);
172
+ assert(event.tool_call_metadata.command_components);
173
+ assert(event.tool_call_metadata.command_components.length > 0);
174
+ assert.strictEqual(event.tool_call_metadata.command_components[0], "ls");
175
+ });
176
+ test("buildTelemetryEvent - handles cmd alias for command", () => {
177
+ const inv = {
178
+ tool_name: "Bash",
179
+ tool_input: { cmd: "npm install" },
180
+ };
181
+ const event = buildTelemetryEvent(inv);
182
+ assert(event);
183
+ assert.strictEqual(event.tool_call_metadata.action_type, "package_install");
184
+ });
185
+ test("buildTelemetryEvent - glob sensitive path detection", () => {
186
+ const inv = {
187
+ tool_name: "Glob",
188
+ tool_input: { path: "/home/user/.ssh/" },
189
+ };
190
+ const event = buildTelemetryEvent(inv);
191
+ assert(event);
192
+ // .ssh/ is detected as sensitive path, so credential_search
193
+ assert.strictEqual(event.tool_call_metadata.action_type, "credential_search");
194
+ });
195
+ test("buildTelemetryEvent - glob normal path", () => {
196
+ const inv = {
197
+ tool_name: "Glob",
198
+ tool_input: { path: "/tmp/files" },
199
+ };
200
+ const event = buildTelemetryEvent(inv);
201
+ assert(event);
202
+ assert.strictEqual(event.tool_call_metadata.action_type, "filesystem_read");
203
+ });
204
+ //# sourceMappingURL=telemetry.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry.test.js","sourceRoot":"","sources":["../../src/test/telemetry.test.ts"],"names":[],"mappings":"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"}