@once-agent/sdk 0.1.11 → 0.1.12

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/README.md +76 -1
  2. package/dist/cli.js +50 -1
  3. package/dist/cli.js.map +1 -1
  4. package/dist/connect/identity.d.ts +22 -0
  5. package/dist/connect/identity.d.ts.map +1 -0
  6. package/dist/connect/identity.js +159 -0
  7. package/dist/connect/identity.js.map +1 -0
  8. package/dist/connect/index.d.ts +17 -0
  9. package/dist/connect/index.d.ts.map +1 -0
  10. package/dist/connect/index.js +9 -0
  11. package/dist/connect/index.js.map +1 -0
  12. package/dist/connect/local-agent-tool.d.ts +30 -7
  13. package/dist/connect/local-agent-tool.d.ts.map +1 -1
  14. package/dist/connect/local-agent-tool.js +81 -9
  15. package/dist/connect/local-agent-tool.js.map +1 -1
  16. package/dist/connect/manifest.d.ts +55 -0
  17. package/dist/connect/manifest.d.ts.map +1 -0
  18. package/dist/connect/manifest.js +166 -0
  19. package/dist/connect/manifest.js.map +1 -0
  20. package/dist/connect/openai-function-tools.d.ts +66 -0
  21. package/dist/connect/openai-function-tools.d.ts.map +1 -0
  22. package/dist/connect/openai-function-tools.js +182 -0
  23. package/dist/connect/openai-function-tools.js.map +1 -0
  24. package/dist/connect/payload.d.ts +30 -0
  25. package/dist/connect/payload.d.ts.map +1 -0
  26. package/dist/connect/payload.js +122 -0
  27. package/dist/connect/payload.js.map +1 -0
  28. package/dist/connect/tool-classifier.d.ts +40 -0
  29. package/dist/connect/tool-classifier.d.ts.map +1 -0
  30. package/dist/connect/tool-classifier.js +271 -0
  31. package/dist/connect/tool-classifier.js.map +1 -0
  32. package/dist/connect/toolset.d.ts +42 -0
  33. package/dist/connect/toolset.d.ts.map +1 -0
  34. package/dist/connect/toolset.js +123 -0
  35. package/dist/connect/toolset.js.map +1 -0
  36. package/dist/discovery/index.d.ts +13 -0
  37. package/dist/discovery/index.d.ts.map +1 -0
  38. package/dist/discovery/index.js +8 -0
  39. package/dist/discovery/index.js.map +1 -0
  40. package/dist/execution-observation.d.ts +122 -0
  41. package/dist/execution-observation.d.ts.map +1 -0
  42. package/dist/execution-observation.js +324 -0
  43. package/dist/execution-observation.js.map +1 -0
  44. package/dist/gateway/index.d.ts +9 -0
  45. package/dist/gateway/index.d.ts.map +1 -0
  46. package/dist/gateway/index.js +5 -0
  47. package/dist/gateway/index.js.map +1 -0
  48. package/dist/gateway/local-toolset.d.ts +32 -0
  49. package/dist/gateway/local-toolset.d.ts.map +1 -0
  50. package/dist/gateway/local-toolset.js +79 -0
  51. package/dist/gateway/local-toolset.js.map +1 -0
  52. package/dist/gateway/openai-function-tools.d.ts +28 -0
  53. package/dist/gateway/openai-function-tools.d.ts.map +1 -0
  54. package/dist/gateway/openai-function-tools.js +117 -0
  55. package/dist/gateway/openai-function-tools.js.map +1 -0
  56. package/dist/gateway/planner.d.ts +53 -0
  57. package/dist/gateway/planner.d.ts.map +1 -0
  58. package/dist/gateway/planner.js +155 -0
  59. package/dist/gateway/planner.js.map +1 -0
  60. package/dist/gateway/tool-graph-binding.d.ts +51 -0
  61. package/dist/gateway/tool-graph-binding.d.ts.map +1 -0
  62. package/dist/gateway/tool-graph-binding.js +123 -0
  63. package/dist/gateway/tool-graph-binding.js.map +1 -0
  64. package/dist/langchain-execution-observer.d.ts +22 -0
  65. package/dist/langchain-execution-observer.d.ts.map +1 -0
  66. package/dist/langchain-execution-observer.js +128 -0
  67. package/dist/langchain-execution-observer.js.map +1 -0
  68. package/dist/langchain-runtime-discovery.d.ts +33 -0
  69. package/dist/langchain-runtime-discovery.d.ts.map +1 -0
  70. package/dist/langchain-runtime-discovery.js +214 -0
  71. package/dist/langchain-runtime-discovery.js.map +1 -0
  72. package/dist/mcp-live-discovery.d.ts +71 -0
  73. package/dist/mcp-live-discovery.d.ts.map +1 -0
  74. package/dist/mcp-live-discovery.js +710 -0
  75. package/dist/mcp-live-discovery.js.map +1 -0
  76. package/dist/mcp-live-report.d.ts +3 -0
  77. package/dist/mcp-live-report.d.ts.map +1 -0
  78. package/dist/mcp-live-report.js +50 -0
  79. package/dist/mcp-live-report.js.map +1 -0
  80. package/dist/mcp-tool-refresh-report.d.ts +3 -0
  81. package/dist/mcp-tool-refresh-report.d.ts.map +1 -0
  82. package/dist/mcp-tool-refresh-report.js +44 -0
  83. package/dist/mcp-tool-refresh-report.js.map +1 -0
  84. package/dist/mcp-tool-refresh.d.ts +33 -0
  85. package/dist/mcp-tool-refresh.d.ts.map +1 -0
  86. package/dist/mcp-tool-refresh.js +489 -0
  87. package/dist/mcp-tool-refresh.js.map +1 -0
  88. package/dist/openai-agents-execution-observer.d.ts +24 -0
  89. package/dist/openai-agents-execution-observer.d.ts.map +1 -0
  90. package/dist/openai-agents-execution-observer.js +163 -0
  91. package/dist/openai-agents-execution-observer.js.map +1 -0
  92. package/dist/otel-execution-observer.d.ts +16 -0
  93. package/dist/otel-execution-observer.d.ts.map +1 -0
  94. package/dist/otel-execution-observer.js +129 -0
  95. package/dist/otel-execution-observer.js.map +1 -0
  96. package/dist/runtime-tool-discovery.d.ts +86 -0
  97. package/dist/runtime-tool-discovery.d.ts.map +1 -0
  98. package/dist/runtime-tool-discovery.js +429 -0
  99. package/dist/runtime-tool-discovery.js.map +1 -0
  100. package/dist/tool-discovery.d.ts +51 -0
  101. package/dist/tool-discovery.d.ts.map +1 -0
  102. package/dist/tool-discovery.js +487 -0
  103. package/dist/tool-discovery.js.map +1 -0
  104. package/dist/tool-importance.d.ts +34 -0
  105. package/dist/tool-importance.d.ts.map +1 -0
  106. package/dist/tool-importance.js +269 -0
  107. package/dist/tool-importance.js.map +1 -0
  108. package/dist/tool-report.d.ts +3 -0
  109. package/dist/tool-report.d.ts.map +1 -0
  110. package/dist/tool-report.js +75 -0
  111. package/dist/tool-report.js.map +1 -0
  112. package/dist/vercel-execution-observer.d.ts +12 -0
  113. package/dist/vercel-execution-observer.d.ts.map +1 -0
  114. package/dist/vercel-execution-observer.js +97 -0
  115. package/dist/vercel-execution-observer.js.map +1 -0
  116. package/dist-cjs/connect/identity.js +162 -0
  117. package/dist-cjs/connect/identity.js.map +1 -0
  118. package/dist-cjs/connect/index.js +26 -0
  119. package/dist-cjs/connect/index.js.map +1 -0
  120. package/dist-cjs/connect/local-agent-tool.js +82 -9
  121. package/dist-cjs/connect/local-agent-tool.js.map +1 -1
  122. package/dist-cjs/connect/manifest.js +171 -0
  123. package/dist-cjs/connect/manifest.js.map +1 -0
  124. package/dist-cjs/connect/openai-function-tools.js +187 -0
  125. package/dist-cjs/connect/openai-function-tools.js.map +1 -0
  126. package/dist-cjs/connect/payload.js +125 -0
  127. package/dist-cjs/connect/payload.js.map +1 -0
  128. package/dist-cjs/connect/tool-classifier.js +276 -0
  129. package/dist-cjs/connect/tool-classifier.js.map +1 -0
  130. package/dist-cjs/connect/toolset.js +126 -0
  131. package/dist-cjs/connect/toolset.js.map +1 -0
  132. package/dist-cjs/discovery/index.js +26 -0
  133. package/dist-cjs/discovery/index.js.map +1 -0
  134. package/dist-cjs/execution-observation.js +330 -0
  135. package/dist-cjs/execution-observation.js.map +1 -0
  136. package/dist-cjs/gateway/index.js +16 -0
  137. package/dist-cjs/gateway/index.js.map +1 -0
  138. package/dist-cjs/gateway/local-toolset.js +84 -0
  139. package/dist-cjs/gateway/local-toolset.js.map +1 -0
  140. package/dist-cjs/gateway/openai-function-tools.js +120 -0
  141. package/dist-cjs/gateway/openai-function-tools.js.map +1 -0
  142. package/dist-cjs/gateway/planner.js +160 -0
  143. package/dist-cjs/gateway/planner.js.map +1 -0
  144. package/dist-cjs/gateway/tool-graph-binding.js +126 -0
  145. package/dist-cjs/gateway/tool-graph-binding.js.map +1 -0
  146. package/dist-cjs/langchain-execution-observer.js +131 -0
  147. package/dist-cjs/langchain-execution-observer.js.map +1 -0
  148. package/dist-cjs/langchain-runtime-discovery.js +218 -0
  149. package/dist-cjs/langchain-runtime-discovery.js.map +1 -0
  150. package/dist-cjs/openai-agents-execution-observer.js +166 -0
  151. package/dist-cjs/openai-agents-execution-observer.js.map +1 -0
  152. package/dist-cjs/otel-execution-observer.js +132 -0
  153. package/dist-cjs/otel-execution-observer.js.map +1 -0
  154. package/dist-cjs/runtime-tool-discovery.js +436 -0
  155. package/dist-cjs/runtime-tool-discovery.js.map +1 -0
  156. package/dist-cjs/tool-importance.js +272 -0
  157. package/dist-cjs/tool-importance.js.map +1 -0
  158. package/dist-cjs/vercel-execution-observer.js +100 -0
  159. package/dist-cjs/vercel-execution-observer.js.map +1 -0
  160. package/package.json +25 -3
