@tenova/swt3-ai 0.5.5 → 0.5.7

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 (78) hide show
  1. package/README.md +44 -15
  2. package/dist/adapters/a2a.d.ts +26 -0
  3. package/dist/adapters/a2a.d.ts.map +1 -0
  4. package/dist/adapters/a2a.js +86 -0
  5. package/dist/adapters/a2a.js.map +1 -0
  6. package/dist/adapters/cohere.d.ts +28 -0
  7. package/dist/adapters/cohere.d.ts.map +1 -0
  8. package/dist/adapters/cohere.js +292 -0
  9. package/dist/adapters/cohere.js.map +1 -0
  10. package/dist/adapters/crewai.d.ts +26 -0
  11. package/dist/adapters/crewai.d.ts.map +1 -0
  12. package/dist/adapters/crewai.js +78 -0
  13. package/dist/adapters/crewai.js.map +1 -0
  14. package/dist/adapters/foundry.d.ts +26 -0
  15. package/dist/adapters/foundry.d.ts.map +1 -0
  16. package/dist/adapters/foundry.js +118 -0
  17. package/dist/adapters/foundry.js.map +1 -0
  18. package/dist/adapters/google-adk.d.ts +25 -0
  19. package/dist/adapters/google-adk.d.ts.map +1 -0
  20. package/dist/adapters/google-adk.js +81 -0
  21. package/dist/adapters/google-adk.js.map +1 -0
  22. package/dist/adapters/ollama.d.ts +20 -0
  23. package/dist/adapters/ollama.d.ts.map +1 -1
  24. package/dist/adapters/ollama.js +22 -0
  25. package/dist/adapters/ollama.js.map +1 -1
  26. package/dist/adapters/qdrant.d.ts +28 -0
  27. package/dist/adapters/qdrant.d.ts.map +1 -0
  28. package/dist/adapters/qdrant.js +136 -0
  29. package/dist/adapters/qdrant.js.map +1 -0
  30. package/dist/chain.d.ts +33 -0
  31. package/dist/chain.d.ts.map +1 -0
  32. package/dist/chain.js +94 -0
  33. package/dist/chain.js.map +1 -0
  34. package/dist/clearing.d.ts +7 -2
  35. package/dist/clearing.d.ts.map +1 -1
  36. package/dist/clearing.js +16 -5
  37. package/dist/clearing.js.map +1 -1
  38. package/dist/cli.d.ts +1 -0
  39. package/dist/cli.d.ts.map +1 -1
  40. package/dist/cli.js +123 -6
  41. package/dist/cli.js.map +1 -1
  42. package/dist/config.d.ts.map +1 -1
  43. package/dist/config.js +15 -0
  44. package/dist/config.js.map +1 -1
  45. package/dist/demo.d.ts.map +1 -1
  46. package/dist/demo.js +173 -10
  47. package/dist/demo.js.map +1 -1
  48. package/dist/doctor.d.ts +1 -1
  49. package/dist/doctor.d.ts.map +1 -1
  50. package/dist/doctor.js +39 -16
  51. package/dist/doctor.js.map +1 -1
  52. package/dist/index.d.ts +9 -2
  53. package/dist/index.d.ts.map +1 -1
  54. package/dist/index.js +7 -1
  55. package/dist/index.js.map +1 -1
  56. package/dist/procedures.d.ts +20 -0
  57. package/dist/procedures.d.ts.map +1 -0
  58. package/dist/procedures.js +167 -0
  59. package/dist/procedures.js.map +1 -0
  60. package/dist/profile.d.ts +50 -0
  61. package/dist/profile.d.ts.map +1 -0
  62. package/dist/profile.js +109 -0
  63. package/dist/profile.js.map +1 -0
  64. package/dist/trust.d.ts +96 -2
  65. package/dist/trust.d.ts.map +1 -1
  66. package/dist/trust.js +200 -9
  67. package/dist/trust.js.map +1 -1
  68. package/dist/types.d.ts +120 -1
  69. package/dist/types.d.ts.map +1 -1
  70. package/dist/types.js +177 -1
  71. package/dist/types.js.map +1 -1
  72. package/dist/witness.d.ts +595 -0
  73. package/dist/witness.d.ts.map +1 -1
  74. package/dist/witness.js +1708 -202
  75. package/dist/witness.js.map +1 -1
  76. package/package.json +2 -2
  77. package/templates/healthcare-clinical.yaml +4 -0
  78. package/templates/multi-silicon.yaml +48 -0
