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,75 @@
1
+ import { LANG_EXEC, PACKAGE_RUN, FILESYSTEM_READ, } from "../constants.js";
2
+ import { hasFlag } from "../flags.js";
3
+ const TEST_RUN_MODULE_ROOTS = new Set(["pytest", "unittest", "nose", "nose2", "tox"]);
4
+ function moduleAfterM(components) {
5
+ for (let i = 0; i < components.length - 1; i++) {
6
+ if (components[i] === "-m" || components[i] === "--module") {
7
+ return components[i + 1] ?? null;
8
+ }
9
+ }
10
+ return null;
11
+ }
12
+ /**
13
+ * Classify shell (bash/sh) command based on flags.
14
+ */
15
+ export function classifyShell(components) {
16
+ if (components.includes("-c") || hasFlag(components, "c")) {
17
+ return LANG_EXEC;
18
+ }
19
+ if (components.includes("-i")) {
20
+ return LANG_EXEC;
21
+ }
22
+ if (components.length > 1 && !components[1].startsWith("-")) {
23
+ return LANG_EXEC;
24
+ }
25
+ return LANG_EXEC;
26
+ }
27
+ /**
28
+ * Classify script execution (python, node, ruby, etc.).
29
+ */
30
+ export function classifyScriptRunner(components) {
31
+ if (components.includes("-c") || hasFlag(components, "c")) {
32
+ return LANG_EXEC;
33
+ }
34
+ if (components.includes("-m") || components.includes("--module") || hasFlag(components, "m")) {
35
+ const mod = moduleAfterM(components);
36
+ if (mod) {
37
+ const root = mod.split(".")[0] ?? "";
38
+ if (TEST_RUN_MODULE_ROOTS.has(root)) {
39
+ return PACKAGE_RUN;
40
+ }
41
+ }
42
+ return LANG_EXEC;
43
+ }
44
+ if (components.length > 1 && !components[1].startsWith("-")) {
45
+ return LANG_EXEC;
46
+ }
47
+ return LANG_EXEC;
48
+ }
49
+ /**
50
+ * Classify make based on read-only flags.
51
+ */
52
+ export function classifyMake(components) {
53
+ const readOnlyFlags = {
54
+ "--dry-run": true,
55
+ "--help": true,
56
+ "--version": true,
57
+ "--just-print": true,
58
+ "--print-data-base": true,
59
+ "--question": true,
60
+ };
61
+ for (let i = 1; i < components.length; i++) {
62
+ const comp = components[i];
63
+ if (readOnlyFlags[comp]) {
64
+ return FILESYSTEM_READ;
65
+ }
66
+ if (comp.startsWith("-") && !comp.startsWith("--")) {
67
+ const flags = comp.slice(1);
68
+ if (flags.includes("n") || flags.includes("p") || flags.includes("q")) {
69
+ return FILESYSTEM_READ;
70
+ }
71
+ }
72
+ }
73
+ return LANG_EXEC;
74
+ }
75
+ //# sourceMappingURL=shell-and-runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shell-and-runtime.js","sourceRoot":"","sources":["../../../../src/lib/classify/handlers/shell-and-runtime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Command component classifier — analyze command parts and determine action type.
3
+ */
4
+ export * from "./constants.js";
5
+ export { classifyCommandComponents } from "./dispatch.js";
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/classify/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,gBAAgB,CAAC;AAC/B,OAAO,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Command component classifier — analyze command parts and determine action type.
3
+ */
4
+ export * from "./constants.js";
5
+ export { classifyCommandComponents } from "./dispatch.js";
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/classify/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,gBAAgB,CAAC;AAC/B,OAAO,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Strip version suffix: python3.12 → python3, node22 → node.
3
+ */
4
+ export declare function normalizeInterpreter(name: string): string;
5
+ //# sourceMappingURL=interpreter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interpreter.d.ts","sourceRoot":"","sources":["../../../src/lib/classify/interpreter.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAWzD"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Strip version suffix: python3.12 → python3, node22 → node.
3
+ */
4
+ export function normalizeInterpreter(name) {
5
+ const canonicalNames = ["python3", "python", "pip3", "pip", "node", "ruby", "perl"];
6
+ for (const canonical of canonicalNames) {
7
+ if (name.startsWith(canonical)) {
8
+ const suffix = name.slice(canonical.length);
9
+ if (suffix && /^[0-9]/.test(suffix)) {
10
+ return canonical;
11
+ }
12
+ }
13
+ }
14
+ return name;
15
+ }
16
+ //# sourceMappingURL=interpreter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interpreter.js","sourceRoot":"","sources":["../../../src/lib/classify/interpreter.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,IAAY;IAC/C,MAAM,cAAc,GAAG,CAAC,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACpF,KAAK,MAAM,SAAS,IAAI,cAAc,EAAE,CAAC;QACvC,IAAI,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;YAC5C,IAAI,MAAM,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;gBACpC,OAAO,SAAS,CAAC;YACnB,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Find the main executable command in a potentially complex command chain.
3
+ * Handles cases like: ["cd", "dir", "&&", "python", "-c", "..."]
4
+ * For pipes (|), uses the **first command in the rightmost segment** (so
5
+ * `ls | grep -i venv` → grep, not `venv`). Optional sink commands
6
+ * (head, tail, …) resolve to the previous segment when present.
7
+ * For sequences (&&, ||, ;), only examines the first statement
8
+ */
9
+ export declare function findMainCommand(components: string[]): string | null;
10
+ //# sourceMappingURL=pipeline.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../../../src/lib/classify/pipeline.ts"],"names":[],"mappings":"AAkEA;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,IAAI,CAqCnE"}
@@ -0,0 +1,105 @@
1
+ import { basename } from "path";
2
+ const operators = ["&&", "||", "|", ";", "&", ">", "<", ">>", "2>/dev/null", "2>&1"];
3
+ const logicalOps = ["&&", "||", ";"];
4
+ const operatorSet = new Set(operators);
5
+ /**
6
+ * Commands that often terminate a pipeline only to trim/view output — for risk
7
+ * classification, attribute the line to the producer (e.g. pytest | head → pytest).
8
+ */
9
+ const PIPELINE_SINK_COMMANDS = new Set([
10
+ "head",
11
+ "tail",
12
+ "less",
13
+ "more",
14
+ "wc",
15
+ "cat",
16
+ // Text ordering / dedup — do not steal attribution from `find | sort`, `grep | uniq`, etc.
17
+ "sort",
18
+ "uniq",
19
+ "nl",
20
+ "tac",
21
+ "rev",
22
+ "column",
23
+ "fmt",
24
+ "fold",
25
+ "paste",
26
+ "pr",
27
+ "split",
28
+ "expand",
29
+ "unexpand",
30
+ ]);
31
+ function splitPipeSegments(statement) {
32
+ const segments = [];
33
+ let cur = [];
34
+ for (const tok of statement) {
35
+ if (tok === "|") {
36
+ segments.push(cur);
37
+ cur = [];
38
+ }
39
+ else {
40
+ cur.push(tok);
41
+ }
42
+ }
43
+ segments.push(cur);
44
+ return segments;
45
+ }
46
+ /**
47
+ * First executable token in a segment (skip flags and operators).
48
+ */
49
+ function firstCommandInSegment(segment) {
50
+ for (const comp of segment) {
51
+ const cmd = comp.trim();
52
+ if (!cmd || operatorSet.has(cmd) || cmd.startsWith("-")) {
53
+ continue;
54
+ }
55
+ // Tokenizer can leave a lone `\` before `|` when scripts use `\` line continuations.
56
+ if (cmd === "\\") {
57
+ continue;
58
+ }
59
+ return basename(cmd);
60
+ }
61
+ return null;
62
+ }
63
+ /**
64
+ * Find the main executable command in a potentially complex command chain.
65
+ * Handles cases like: ["cd", "dir", "&&", "python", "-c", "..."]
66
+ * For pipes (|), uses the **first command in the rightmost segment** (so
67
+ * `ls | grep -i venv` → grep, not `venv`). Optional sink commands
68
+ * (head, tail, …) resolve to the previous segment when present.
69
+ * For sequences (&&, ||, ;), only examines the first statement
70
+ */
71
+ export function findMainCommand(components) {
72
+ let endIndex = components.length;
73
+ for (let i = 0; i < components.length; i++) {
74
+ if (logicalOps.includes(components[i])) {
75
+ endIndex = i;
76
+ break;
77
+ }
78
+ }
79
+ const statement = components.slice(0, endIndex);
80
+ if (statement.includes("|")) {
81
+ const segments = splitPipeSegments(statement);
82
+ let idx = segments.length - 1;
83
+ while (idx >= 0) {
84
+ const cmd = firstCommandInSegment(segments[idx]);
85
+ if (!cmd) {
86
+ idx -= 1;
87
+ continue;
88
+ }
89
+ if (PIPELINE_SINK_COMMANDS.has(cmd) && idx > 0) {
90
+ idx -= 1;
91
+ continue;
92
+ }
93
+ return cmd;
94
+ }
95
+ return null;
96
+ }
97
+ for (const comp of statement) {
98
+ const cmd = comp.trim();
99
+ if (cmd && !operatorSet.has(cmd) && !cmd.startsWith("-")) {
100
+ return basename(cmd);
101
+ }
102
+ }
103
+ return null;
104
+ }
105
+ //# sourceMappingURL=pipeline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../../../src/lib/classify/pipeline.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export * from "./classify/index.js";
2
+ //# sourceMappingURL=classify.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"classify.d.ts","sourceRoot":"","sources":["../../src/lib/classify.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from "./classify/index.js";
2
+ //# sourceMappingURL=classify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"classify.js","sourceRoot":"","sources":["../../src/lib/classify.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Telemetry streaming — batch and send events to Optimus backend.
3
+ */
4
+ import { TelemetryEvent } from "./telemetry.js";
5
+ /**
6
+ * Add an event to the queue and flush if needed.
7
+ */
8
+ export declare function queueEvent(event: TelemetryEvent): Promise<void>;
9
+ /**
10
+ * Flush all queued events to backend.
11
+ */
12
+ export declare function flushEvents(): Promise<void>;
13
+ /**
14
+ * Ensure all events are flushed on process exit.
15
+ */
16
+ export declare function ensureShutdown(): void;
17
+ //# sourceMappingURL=streaming.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"streaming.d.ts","sourceRoot":"","sources":["../../src/lib/streaming.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAYhD;;GAEG;AACH,wBAAsB,UAAU,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAoBrE;AAED;;GAEG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAyBjD;AAuHD;;GAEG;AACH,wBAAgB,cAAc,IAAI,IAAI,CAUrC"}
@@ -0,0 +1,166 @@
1
+ /**
2
+ * Telemetry streaming — batch and send events to Optimus backend.
3
+ */
4
+ // Backend configuration
5
+ const OPTIMUS_API_URL = process.env.OPTIMUS_API_URL || "http://localhost:8080";
6
+ const OPTIMUS_API_TOKEN = process.env.OPTIMUS_API_TOKEN || "";
7
+ const BATCH_SIZE = parseInt(process.env.OPTIMUS_BATCH_SIZE || "1", 10); // Default to 1 for testing
8
+ const BATCH_TIMEOUT_MS = 5000; // 5 seconds
9
+ // In-memory event queue
10
+ let eventQueue = [];
11
+ let batchTimer = null;
12
+ /**
13
+ * Add an event to the queue and flush if needed.
14
+ */
15
+ export async function queueEvent(event) {
16
+ if (!event) {
17
+ return;
18
+ }
19
+ eventQueue.push(event);
20
+ // Flush immediately if batch size reached
21
+ if (eventQueue.length >= BATCH_SIZE) {
22
+ await flushEvents();
23
+ }
24
+ else if (!batchTimer) {
25
+ // Set timer for delayed flush if not already set
26
+ batchTimer = setTimeout(() => {
27
+ flushEvents().catch((err) => {
28
+ // Log but don't block
29
+ console.error("[optimus-tool-call] Failed to flush events:", err);
30
+ });
31
+ batchTimer = null;
32
+ }, BATCH_TIMEOUT_MS);
33
+ }
34
+ }
35
+ /**
36
+ * Flush all queued events to backend.
37
+ */
38
+ export async function flushEvents() {
39
+ if (eventQueue.length === 0) {
40
+ return;
41
+ }
42
+ // Clear timer
43
+ if (batchTimer) {
44
+ clearTimeout(batchTimer);
45
+ batchTimer = null;
46
+ }
47
+ const eventsToSend = eventQueue.splice(0, eventQueue.length);
48
+ try {
49
+ await sendBatch(eventsToSend);
50
+ }
51
+ catch (err) {
52
+ // Non-blocking: log error but don't throw
53
+ console.error(`[optimus-tool-call] Failed to send ${eventsToSend.length} events:`, err instanceof Error ? err.message : String(err));
54
+ // Optionally re-queue events on failure (for now, just drop)
55
+ // eventQueue.unshift(...eventsToSend);
56
+ }
57
+ }
58
+ /**
59
+ * Send batch of events to Django backend.
60
+ */
61
+ async function sendBatch(events) {
62
+ if (events.length === 0) {
63
+ return;
64
+ }
65
+ const endpoint = `${OPTIMUS_API_URL}/api/tool-calls/events/batch_create/`;
66
+ const payload = { events };
67
+ const headers = {
68
+ "Content-Type": "application/json",
69
+ };
70
+ // Add auth token if available
71
+ if (OPTIMUS_API_TOKEN) {
72
+ headers["Authorization"] = `Bearer ${OPTIMUS_API_TOKEN}`;
73
+ }
74
+ try {
75
+ // Use fetch if available (Node 18+), fall back to node:http
76
+ if (typeof fetch !== "undefined") {
77
+ const controller = new AbortController();
78
+ const timeoutId = setTimeout(() => controller.abort(), 5000);
79
+ try {
80
+ const response = await fetch(endpoint, {
81
+ method: "POST",
82
+ headers,
83
+ body: JSON.stringify(payload),
84
+ signal: controller.signal,
85
+ });
86
+ if (!response.ok) {
87
+ throw new Error(`HTTP ${response.status}: ${response.statusText}`);
88
+ }
89
+ // Successfully sent
90
+ }
91
+ finally {
92
+ clearTimeout(timeoutId);
93
+ }
94
+ }
95
+ else {
96
+ // Fallback for older Node versions
97
+ await sendViaHttp(endpoint, headers, payload);
98
+ }
99
+ }
100
+ catch (err) {
101
+ throw new Error(`Failed to send events to ${endpoint}: ${err instanceof Error ? err.message : String(err)}`);
102
+ }
103
+ }
104
+ /**
105
+ * Fallback HTTP POST using node:http for older Node versions.
106
+ */
107
+ function sendViaHttp(endpoint, headers, payload) {
108
+ return new Promise((resolve, reject) => {
109
+ try {
110
+ const url = new URL(endpoint);
111
+ const protocol = url.protocol === "https:" ? require("https") : require("http");
112
+ const options = {
113
+ hostname: url.hostname,
114
+ port: url.port,
115
+ path: url.pathname + url.search,
116
+ method: "POST",
117
+ headers: {
118
+ ...headers,
119
+ "Content-Length": Buffer.byteLength(JSON.stringify(payload)),
120
+ },
121
+ timeout: 5000,
122
+ };
123
+ const req = protocol.request(options, (res) => {
124
+ let data = "";
125
+ res.on("data", (chunk) => {
126
+ data += chunk;
127
+ });
128
+ res.on("end", () => {
129
+ if (res.statusCode && res.statusCode >= 200 && res.statusCode < 300) {
130
+ resolve();
131
+ }
132
+ else {
133
+ reject(new Error(`HTTP ${res.statusCode}: ${res.statusMessage || "Unknown error"}`));
134
+ }
135
+ });
136
+ });
137
+ req.on("error", (err) => {
138
+ reject(err);
139
+ });
140
+ req.on("timeout", () => {
141
+ req.destroy();
142
+ reject(new Error("Request timeout"));
143
+ });
144
+ req.write(JSON.stringify(payload));
145
+ req.end();
146
+ }
147
+ catch (err) {
148
+ reject(err);
149
+ }
150
+ });
151
+ }
152
+ /**
153
+ * Ensure all events are flushed on process exit.
154
+ */
155
+ export function ensureShutdown() {
156
+ process.on("exit", () => {
157
+ if (eventQueue.length > 0) {
158
+ // Try sync flush (best effort)
159
+ if (batchTimer) {
160
+ clearTimeout(batchTimer);
161
+ batchTimer = null;
162
+ }
163
+ }
164
+ });
165
+ }
166
+ //# sourceMappingURL=streaming.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"streaming.js","sourceRoot":"","sources":["../../src/lib/streaming.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { TelemetryEvent, ToolInvocation } from "./types.js";
2
+ /**
3
+ * Build a telemetry event from a tool invocation.
4
+ */
5
+ export declare function buildTelemetryEvent(inv: ToolInvocation | null | undefined, agentIdentity?: string, sessionId?: string | null): TelemetryEvent | null;
6
+ //# sourceMappingURL=build-event.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-event.d.ts","sourceRoot":"","sources":["../../../src/lib/telemetry/build-event.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAuBjE;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,cAAc,GAAG,IAAI,GAAG,SAAS,EACtC,aAAa,GAAE,MAAkB,EACjC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,GACxB,cAAc,GAAG,IAAI,CAsFvB"}
@@ -0,0 +1,115 @@
1
+ import { classifyCommandComponents, UNKNOWN, WEBFETCH, WEBSEARCH } from "../classify.js";
2
+ import { tokenizeCommand } from "./command-tokenize.js";
3
+ import { isCredentialSearchPattern, isSensitivePath } from "./sensitivity.js";
4
+ /**
5
+ * Parse `mcp__<server>__<tool>` (e.g. mcp__filesystem__read_file) for metadata fields
6
+ * expected by the audit API / Django serializer.
7
+ */
8
+ function parseMcpServerAndTool(toolNameNorm) {
9
+ const t = toolNameNorm.trim();
10
+ if (!t.toLowerCase().startsWith("mcp__")) {
11
+ return { mcp_server: null, mcp_tool: null };
12
+ }
13
+ const segments = t.split("__");
14
+ if (segments.length < 3 || segments[0].toLowerCase() !== "mcp") {
15
+ return { mcp_server: null, mcp_tool: null };
16
+ }
17
+ const mcp_server = segments[1]?.trim() || null;
18
+ const mcp_tool = segments.slice(2).join("__").trim() || null;
19
+ return { mcp_server, mcp_tool };
20
+ }
21
+ /**
22
+ * Build a telemetry event from a tool invocation.
23
+ */
24
+ export function buildTelemetryEvent(inv, agentIdentity = "unknown", sessionId) {
25
+ if (!inv) {
26
+ return null;
27
+ }
28
+ const toolName = inv.tool_name;
29
+ const toolNameNorm = typeof toolName === "string" ? toolName.trim() : "";
30
+ const toolNameLower = toolNameNorm.toLowerCase();
31
+ let commandComponents = null;
32
+ let filePath = null;
33
+ let pattern = null;
34
+ let actionType = UNKNOWN;
35
+ let mcp_server = null;
36
+ let mcp_tool = null;
37
+ let normalizedToolInput = inv.tool_input || {};
38
+ if (toolNameLower === "shell" || toolNameLower === "bash") {
39
+ const commandFromInput = inv.tool_input?.command;
40
+ const commandFromInputAlt = inv.tool_input?.cmd;
41
+ const commandFromRaw = inv.raw_event?.command;
42
+ const commandStr = (typeof commandFromInput === "string" && commandFromInput) ||
43
+ (typeof commandFromInputAlt === "string" && commandFromInputAlt) ||
44
+ (typeof commandFromRaw === "string" && commandFromRaw) ||
45
+ null;
46
+ if (commandStr && !("command" in normalizedToolInput)) {
47
+ normalizedToolInput = { ...normalizedToolInput, command: commandStr };
48
+ }
49
+ if (commandStr) {
50
+ try {
51
+ commandComponents = tokenizeCommand(commandStr);
52
+ actionType = classifyCommandComponents(commandComponents);
53
+ }
54
+ catch {
55
+ actionType = UNKNOWN;
56
+ }
57
+ }
58
+ }
59
+ else if (toolNameLower === "read") {
60
+ filePath = inv.tool_input.file_path || null;
61
+ actionType = filePath && isSensitivePath(filePath) ? "credential_access" : "filesystem_read";
62
+ }
63
+ else if (toolNameLower === "write") {
64
+ filePath = (inv.tool_input.file_path || inv.tool_input.path) || null;
65
+ actionType = filePath && isSensitivePath(filePath) ? "credential_access" : "filesystem_write";
66
+ }
67
+ else if (toolNameLower === "edit") {
68
+ filePath = (inv.tool_input.file_path || inv.tool_input.path) || null;
69
+ actionType = filePath && isSensitivePath(filePath) ? "credential_access" : "filesystem_write";
70
+ }
71
+ else if (toolNameLower === "grep") {
72
+ pattern = inv.tool_input.pattern || null;
73
+ actionType =
74
+ pattern && isCredentialSearchPattern(pattern) ? "credential_search" : "filesystem_read";
75
+ }
76
+ else if (toolNameLower === "glob") {
77
+ const path = inv.tool_input.path || null;
78
+ actionType = path && isSensitivePath(path) ? "credential_search" : "filesystem_read";
79
+ }
80
+ else if (toolNameLower === "webfetch") {
81
+ actionType = WEBFETCH;
82
+ }
83
+ else if (toolNameLower === "websearch") {
84
+ actionType = WEBSEARCH;
85
+ }
86
+ else if (toolNameLower.startsWith("mcp__")) {
87
+ actionType = "mcp_tool_call";
88
+ const parsed = parseMcpServerAndTool(toolNameNorm);
89
+ mcp_server = parsed.mcp_server;
90
+ mcp_tool = parsed.mcp_tool;
91
+ }
92
+ else {
93
+ actionType = UNKNOWN;
94
+ }
95
+ return {
96
+ timestamp: new Date().toISOString(),
97
+ agent_identity: agentIdentity,
98
+ event_type: "tool_call",
99
+ session_id: sessionId,
100
+ tool_use_id: inv.tool_use_id || null,
101
+ hook_event_name: inv.hook_event_name || null,
102
+ working_directory: inv.cwd || null,
103
+ tool_call_metadata: {
104
+ tool_name: toolNameNorm || toolName,
105
+ action_type: actionType,
106
+ command_components: commandComponents,
107
+ file_path: filePath,
108
+ pattern,
109
+ ...(mcp_server != null ? { mcp_server } : {}),
110
+ ...(mcp_tool != null ? { mcp_tool } : {}),
111
+ tool_input: normalizedToolInput,
112
+ },
113
+ };
114
+ }
115
+ //# sourceMappingURL=build-event.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-event.js","sourceRoot":"","sources":["../../../src/lib/telemetry/build-event.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Simple command tokenizer. Handles basic quoting.
3
+ * Not a full shell parser, but sufficient for classification.
4
+ */
5
+ export declare function tokenizeCommand(command: string): string[];
6
+ //# sourceMappingURL=command-tokenize.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-tokenize.d.ts","sourceRoot":"","sources":["../../../src/lib/telemetry/command-tokenize.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAiCzD"}