@@ -0,0 +1,160 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GATEWAY_PLAN_VERSION = exports.GATEWAY_ROUTE = void 0;
4
+ exports.gatewayDescriptorFingerprint = gatewayDescriptorFingerprint;
5
+ exports.planGatewayToolset = planGatewayToolset;
6
+ const node_crypto_1 = require("node:crypto");
7
+ const manifest_js_1 = require("../connect/manifest.js");
8
+ const tool_classifier_js_1 = require("../connect/tool-classifier.js");
9
+ exports.GATEWAY_ROUTE = Object.freeze({
10
+ DIRECT: "DIRECT",
11
+ PROTECT: "PROTECT",
12
+ BLOCK: "BLOCK",
13
+ });
14
+ exports.GATEWAY_PLAN_VERSION = "once-gateway-plan-v1";
15
+ const secretNamePattern = /(?:^|[_-])(authorization|api[_-]?key|token|password|passwd|secret|credential|cookie)(?:$|[_-])/i;
16
+ function canonicalGatewayValue(value, depth = 0, seen = new Set(), secretContext = false) {
17
+ if (secretContext)
18
+ return "<redacted>";
19
+ if (value === null || typeof value === "string" || typeof value === "boolean") {
20
+ return value;
21
+ }
22
+ if (typeof value === "number") {
23
+ return Number.isFinite(value) ? value : null;
24
+ }
25
+ if (typeof value !== "object" || depth > 12) {
26
+ return "<opaque>";
27
+ }
28
+ const objectValue = value;
29
+ if (seen.has(objectValue))
30
+ return "<cycle>";
31
+ seen.add(objectValue);
32
+ try {
33
+ if (Array.isArray(value)) {
34
+ const output = [];
35
+ for (let index = 0; index < value.length; index += 1) {
36
+ const descriptor = Object.getOwnPropertyDescriptor(value, String(index));
37
+ output.push(descriptor && "value" in descriptor
38
+ ? canonicalGatewayValue(descriptor.value, depth + 1, seen)
39
+ : "<opaque>");
40
+ }
41
+ return output;
42
+ }
43
+ const prototype = Object.getPrototypeOf(value);
44
+ if (prototype !== Object.prototype && prototype !== null) {
45
+ return "<opaque>";
46
+ }
47
+ const output = {};
48
+ const descriptors = Object.getOwnPropertyDescriptors(value);
49
+ for (const key of Object.keys(descriptors).sort()) {
50
+ const descriptor = descriptors[key];
51
+ if (!("value" in descriptor)) {
52
+ output[key] = "<opaque>";
53
+ continue;
54
+ }
55
+ output[key] = canonicalGatewayValue(descriptor.value, depth + 1, seen, secretNamePattern.test(key));
56
+ }
57
+ return output;
58
+ }
59
+ finally {
60
+ seen.delete(objectValue);
61
+ }
62
+ }
63
+ /**
64
+ * Stable, secret-safe fingerprint of the exact descriptor shape used for
65
+ * gateway routing. Getter-backed/non-plain runtime state is never evaluated.
66
+ */
67
+ function gatewayDescriptorFingerprint(descriptor) {
68
+ const canonical = canonicalGatewayValue(descriptor);
69
+ return (0, node_crypto_1.createHash)("sha256")
70
+ .update(JSON.stringify(canonical))
71
+ .digest("hex");
72
+ }
73
+ function mapRoute(decision) {
74
+ if (decision === tool_classifier_js_1.CONNECT_TOOL_DECISION.BYPASS) {
75
+ return exports.GATEWAY_ROUTE.DIRECT;
76
+ }
77
+ if (decision === tool_classifier_js_1.CONNECT_TOOL_DECISION.PROTECT) {
78
+ return exports.GATEWAY_ROUTE.PROTECT;
79
+ }
80
+ return exports.GATEWAY_ROUTE.BLOCK;
81
+ }
82
+ function freezeEntry(entry) {
83
+ return Object.freeze({
84
+ ...entry,
85
+ signals: Object.freeze([...entry.signals]),
86
+ });
87
+ }
88
+ function invalidPlan() {
89
+ const entries = Object.freeze([]);
90
+ const summary = Object.freeze({
91
+ total: 0,
92
+ direct: 0,
93
+ protect: 0,
94
+ blocked: 0,
95
+ });
96
+ return Object.freeze({
97
+ version: exports.GATEWAY_PLAN_VERSION,
98
+ valid: false,
99
+ ready: false,
100
+ reason: "INVALID_MANIFEST",
101
+ entries,
102
+ direct: entries,
103
+ protect: entries,
104
+ blocked: entries,
105
+ summary,
106
+ });
107
+ }
108
+ /**
109
+ * Plan how a runtime-selected tool subset should cross the Once Gateway.
110
+ *
111
+ * This is a pure control-plane operation. It does not execute tools, resolve
112
+ * per-invocation operation identity/effect payload, open local protection
113
+ * state, contact MCP/providers, or retain executable implementations.
114
+ *
115
+ * Existing Connect classification remains authoritative:
116
+ * BYPASS -> DIRECT, PROTECT -> PROTECT, UNKNOWN -> BLOCK.
117
+ */
118
+ function planGatewayToolset(manifest) {
119
+ const normalized = (0, manifest_js_1.normalizeConnectToolManifest)(manifest);
120
+ const connectPlan = (0, manifest_js_1.planConnectToolManifest)(manifest);
121
+ if (!normalized ||
122
+ !connectPlan.valid ||
123
+ normalized.length !== connectPlan.entries.length) {
124
+ return invalidPlan();
125
+ }
126
+ const entries = connectPlan.entries.map((connectEntry, index) => {
127
+ const normalizedEntry = normalized[index];
128
+ return freezeEntry({
129
+ index,
130
+ name: connectEntry.name,
131
+ source: connectEntry.source,
132
+ route: mapRoute(connectEntry.decision),
133
+ descriptorFingerprint: gatewayDescriptorFingerprint(normalizedEntry.descriptor),
134
+ connectDecision: connectEntry.decision,
135
+ connectReason: connectEntry.reason,
136
+ signals: connectEntry.signals,
137
+ });
138
+ });
139
+ const direct = entries.filter(entry => entry.route === exports.GATEWAY_ROUTE.DIRECT);
140
+ const protect = entries.filter(entry => entry.route === exports.GATEWAY_ROUTE.PROTECT);
141
+ const blocked = entries.filter(entry => entry.route === exports.GATEWAY_ROUTE.BLOCK);
142
+ const summary = Object.freeze({
143
+ total: entries.length,
144
+ direct: direct.length,
145
+ protect: protect.length,
146
+ blocked: blocked.length,
147
+ });
148
+ return Object.freeze({
149
+ version: exports.GATEWAY_PLAN_VERSION,
150
+ valid: true,
151
+ ready: blocked.length === 0,
152
+ reason: "PLANNED",
153
+ entries: Object.freeze(entries),
154
+ direct: Object.freeze(direct),
155
+ protect: Object.freeze(protect),
156
+ blocked: Object.freeze(blocked),
157
+ summary,
158
+ });
159
+ }
160
+ //# sourceMappingURL=planner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"planner.js","sourceRoot":"","sources":["../../src/gateway/planner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,126 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.bindGatewayPlanToToolGraph = bindGatewayPlanToToolGraph;
4
+ const planner_js_1 = require("./planner.js");
5
+ function nonEmptyString(value) {
6
+ return typeof value === "string" && value.trim() !== "";
7
+ }
8
+ function validScore(value) {
9
+ return value === undefined ||
10
+ (typeof value === "number" && Number.isFinite(value) && value >= 0 && value <= 100);
11
+ }
12
+ const evidenceLevels = new Set([
13
+ "EXECUTED",
14
+ "MODEL_VISIBLE",
15
+ "RUNTIME_REGISTERED",
16
+ "SERVER_AUTHORITATIVE",
17
+ "HOST_CONFIGURED",
18
+ "SOURCE_DISCOVERED",
19
+ "REGISTRY_CANDIDATE",
20
+ ]);
21
+ const protectionStates = new Set([
22
+ "NONE",
23
+ "NATIVE_IDEMPOTENCY",
24
+ "AUTHORITATIVE_RECONCILIATION",
25
+ "ONCE_HEALTHY",
26
+ "ONCE_UNVERIFIED",
27
+ ]);
28
+ function normalizeBinding(value) {
29
+ if (!value || typeof value !== "object" || Array.isArray(value)) {
30
+ return undefined;
31
+ }
32
+ const record = value;
33
+ if (!nonEmptyString(record.toolId) ||
34
+ !nonEmptyString(record.namespacedName) ||
35
+ !nonEmptyString(record.canonicalName) ||
36
+ !nonEmptyString(record.descriptorFingerprint) ||
37
+ !evidenceLevels.has(record.evidenceLevel) ||
38
+ !validScore(record.actionPriorityScore) ||
39
+ (record.protection !== undefined &&
40
+ !protectionStates.has(record.protection))) {
41
+ return undefined;
42
+ }
43
+ return Object.freeze({
44
+ toolId: record.toolId,
45
+ namespacedName: record.namespacedName,
46
+ canonicalName: record.canonicalName,
47
+ descriptorFingerprint: record.descriptorFingerprint,
48
+ evidenceLevel: record.evidenceLevel,
49
+ ...(record.actionPriorityScore !== undefined
50
+ ? { actionPriorityScore: record.actionPriorityScore }
51
+ : {}),
52
+ ...(record.protection !== undefined
53
+ ? { protection: record.protection }
54
+ : {}),
55
+ });
56
+ }
57
+ function blockedEntry(entry, bindingStatus) {
58
+ return Object.freeze({
59
+ index: entry.index,
60
+ name: entry.name,
61
+ plannedRoute: entry.route,
62
+ route: planner_js_1.GATEWAY_ROUTE.BLOCK,
63
+ descriptorFingerprint: entry.descriptorFingerprint,
64
+ bindingStatus,
65
+ });
66
+ }
67
+ /**
68
+ * Bind a gateway route plan to safe Tool Graph identity records.
69
+ *
70
+ * Binding is intentionally stricter than name matching: one and only one
71
+ * Tool Graph record must match both canonical name and the exact gateway
72
+ * descriptor fingerprint. Evidence/protection state is retained only for
73
+ * reporting; it never downgrades a PROTECT route to DIRECT.
74
+ *
75
+ * The caller may pass a larger/global Tool Graph binding set. Unrelated
76
+ * entries are ignored, so binding the selected runtime subset does not force
77
+ * the global catalog into model context or into the returned plan.
78
+ */
79
+ function bindGatewayPlanToToolGraph(plan, bindings) {
80
+ const normalized = Array.isArray(bindings)
81
+ ? bindings
82
+ .map(normalizeBinding)
83
+ .filter((binding) => Boolean(binding))
84
+ : [];
85
+ const entries = plan.entries.map(entry => {
86
+ if (entry.route === planner_js_1.GATEWAY_ROUTE.BLOCK || !entry.name) {
87
+ return blockedEntry(entry, "NOT_ROUTABLE");
88
+ }
89
+ const sameName = normalized.filter(binding => binding.canonicalName === entry.name);
90
+ const exact = sameName.filter(binding => binding.descriptorFingerprint === entry.descriptorFingerprint);
91
+ if (exact.length > 1) {
92
+ return blockedEntry(entry, "AMBIGUOUS");
93
+ }
94
+ if (exact.length === 0) {
95
+ return blockedEntry(entry, sameName.length > 0 ? "FINGERPRINT_MISMATCH" : "MISSING");
96
+ }
97
+ return Object.freeze({
98
+ index: entry.index,
99
+ name: entry.name,
100
+ plannedRoute: entry.route,
101
+ route: entry.route,
102
+ descriptorFingerprint: entry.descriptorFingerprint,
103
+ bindingStatus: "MATCHED",
104
+ toolGraph: exact[0],
105
+ });
106
+ });
107
+ const matched = entries.filter(entry => entry.bindingStatus === "MATCHED");
108
+ const blocked = entries.filter(entry => entry.route === planner_js_1.GATEWAY_ROUTE.BLOCK);
109
+ const summary = Object.freeze({
110
+ total: entries.length,
111
+ matched: matched.length,
112
+ missing: entries.filter(entry => entry.bindingStatus === "MISSING").length,
113
+ fingerprintMismatch: entries.filter(entry => entry.bindingStatus === "FINGERPRINT_MISMATCH").length,
114
+ ambiguous: entries.filter(entry => entry.bindingStatus === "AMBIGUOUS").length,
115
+ blocked: blocked.length,
116
+ });
117
+ return Object.freeze({
118
+ valid: plan.valid,
119
+ ready: plan.valid && plan.ready && blocked.length === 0,
120
+ entries: Object.freeze(entries),
121
+ matched: Object.freeze(matched),
122
+ blocked: Object.freeze(blocked),
123
+ summary,
124
+ });
125
+ }
126
+ //# sourceMappingURL=tool-graph-binding.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-graph-binding.js","sourceRoot":"","sources":["../../src/gateway/tool-graph-binding.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,131 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createLangChainExecutionObserver = createLangChainExecutionObserver;
4
+ const execution_observation_js_1 = require("./execution-observation.js");
5
+ function asRecord(value) {
6
+ return value && typeof value === "object" && !Array.isArray(value)
7
+ ? value
8
+ : undefined;
9
+ }
10
+ function ownDataValue(value, key) {
11
+ const record = asRecord(value);
12
+ if (!record)
13
+ return undefined;
14
+ const descriptor = Object.getOwnPropertyDescriptor(record, key);
15
+ return descriptor && "value" in descriptor
16
+ ? descriptor.value
17
+ : undefined;
18
+ }
19
+ function ownString(value, key) {
20
+ const raw = ownDataValue(value, key);
21
+ return typeof raw === "string" && raw.trim() !== ""
22
+ ? raw
23
+ : undefined;
24
+ }
25
+ function optionalArgString(args, index) {
26
+ const value = args[index];
27
+ return typeof value === "string" && value.trim() !== ""
28
+ ? value
29
+ : undefined;
30
+ }
31
+ function toolByName(snapshot) {
32
+ const map = new Map();
33
+ for (const tool of snapshot.tools) {
34
+ if (!map.has(tool.canonicalName)) {
35
+ map.set(tool.canonicalName, tool);
36
+ }
37
+ else {
38
+ map.set(tool.canonicalName, null);
39
+ }
40
+ }
41
+ return map;
42
+ }
43
+ function serializedToolName(serialized) {
44
+ const direct = ownString(serialized, "name");
45
+ if (direct)
46
+ return direct;
47
+ const id = ownDataValue(serialized, "id");
48
+ if (!Array.isArray(id) || id.length === 0)
49
+ return undefined;
50
+ const last = id[id.length - 1];
51
+ return typeof last === "string" && last.trim() !== ""
52
+ ? last
53
+ : undefined;
54
+ }
55
+ /**
56
+ * Create a dependency-free object compatible with LangChain callback handler
57
+ * methods for tool execution observation.
58
+ *
59
+ * The observer never invokes a tool and never retains input, output, errors,
60
+ * tags, metadata or parent run state. A matching handleToolStart establishes
61
+ * exact tool identity; handleToolEnd/handleToolError close that run as
62
+ * SUCCEEDED/FAILED respectively.
63
+ */
64
+ function createLangChainExecutionObserver(visibleSnapshot) {
65
+ const byName = toolByName(visibleSnapshot);
66
+ const pending = new Map();
67
+ const collected = [];
68
+ const handleToolStart = (...args) => {
69
+ // Current CallbackHandlerMethods shape:
70
+ // (serializedTool, input, runId, parentRunId?, tags?, metadata?, runName?, toolCallId?)
71
+ const runId = optionalArgString(args, 2);
72
+ if (!runId)
73
+ return;
74
+ const serialized = args[0];
75
+ const runName = optionalArgString(args, 6);
76
+ const name = runName ?? serializedToolName(serialized);
77
+ if (!name)
78
+ return;
79
+ const tool = byName.get(name);
80
+ if (!tool)
81
+ return;
82
+ const toolCallId = optionalArgString(args, 7);
83
+ pending.set(runId, {
84
+ tool,
85
+ startedAtMs: Date.now(),
86
+ ...(toolCallId ? { toolCallId } : {}),
87
+ });
88
+ };
89
+ const finish = (status, args) => {
90
+ // handleToolEnd(output, runId, ...)
91
+ // handleToolError(error, runId, ...)
92
+ const runId = optionalArgString(args, 1);
93
+ if (!runId)
94
+ return;
95
+ const started = pending.get(runId);
96
+ if (!started)
97
+ return;
98
+ pending.delete(runId);
99
+ const now = Date.now();
100
+ const observed = (0, execution_observation_js_1.observeToolExecution)({
101
+ eventId: `langchain-tool-run:${runId}`,
102
+ toolId: started.tool.toolId,
103
+ namespacedName: started.tool.namespacedName,
104
+ descriptorFingerprint: (0, execution_observation_js_1.executionToolFingerprint)(started.tool),
105
+ canonicalName: started.tool.canonicalName,
106
+ framework: "langchain",
107
+ runtimeName: visibleSnapshot.runtimeName,
108
+ source: "framework_callback",
109
+ status,
110
+ observedAt: new Date(now).toISOString(),
111
+ durationMs: Math.max(0, now - started.startedAtMs),
112
+ });
113
+ if (observed.accepted) {
114
+ collected.push(observed.event);
115
+ }
116
+ };
117
+ return Object.freeze({
118
+ name: "once-execution-observer",
119
+ handleToolStart,
120
+ handleToolEnd: (...args) => finish("SUCCEEDED", args),
121
+ handleToolError: (...args) => finish("FAILED", args),
122
+ events: () => Object.freeze([...collected]),
123
+ drain: () => {
124
+ const drained = Object.freeze([...collected]);
125
+ collected.length = 0;
126
+ return drained;
127
+ },
128
+ pendingCount: () => pending.size,
129
+ });
130
+ }
131
+ //# sourceMappingURL=langchain-execution-observer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"langchain-execution-observer.js","sourceRoot":"","sources":["../src/langchain-execution-observer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,218 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.discoverLangChainRegisteredTools = discoverLangChainRegisteredTools;
4
+ exports.discoverLangChainModelVisibleTools = discoverLangChainModelVisibleTools;
5
+ const node_crypto_1 = require("node:crypto");
6
+ const tool_importance_js_1 = require("./tool-importance.js");
7
+ function asRecord(value) {
8
+ if (value &&
9
+ typeof value === "object" &&
10
+ !Array.isArray(value)) {
11
+ return value;
12
+ }
13
+ return undefined;
14
+ }
15
+ function ownDataValue(record, key) {
16
+ if (!record)
17
+ return undefined;
18
+ const descriptor = Object.getOwnPropertyDescriptor(record, key);
19
+ return descriptor && "value" in descriptor
20
+ ? descriptor.value
21
+ : undefined;
22
+ }
23
+ function stableId(value) {
24
+ return `tool:${(0, node_crypto_1.createHash)("sha256")
25
+ .update(JSON.stringify(value))
26
+ .digest("hex")}`;
27
+ }
28
+ function stringValue(value) {
29
+ return typeof value === "string" && value.trim() !== ""
30
+ ? value
31
+ : undefined;
32
+ }
33
+ const secretNamePattern = /(?:^|[_-])(authorization|api[_-]?key|token|password|passwd|secret|credential|cookie)(?:$|[_-])/i;
34
+ function safeJsonData(value, depth = 0, seen = new Set(), secretContext = false) {
35
+ if (value === null)
36
+ return null;
37
+ if (typeof value === "string" ||
38
+ typeof value === "boolean") {
39
+ return secretContext ? "<redacted>" : value;
40
+ }
41
+ if (typeof value === "number") {
42
+ return Number.isFinite(value)
43
+ ? (secretContext ? "<redacted>" : value)
44
+ : undefined;
45
+ }
46
+ if (typeof value !== "object" || depth > 12) {
47
+ return undefined;
48
+ }
49
+ const objectValue = value;
50
+ if (seen.has(objectValue))
51
+ return undefined;
52
+ const prototype = Object.getPrototypeOf(value);
53
+ if (!Array.isArray(value) &&
54
+ prototype !== Object.prototype &&
55
+ prototype !== null) {
56
+ return undefined;
57
+ }
58
+ seen.add(objectValue);
59
+ try {
60
+ if (Array.isArray(value)) {
61
+ const output = [];
62
+ for (let index = 0; index < value.length; index++) {
63
+ const descriptor = Object.getOwnPropertyDescriptor(value, String(index));
64
+ if (!descriptor || !("value" in descriptor)) {
65
+ return undefined;
66
+ }
67
+ const item = safeJsonData(descriptor.value, depth + 1, seen, secretContext);
68
+ if (item === undefined)
69
+ return undefined;
70
+ output.push(item);
71
+ }
72
+ return output;
73
+ }
74
+ const output = {};
75
+ const descriptors = Object.getOwnPropertyDescriptors(value);
76
+ for (const [key, descriptor] of Object.entries(descriptors)) {
77
+ if (!("value" in descriptor))
78
+ continue;
79
+ if (descriptor.value === undefined)
80
+ continue;
81
+ const child = safeJsonData(descriptor.value, depth + 1, seen, secretContext || secretNamePattern.test(key));
82
+ if (child !== undefined) {
83
+ output[key] = child;
84
+ }
85
+ }
86
+ return output;
87
+ }
88
+ finally {
89
+ seen.delete(objectValue);
90
+ }
91
+ }
92
+ function langChainTools(input) {
93
+ if (Array.isArray(input))
94
+ return input;
95
+ const record = asRecord(input);
96
+ if (!record)
97
+ return [];
98
+ const tools = ownDataValue(record, "tools");
99
+ return Array.isArray(tools) ? tools : [];
100
+ }
101
+ function openAiFormattedFunction(tool) {
102
+ const type = stringValue(ownDataValue(tool, "type"));
103
+ if (type !== "function")
104
+ return undefined;
105
+ return asRecord(ownDataValue(tool, "function"));
106
+ }
107
+ function observeLangChainTool(rawTool, evidence, source, index, runtimeName) {
108
+ const tool = asRecord(rawTool);
109
+ if (!tool)
110
+ return undefined;
111
+ const formatted = openAiFormattedFunction(tool);
112
+ const name = stringValue(ownDataValue(tool, "name")) ??
113
+ stringValue(ownDataValue(formatted, "name"));
114
+ if (!name)
115
+ return undefined;
116
+ const description = stringValue(ownDataValue(tool, "description")) ??
117
+ stringValue(ownDataValue(formatted, "description")) ??
118
+ "";
119
+ const rawSchema = ownDataValue(tool, "schema") ??
120
+ ownDataValue(tool, "inputSchema") ??
121
+ ownDataValue(tool, "parameters") ??
122
+ ownDataValue(formatted, "parameters");
123
+ const schema = safeJsonData(rawSchema);
124
+ const schemaOpaque = rawSchema !== undefined &&
125
+ schema === undefined;
126
+ const autoExecutable = [
127
+ ownDataValue(tool, "invoke"),
128
+ ownDataValue(tool, "call"),
129
+ ownDataValue(tool, "func"),
130
+ ].some(value => typeof value === "function");
131
+ const rawReturnDirect = ownDataValue(tool, "returnDirect");
132
+ const returnDirect = typeof rawReturnDirect === "boolean"
133
+ ? rawReturnDirect
134
+ : undefined;
135
+ const namespace = `langchain/${runtimeName ?? "runtime"}`;
136
+ const toolType = formatted
137
+ ? "function"
138
+ : "structured_tool";
139
+ const safeMetadata = {
140
+ autoExecutable,
141
+ ...(schemaOpaque ? { schemaOpaque: true } : {}),
142
+ ...(returnDirect !== undefined ? { returnDirect } : {}),
143
+ };
144
+ const once = (0, tool_importance_js_1.assessToolImportance)({
145
+ name,
146
+ description,
147
+ sourceCategory: toolType,
148
+ evidence,
149
+ readOnlyHint: /(?:^|[_-])(?:search|lookup|retrieve|fetch|get|list|read|find)(?:$|[_-])/i.test(name)
150
+ ? true
151
+ : undefined,
152
+ });
153
+ return {
154
+ toolId: stableId({
155
+ framework: "langchain",
156
+ namespace,
157
+ name,
158
+ toolType,
159
+ description,
160
+ schema,
161
+ }),
162
+ namespacedName: `${namespace}/${name}`,
163
+ canonicalName: name,
164
+ displayName: name,
165
+ description,
166
+ toolType,
167
+ framework: "langchain",
168
+ origin: {
169
+ kind: "runtime",
170
+ source,
171
+ ...(runtimeName ? { runtimeName } : {}),
172
+ index,
173
+ },
174
+ evidence: {
175
+ level: evidence,
176
+ source: `${namespace}:${source}`,
177
+ },
178
+ visibility: {
179
+ configured: true,
180
+ runtimeRegistered: true,
181
+ modelVisible: evidence === "MODEL_VISIBLE",
182
+ executed: false,
183
+ },
184
+ ...(schema !== undefined ? { inputSchema: schema } : {}),
185
+ safeMetadata,
186
+ once,
187
+ };
188
+ }
189
+ function discover(input, evidence, source, runtimeName) {
190
+ return langChainTools(input)
191
+ .map((tool, index) => observeLangChainTool(tool, evidence, source, index, runtimeName))
192
+ .filter((tool) => Boolean(tool));
193
+ }
194
+ function discoverLangChainRegisteredTools(toolsOrAgentConfig, runtimeName) {
195
+ const tools = discover(toolsOrAgentConfig, "RUNTIME_REGISTERED", "langchain.tools", runtimeName);
196
+ return {
197
+ framework: "langchain",
198
+ ...(runtimeName ? { runtimeName } : {}),
199
+ registeredToolCount: tools.length,
200
+ tools,
201
+ externalCallsMade: false,
202
+ toolInvocationsMade: false,
203
+ secretValuesRetained: false,
204
+ };
205
+ }
206
+ function discoverLangChainModelVisibleTools(toolsPassedToBindTools, runtimeName) {
207
+ const tools = discover(toolsPassedToBindTools, "MODEL_VISIBLE", "langchain.bindTools", runtimeName);
208
+ return {
209
+ framework: "langchain",
210
+ ...(runtimeName ? { runtimeName } : {}),
211
+ modelVisibleToolCount: tools.length,
212
+ tools,
213
+ externalCallsMade: false,
214
+ toolInvocationsMade: false,
215
+ secretValuesRetained: false,
216
+ };
217
+ }
218
+ //# sourceMappingURL=langchain-runtime-discovery.js.map