@@ -0,0 +1,78 @@
1
+ /**
2
+ * SWT3 AI Witness SDK -- CrewAI Adapter.
3
+ *
4
+ * Wraps any object with a kickoff() method (CrewAI Crew pattern),
5
+ * minting witness anchors on each crew execution without modifying
6
+ * the crew logic or adding framework dependencies.
7
+ *
8
+ * Usage:
9
+ * import { wrapCrewAI } from "@tenova/swt3-ai/adapters/crewai";
10
+ * const witnessed = wrapCrewAI(crew, witness);
11
+ * const result = await witnessed.kickoff();
12
+ *
13
+ * Duck-typed: works with any object that has a kickoff() method.
14
+ * No crewai import required.
15
+ *
16
+ * Copyright (c) 2026 Tenable Nova LLC. Apache 2.0. Patent pending.
17
+ */
18
+ import { sha256Truncated } from "../fingerprint.js";
19
+ function resolveModelId(crew, explicit) {
20
+ if (explicit)
21
+ return explicit;
22
+ if (typeof process !== "undefined" && process.env.SWT3_MODEL_ID) {
23
+ return process.env.SWT3_MODEL_ID;
24
+ }
25
+ if (crew.name)
26
+ return `crewai-${crew.name}`;
27
+ return "crewai-crew";
28
+ }
29
+ function stringifyResult(result) {
30
+ if (result === null || result === undefined)
31
+ return "";
32
+ if (typeof result === "string")
33
+ return result;
34
+ try {
35
+ return JSON.stringify(result);
36
+ }
37
+ catch {
38
+ return String(result);
39
+ }
40
+ }
41
+ export function wrapCrewAI(crew, witness, modelId) {
42
+ const mid = resolveModelId(crew, modelId);
43
+ const originalKickoff = crew.kickoff.bind(crew);
44
+ const agentCount = Array.isArray(crew.agents) ? crew.agents.length : 0;
45
+ const taskCount = Array.isArray(crew.tasks) ? crew.tasks.length : 0;
46
+ const wrapped = Object.create(crew);
47
+ wrapped.kickoff = (inputs) => {
48
+ const start = performance.now();
49
+ const inputStr = inputs ? JSON.stringify(inputs) : "kickoff";
50
+ const result = originalKickoff(inputs);
51
+ const finish = (res) => {
52
+ const elapsed = Math.round(performance.now() - start);
53
+ const record = {
54
+ modelId: mid,
55
+ modelHash: sha256Truncated(mid),
56
+ promptHash: sha256Truncated(inputStr),
57
+ responseHash: sha256Truncated(stringifyResult(res)),
58
+ latencyMs: elapsed,
59
+ inputTokens: agentCount,
60
+ outputTokens: taskCount,
61
+ guardrailsActive: 0,
62
+ guardrailsRequired: 0,
63
+ guardrailPassed: true,
64
+ hasRefusal: false,
65
+ provider: "crewai",
66
+ guardrailNames: [],
67
+ };
68
+ witness.record(record);
69
+ return res;
70
+ };
71
+ if (result && typeof result.then === "function") {
72
+ return result.then(finish);
73
+ }
74
+ return finish(result);
75
+ };
76
+ return wrapped;
77
+ }
78
+ //# sourceMappingURL=crewai.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crewai.js","sourceRoot":"","sources":["../../src/adapters/crewai.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * SWT3 AI Witness SDK -- Microsoft Foundry Adapter.
3
+ *
4
+ * Wraps any object with an execute() method (Microsoft Agent Framework pattern),
5
+ * minting witness anchors on each agent execution without modifying
6
+ * the agent logic or adding framework dependencies.
7
+ *
8
+ * Usage:
9
+ * import { wrapFoundry } from "@tenova/swt3-ai/adapters/foundry";
10
+ * const witnessed = wrapFoundry(agent, witness);
11
+ * const result = await witnessed.execute("Summarize this document");
12
+ *
13
+ * Duck-typed: works with any object that has an execute() method.
14
+ * No Microsoft SDK import required.
15
+ *
16
+ * Copyright (c) 2026 Tenable Nova LLC. Apache 2.0. Patent pending.
17
+ */
18
+ import type { Witness } from "../witness.js";
19
+ export interface FoundryAgent {
20
+ execute(prompt: unknown, ...args: unknown[]): unknown;
21
+ interceptToolCall?(toolName: string, toolInput: unknown, ...args: unknown[]): unknown;
22
+ name?: string;
23
+ model?: string;
24
+ }
25
+ export declare function wrapFoundry<T extends FoundryAgent>(agent: T, witness: Witness, modelId?: string): T;
26
+ //# sourceMappingURL=foundry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"foundry.d.ts","sourceRoot":"","sources":["../../src/adapters/foundry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAI7C,MAAM,WAAW,YAAY;IAC3B,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IACtD,iBAAiB,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IACtF,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAiGD,wBAAgB,WAAW,CAAC,CAAC,SAAS,YAAY,EAChD,KAAK,EAAE,CAAC,EACR,OAAO,EAAE,OAAO,EAChB,OAAO,CAAC,EAAE,MAAM,GACf,CAAC,CAUH"}
@@ -0,0 +1,118 @@
1
+ /**
2
+ * SWT3 AI Witness SDK -- Microsoft Foundry Adapter.
3
+ *
4
+ * Wraps any object with an execute() method (Microsoft Agent Framework pattern),
5
+ * minting witness anchors on each agent execution without modifying
6
+ * the agent logic or adding framework dependencies.
7
+ *
8
+ * Usage:
9
+ * import { wrapFoundry } from "@tenova/swt3-ai/adapters/foundry";
10
+ * const witnessed = wrapFoundry(agent, witness);
11
+ * const result = await witnessed.execute("Summarize this document");
12
+ *
13
+ * Duck-typed: works with any object that has an execute() method.
14
+ * No Microsoft SDK import required.
15
+ *
16
+ * Copyright (c) 2026 Tenable Nova LLC. Apache 2.0. Patent pending.
17
+ */
18
+ import { sha256Truncated } from "../fingerprint.js";
19
+ function resolveModelId(agent, explicit) {
20
+ if (explicit)
21
+ return explicit;
22
+ if (typeof process !== "undefined" && process.env.SWT3_MODEL_ID) {
23
+ return process.env.SWT3_MODEL_ID;
24
+ }
25
+ if (agent.model)
26
+ return agent.model;
27
+ if (agent.name)
28
+ return `foundry-${agent.name}`;
29
+ return "foundry-agent";
30
+ }
31
+ function stringifyMessage(msg) {
32
+ if (msg === null || msg === undefined)
33
+ return "";
34
+ if (typeof msg === "string")
35
+ return msg;
36
+ try {
37
+ return JSON.stringify(msg);
38
+ }
39
+ catch {
40
+ return String(msg);
41
+ }
42
+ }
43
+ function wrapMethod(target, methodName, witness, mid) {
44
+ const original = target[methodName];
45
+ if (typeof original !== "function")
46
+ return;
47
+ const bound = original.bind(target);
48
+ if (methodName === "execute") {
49
+ target[methodName] = (prompt, ...args) => {
50
+ const start = performance.now();
51
+ const result = bound(prompt, ...args);
52
+ const finish = (res) => {
53
+ const elapsed = Math.round(performance.now() - start);
54
+ const record = {
55
+ modelId: mid,
56
+ modelHash: sha256Truncated(mid),
57
+ promptHash: sha256Truncated(stringifyMessage(prompt)),
58
+ responseHash: sha256Truncated(stringifyMessage(res)),
59
+ latencyMs: elapsed,
60
+ inputTokens: 0,
61
+ outputTokens: 0,
62
+ guardrailsActive: 0,
63
+ guardrailsRequired: 0,
64
+ guardrailPassed: true,
65
+ hasRefusal: false,
66
+ provider: "microsoft-foundry",
67
+ guardrailNames: [],
68
+ };
69
+ witness.record(record);
70
+ return res;
71
+ };
72
+ if (result && typeof result.then === "function") {
73
+ return result.then(finish);
74
+ }
75
+ return finish(result);
76
+ };
77
+ }
78
+ else {
79
+ target[methodName] = (toolName, toolInput, ...args) => {
80
+ const start = performance.now();
81
+ const result = bound(toolName, toolInput, ...args);
82
+ const finish = (res) => {
83
+ const elapsed = Math.round(performance.now() - start);
84
+ const record = {
85
+ modelId: mid,
86
+ modelHash: sha256Truncated(mid),
87
+ promptHash: sha256Truncated(`${toolName}:${stringifyMessage(toolInput)}`),
88
+ responseHash: sha256Truncated(stringifyMessage(res)),
89
+ latencyMs: elapsed,
90
+ inputTokens: 0,
91
+ outputTokens: 0,
92
+ guardrailsActive: 0,
93
+ guardrailsRequired: 0,
94
+ guardrailPassed: true,
95
+ hasRefusal: false,
96
+ provider: "microsoft-foundry",
97
+ guardrailNames: [],
98
+ };
99
+ witness.record(record);
100
+ return res;
101
+ };
102
+ if (result && typeof result.then === "function") {
103
+ return result.then(finish);
104
+ }
105
+ return finish(result);
106
+ };
107
+ }
108
+ }
109
+ export function wrapFoundry(agent, witness, modelId) {
110
+ const mid = resolveModelId(agent, modelId);
111
+ const wrapped = Object.create(agent);
112
+ wrapMethod(wrapped, "execute", witness, mid);
113
+ if (agent.interceptToolCall) {
114
+ wrapMethod(wrapped, "interceptToolCall", witness, mid);
115
+ }
116
+ return wrapped;
117
+ }
118
+ //# sourceMappingURL=foundry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"foundry.js","sourceRoot":"","sources":["../../src/adapters/foundry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * SWT3 AI Witness SDK -- Google ADK (Agent Development Kit) Adapter.
3
+ *
4
+ * Wraps any object with a run() method (Google ADK Agent pattern),
5
+ * minting witness anchors on each agent execution without modifying
6
+ * the agent logic or adding framework dependencies.
7
+ *
8
+ * Usage:
9
+ * import { wrapGoogleADK } from "@tenova/swt3-ai/adapters/google-adk";
10
+ * const witnessed = wrapGoogleADK(agent, witness);
11
+ * const result = await witnessed.run("What is the weather?");
12
+ *
13
+ * Duck-typed: works with any object that has a run() method.
14
+ * No google-adk import required.
15
+ *
16
+ * Copyright (c) 2026 Tenable Nova LLC. Apache 2.0. Patent pending.
17
+ */
18
+ import type { Witness } from "../witness.js";
19
+ export interface GoogleADKAgent {
20
+ run(prompt: string, ...args: unknown[]): unknown;
21
+ model?: string;
22
+ name?: string;
23
+ }
24
+ export declare function wrapGoogleADK<T extends GoogleADKAgent>(agent: T, witness: Witness, modelId?: string): T;
25
+ //# sourceMappingURL=google-adk.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"google-adk.d.ts","sourceRoot":"","sources":["../../src/adapters/google-adk.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAI7C,MAAM,WAAW,cAAc;IAC7B,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IACjD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAuBD,wBAAgB,aAAa,CAAC,CAAC,SAAS,cAAc,EACpD,KAAK,EAAE,CAAC,EACR,OAAO,EAAE,OAAO,EAChB,OAAO,CAAC,EAAE,MAAM,GACf,CAAC,CAuCH"}
@@ -0,0 +1,81 @@
1
+ /**
2
+ * SWT3 AI Witness SDK -- Google ADK (Agent Development Kit) Adapter.
3
+ *
4
+ * Wraps any object with a run() method (Google ADK Agent pattern),
5
+ * minting witness anchors on each agent execution without modifying
6
+ * the agent logic or adding framework dependencies.
7
+ *
8
+ * Usage:
9
+ * import { wrapGoogleADK } from "@tenova/swt3-ai/adapters/google-adk";
10
+ * const witnessed = wrapGoogleADK(agent, witness);
11
+ * const result = await witnessed.run("What is the weather?");
12
+ *
13
+ * Duck-typed: works with any object that has a run() method.
14
+ * No google-adk import required.
15
+ *
16
+ * Copyright (c) 2026 Tenable Nova LLC. Apache 2.0. Patent pending.
17
+ */
18
+ import { sha256Truncated } from "../fingerprint.js";
19
+ function resolveModelId(agent, explicit) {
20
+ if (explicit)
21
+ return explicit;
22
+ if (typeof process !== "undefined") {
23
+ if (process.env.SWT3_MODEL_ID)
24
+ return process.env.SWT3_MODEL_ID;
25
+ if (process.env.GOOGLE_ADK_MODEL)
26
+ return process.env.GOOGLE_ADK_MODEL;
27
+ }
28
+ if (agent.model)
29
+ return agent.model;
30
+ if (agent.name)
31
+ return `google-adk-${agent.name}`;
32
+ return "google-adk-agent";
33
+ }
34
+ function stringifyResult(result) {
35
+ if (result === null || result === undefined)
36
+ return "";
37
+ if (typeof result === "string")
38
+ return result;
39
+ try {
40
+ return JSON.stringify(result);
41
+ }
42
+ catch {
43
+ return String(result);
44
+ }
45
+ }
46
+ export function wrapGoogleADK(agent, witness, modelId) {
47
+ const mid = resolveModelId(agent, modelId);
48
+ const originalRun = agent.run.bind(agent);
49
+ const wrapped = Object.create(agent);
50
+ wrapped.run = (prompt, ...args) => {
51
+ const start = performance.now();
52
+ const result = originalRun(prompt, ...args);
53
+ const finish = (res) => {
54
+ const elapsed = Math.round(performance.now() - start);
55
+ const record = {
56
+ modelId: mid,
57
+ modelHash: sha256Truncated(mid),
58
+ promptHash: sha256Truncated(prompt),
59
+ responseHash: sha256Truncated(stringifyResult(res)),
60
+ latencyMs: elapsed,
61
+ inputTokens: 0,
62
+ outputTokens: 0,
63
+ guardrailsActive: 0,
64
+ guardrailsRequired: 0,
65
+ guardrailPassed: true,
66
+ hasRefusal: false,
67
+ provider: "google-adk",
68
+ guardrailNames: [],
69
+ };
70
+ witness.record(record);
71
+ return res;
72
+ };
73
+ // Handle both sync and async run() methods
74
+ if (result && typeof result.then === "function") {
75
+ return result.then(finish);
76
+ }
77
+ return finish(result);
78
+ };
79
+ return wrapped;
80
+ }
81
+ //# sourceMappingURL=google-adk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"google-adk.js","sourceRoot":"","sources":["../../src/adapters/google-adk.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAIH,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAQpD,SAAS,cAAc,CAAC,KAAqB,EAAE,QAAiB;IAC9D,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC9B,IAAI,OAAO,OAAO,KAAK,WAAW,EAAE,CAAC;QACnC,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa;YAAE,OAAO,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;QAChE,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB;YAAE,OAAO,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;IACxE,CAAC;IACD,IAAI,KAAK,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC,KAAK,CAAC;IACpC,IAAI,KAAK,CAAC,IAAI;QAAE,OAAO,cAAc,KAAK,CAAC,IAAI,EAAE,CAAC;IAClD,OAAO,kBAAkB,CAAC;AAC5B,CAAC;AAED,SAAS,eAAe,CAAC,MAAe;IACtC,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,EAAE,CAAC;IACvD,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAC;IAC9C,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC;IACxB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,KAAQ,EACR,OAAgB,EAChB,OAAgB;IAEhB,MAAM,GAAG,GAAG,cAAc,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC3C,MAAM,WAAW,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAE1C,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAM,CAAC;IAE1C,OAAO,CAAC,GAAG,GAAG,CAAC,MAAc,EAAE,GAAG,IAAe,EAAW,EAAE;QAC5D,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QAChC,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC;QAE5C,MAAM,MAAM,GAAG,CAAC,GAAY,EAAW,EAAE;YACvC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,CAAC;YACtD,MAAM,MAAM,GAAoB;gBAC9B,OAAO,EAAE,GAAG;gBACZ,SAAS,EAAE,eAAe,CAAC,GAAG,CAAC;gBAC/B,UAAU,EAAE,eAAe,CAAC,MAAM,CAAC;gBACnC,YAAY,EAAE,eAAe,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;gBACnD,SAAS,EAAE,OAAO;gBAClB,WAAW,EAAE,CAAC;gBACd,YAAY,EAAE,CAAC;gBACf,gBAAgB,EAAE,CAAC;gBACnB,kBAAkB,EAAE,CAAC;gBACrB,eAAe,EAAE,IAAI;gBACrB,UAAU,EAAE,KAAK;gBACjB,QAAQ,EAAE,YAAY;gBACtB,cAAc,EAAE,EAAE;aACnB,CAAC;YACF,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACvB,OAAO,GAAG,CAAC;QACb,CAAC,CAAC;QAEF,2CAA2C;QAC3C,IAAI,MAAM,IAAI,OAAQ,MAAc,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YACzD,OAAQ,MAA2B,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACnD,CAAC;QACD,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC;IACxB,CAAC,CAAC;IAEF,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -5,9 +5,29 @@
5
5
  * provider="ollama". Ollama uses an OpenAI-compatible API at
6
6
  * http://localhost:11434/v1.
7
7
  *
8
+ * Compatible with Ollama 0.30+ (GGUF models, structured outputs via
9
+ * OpenAI-compatible API). Model names with tags and quantization suffixes
10
+ * are preserved as-is (e.g., "llama3.2:latest", "qwen2.5:7b-instruct-q4_0").
11
+ *
8
12
  * Auto-detected by witness.wrap() when base_url contains ":11434".
9
13
  */
10
14
  import type { Witness } from "../witness.js";
15
+ /**
16
+ * Wrap an OpenAI client (pointed at Ollama) with transparent witnessing.
17
+ *
18
+ * Identical to the OpenAI adapter but tags all InferenceRecords with
19
+ * provider="ollama" for accurate lineage tracking.
20
+ */
11
21
  export declare function wrapOllama(client: unknown, witness: Witness): unknown;
12
22
  export declare function isOllamaClient(client: unknown): boolean;
23
+ /**
24
+ * Normalize an Ollama model name, preserving GGUF tags and quantization.
25
+ *
26
+ * Ollama 0.30+ model names include tags and quantization suffixes that
27
+ * are significant for lineage tracking:
28
+ * "llama3.2:latest" -> "llama3.2:latest"
29
+ * "qwen2.5:7b-instruct-q4_0" -> "qwen2.5:7b-instruct-q4_0"
30
+ * "mistral" -> "mistral"
31
+ */
32
+ export declare function normalizeOllamaModel(model: string): string;
13
33
  //# sourceMappingURL=ollama.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ollama.d.ts","sourceRoot":"","sources":["../../src/adapters/ollama.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAE7C,wBAAgB,UAAU,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAErE;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAGvD"}
1
+ {"version":3,"file":"ollama.d.ts","sourceRoot":"","sources":["../../src/adapters/ollama.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAE7C;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAErE;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAGvD;AAED;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE1D"}
@@ -5,9 +5,19 @@
5
5
  * provider="ollama". Ollama uses an OpenAI-compatible API at
6
6
  * http://localhost:11434/v1.
7
7
  *
8
+ * Compatible with Ollama 0.30+ (GGUF models, structured outputs via
9
+ * OpenAI-compatible API). Model names with tags and quantization suffixes
10
+ * are preserved as-is (e.g., "llama3.2:latest", "qwen2.5:7b-instruct-q4_0").
11
+ *
8
12
  * Auto-detected by witness.wrap() when base_url contains ":11434".
9
13
  */
10
14
  import { wrapOpenAI } from "./openai.js";
15
+ /**
16
+ * Wrap an OpenAI client (pointed at Ollama) with transparent witnessing.
17
+ *
18
+ * Identical to the OpenAI adapter but tags all InferenceRecords with
19
+ * provider="ollama" for accurate lineage tracking.
20
+ */
11
21
  export function wrapOllama(client, witness) {
12
22
  return wrapOpenAI(client, witness, "ollama");
13
23
  }
@@ -15,6 +25,18 @@ export function isOllamaClient(client) {
15
25
  const baseURL = getBaseURL(client);
16
26
  return baseURL.includes(":11434");
17
27
  }
28
+ /**
29
+ * Normalize an Ollama model name, preserving GGUF tags and quantization.
30
+ *
31
+ * Ollama 0.30+ model names include tags and quantization suffixes that
32
+ * are significant for lineage tracking:
33
+ * "llama3.2:latest" -> "llama3.2:latest"
34
+ * "qwen2.5:7b-instruct-q4_0" -> "qwen2.5:7b-instruct-q4_0"
35
+ * "mistral" -> "mistral"
36
+ */
37
+ export function normalizeOllamaModel(model) {
38
+ return model?.trim() || "unknown";
39
+ }
18
40
  function getBaseURL(client) {
19
41
  if (client === null || client === undefined)
20
42
  return "";
@@ -1 +1 @@
1
- {"version":3,"file":"ollama.js","sourceRoot":"","sources":["../../src/adapters/ollama.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC,MAAM,UAAU,UAAU,CAAC,MAAe,EAAE,OAAgB;IAC1D,OAAO,UAAU,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,MAAe;IAC5C,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;IACnC,OAAO,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AACpC,CAAC;AAED,SAAS,UAAU,CAAC,MAAe;IACjC,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,EAAE,CAAC;IACvD,MAAM,GAAG,GAAG,MAAiC,CAAC;IAC9C,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC;IAC9C,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;AACrB,CAAC"}
1
+ {"version":3,"file":"ollama.js","sourceRoot":"","sources":["../../src/adapters/ollama.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC;;;;;GAKG;AACH,MAAM,UAAU,UAAU,CAAC,MAAe,EAAE,OAAgB;IAC1D,OAAO,UAAU,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,MAAe;IAC5C,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;IACnC,OAAO,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AACpC,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,oBAAoB,CAAC,KAAa;IAChD,OAAO,KAAK,EAAE,IAAI,EAAE,IAAI,SAAS,CAAC;AACpC,CAAC;AAED,SAAS,UAAU,CAAC,MAAe;IACjC,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,EAAE,CAAC;IACvD,MAAM,GAAG,GAAG,MAAiC,CAAC;IAC9C,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC;IAC9C,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;AACrB,CAAC"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * SWT3 AI Witness SDK -- Qdrant Vector Database Adapter.
3
+ *
4
+ * Wraps the Qdrant JavaScript/TypeScript client to witness vector search
5
+ * operations. Mints AI-RAG.1 anchors for each retrieval, creating
6
+ * database-level compliance evidence for RAG pipelines.
7
+ *
8
+ * Usage:
9
+ * import { QdrantClient } from "@qdrant/js-client-rest";
10
+ * import { wrapQdrant } from "@tenova/swt3-ai/adapters/qdrant";
11
+ *
12
+ * const witness = new Witness({ endpoint: "...", apiKey: "...", tenantId: "..." });
13
+ * const client = new QdrantClient({ url: "http://localhost:6333" });
14
+ * const witnessed = wrapQdrant(client, witness);
15
+ *
16
+ * const results = await witnessed.search("docs", { vector: [...], limit: 10 });
17
+ *
18
+ * Copyright (c) 2026 Tenable Nova LLC. Apache 2.0. Patent pending.
19
+ */
20
+ import type { Witness } from "../witness.js";
21
+ /**
22
+ * Wrap a QdrantClient with an ES6 Proxy for transparent RAG witnessing.
23
+ *
24
+ * Intercepts search() and query() to mint AI-RAG.1 anchors for every
25
+ * vector retrieval operation.
26
+ */
27
+ export declare function wrapQdrant(client: unknown, witness: Witness): unknown;
28
+ //# sourceMappingURL=qdrant.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"qdrant.d.ts","sourceRoot":"","sources":["../../src/adapters/qdrant.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAI7C;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAkBrE"}
@@ -0,0 +1,136 @@
1
+ /**
2
+ * SWT3 AI Witness SDK -- Qdrant Vector Database Adapter.
3
+ *
4
+ * Wraps the Qdrant JavaScript/TypeScript client to witness vector search
5
+ * operations. Mints AI-RAG.1 anchors for each retrieval, creating
6
+ * database-level compliance evidence for RAG pipelines.
7
+ *
8
+ * Usage:
9
+ * import { QdrantClient } from "@qdrant/js-client-rest";
10
+ * import { wrapQdrant } from "@tenova/swt3-ai/adapters/qdrant";
11
+ *
12
+ * const witness = new Witness({ endpoint: "...", apiKey: "...", tenantId: "..." });
13
+ * const client = new QdrantClient({ url: "http://localhost:6333" });
14
+ * const witnessed = wrapQdrant(client, witness);
15
+ *
16
+ * const results = await witnessed.search("docs", { vector: [...], limit: 10 });
17
+ *
18
+ * Copyright (c) 2026 Tenable Nova LLC. Apache 2.0. Patent pending.
19
+ */
20
+ const INTERCEPTED = new Set(["search", "query"]);
21
+ /**
22
+ * Wrap a QdrantClient with an ES6 Proxy for transparent RAG witnessing.
23
+ *
24
+ * Intercepts search() and query() to mint AI-RAG.1 anchors for every
25
+ * vector retrieval operation.
26
+ */
27
+ export function wrapQdrant(client, witness) {
28
+ return new Proxy(client, {
29
+ get(target, prop) {
30
+ if (typeof prop === "symbol")
31
+ return Reflect.get(target, prop);
32
+ const real = Reflect.get(target, prop);
33
+ if (INTERCEPTED.has(prop) && typeof real === "function") {
34
+ return createSearchInterceptor(real, witness, prop, target);
35
+ }
36
+ return real;
37
+ },
38
+ });
39
+ }
40
+ function createSearchInterceptor(realMethod, witness, methodName, target) {
41
+ return function interceptedSearch(...args) {
42
+ // -- Extract parameters --
43
+ const collectionName = extractCollectionName(args, methodName);
44
+ const opts = extractOptions(args, methodName);
45
+ const limit = opts.limit ?? opts.top ?? 10;
46
+ const scoreThreshold = opts.score_threshold;
47
+ const start = performance.now();
48
+ const result = realMethod.call(target, ...args);
49
+ // Qdrant JS client is async -- result is a Promise
50
+ if (result && typeof result.then === "function") {
51
+ return result.then((response) => {
52
+ const elapsedMs = Math.round(performance.now() - start);
53
+ witnessSearch(witness, response, collectionName, limit, scoreThreshold, elapsedMs, methodName);
54
+ return response;
55
+ });
56
+ }
57
+ // Synchronous fallback (unlikely but safe)
58
+ const elapsedMs = Math.round(performance.now() - start);
59
+ witnessSearch(witness, result, collectionName, limit, scoreThreshold, elapsedMs, methodName);
60
+ return result;
61
+ };
62
+ }
63
+ function witnessSearch(witness, result, collectionName, limit, scoreThreshold, elapsedMs, methodName) {
64
+ const resultCount = countResults(result);
65
+ const chunkIds = extractChunkIds(result);
66
+ const chunks = chunkIds.length > 0 ? chunkIds : Array(resultCount).fill("search-result");
67
+ const modelId = collectionName ? `qdrant-${collectionName}` : "qdrant-unknown";
68
+ witness.witnessRagContext({
69
+ chunks,
70
+ corpusId: collectionName,
71
+ embeddingModel: modelId,
72
+ retrievalLatencyMs: elapsedMs,
73
+ topK: typeof limit === "number" ? limit : undefined,
74
+ similarityThreshold: scoreThreshold,
75
+ });
76
+ }
77
+ function extractCollectionName(args, methodName) {
78
+ // search(collectionName, opts) or query(collectionName, opts)
79
+ if (args.length > 0 && typeof args[0] === "string") {
80
+ return args[0];
81
+ }
82
+ // Object-style: search({ collection_name: "..." })
83
+ if (args.length > 0 && typeof args[0] === "object" && args[0] !== null) {
84
+ const obj = args[0];
85
+ if (typeof obj.collection_name === "string")
86
+ return obj.collection_name;
87
+ if (typeof obj.collectionName === "string")
88
+ return obj.collectionName;
89
+ }
90
+ return "unknown";
91
+ }
92
+ function extractOptions(args, methodName) {
93
+ // search(collectionName, opts) -- opts is second arg
94
+ if (args.length >= 2 && typeof args[0] === "string" && typeof args[1] === "object" && args[1] !== null) {
95
+ return args[1];
96
+ }
97
+ // Object-style: search({ collection_name, limit, ... })
98
+ if (args.length > 0 && typeof args[0] === "object" && args[0] !== null) {
99
+ return args[0];
100
+ }
101
+ return {};
102
+ }
103
+ function countResults(result) {
104
+ // search() returns ScoredPoint[]
105
+ if (Array.isArray(result))
106
+ return result.length;
107
+ // query() returns { points: ScoredPoint[] }
108
+ if (result && typeof result === "object") {
109
+ const r = result;
110
+ if (Array.isArray(r.points))
111
+ return r.points.length;
112
+ }
113
+ return 0;
114
+ }
115
+ function extractChunkIds(result) {
116
+ let points = [];
117
+ if (Array.isArray(result)) {
118
+ points = result;
119
+ }
120
+ else if (result && typeof result === "object") {
121
+ const r = result;
122
+ if (Array.isArray(r.points))
123
+ points = r.points;
124
+ }
125
+ const ids = [];
126
+ for (const point of points) {
127
+ if (point && typeof point === "object") {
128
+ const p = point;
129
+ if (p.id !== undefined && p.id !== null) {
130
+ ids.push(String(p.id));
131
+ }
132
+ }
133
+ }
134
+ return ids;
135
+ }
136
+ //# sourceMappingURL=qdrant.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"qdrant.js","sourceRoot":"","sources":["../../src/adapters/qdrant.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * SWT3 AI Witness SDK -- Client-side chain verification.
3
+ *
4
+ * Walk provenance reference chains using locally available data.
5
+ * No HTTP calls -- the caller provides a lookup map built from their payloads.
6
+ */
7
+ import type { AnchorReference, ChainSummary } from "./types.js";
8
+ /**
9
+ * Build a lookup map from an array of payload-like objects.
10
+ * Each object must have an `anchor_fingerprint` and optional `references` array.
11
+ */
12
+ export declare function buildLookup(payloads: Array<{
13
+ anchor_fingerprint: string;
14
+ references?: AnchorReference[];
15
+ }>): Map<string, AnchorReference[]>;
16
+ /**
17
+ * Walk a provenance chain starting from a fingerprint using BFS.
18
+ * Cycle-safe via visited set. Depth-limited via maxDepth.
19
+ *
20
+ * @param startFingerprint - The anchor to start from.
21
+ * @param lookup - Map from fingerprint to its references (from buildLookup).
22
+ * @param maxDepth - Maximum traversal depth (default 10).
23
+ */
24
+ export declare function walkChain(startFingerprint: string, lookup: Map<string, AnchorReference[]>, maxDepth?: number): ChainSummary;
25
+ /**
26
+ * Verify the integrity of a chain walk result.
27
+ * Returns whether the chain is intact and any issues found.
28
+ */
29
+ export declare function verifyChainIntegrity(chain: ChainSummary): {
30
+ intact: boolean;
31
+ issues: string[];
32
+ };
33
+ //# sourceMappingURL=chain.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chain.d.ts","sourceRoot":"","sources":["../src/chain.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAa,YAAY,EAAE,MAAM,YAAY,CAAC;AAE3E;;;GAGG;AACH,wBAAgB,WAAW,CACzB,QAAQ,EAAE,KAAK,CAAC;IAAE,kBAAkB,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,eAAe,EAAE,CAAA;CAAE,CAAC,GAC9E,GAAG,CAAC,MAAM,EAAE,eAAe,EAAE,CAAC,CAUhC;AAED;;;;;;;GAOG;AACH,wBAAgB,SAAS,CACvB,gBAAgB,EAAE,MAAM,EACxB,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,eAAe,EAAE,CAAC,EACtC,QAAQ,SAAK,GACZ,YAAY,CAkDd;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,YAAY,GAAG;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CAgB/F"}