@things-factory/ai-client-base 10.1.176 → 10.1.177

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.
@@ -2,22 +2,80 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.registerToolCallRecorder = registerToolCallRecorder;
4
4
  exports.clearToolCallRecorders = clearToolCallRecorders;
5
+ exports.digestOf = digestOf;
5
6
  exports.recordToolCall = recordToolCall;
7
+ /*
8
+ * Every tool call of a registry conversation, handed to whoever writes them down (ADR-0061 decision 8).
9
+ *
10
+ * An application that keeps an AI audit (operato-office's AI 감사 기록) needs each call - which tool, about what,
11
+ * how much came back or why it failed - whoever registered the tool: its own tools, a read target's list query, a
12
+ * data entry target's proposal. Wrapping each tool in the application left out the tools other packages declare,
13
+ * so the audit missed the reads that mattered most (2026-10-16). The registry conversation runs every tool at one
14
+ * place and calls the recorders there.
15
+ *
16
+ * A recorder is handed a digest: the tool, its category, the ids its arguments name, the size and hash of what came
17
+ * back, an error code. The arguments and the result themselves - pay, shareholdings - are not copied into an audit
18
+ * by default; a recorder that must keep them names the categories it keeps them for (`raw`).
19
+ *
20
+ * A recorder that fails is said in the log and the call goes on - an audit that cannot be written never stops an
21
+ * answer. A recorder decides for itself which conversations it writes down (`context.mode.kind`).
22
+ */
23
+ const crypto_1 = require("crypto");
24
+ const summarize_1 = require("../assistant/summarize");
6
25
  const recorders = [];
7
- function registerToolCallRecorder(recorder) {
8
- if (!recorders.includes(recorder))
9
- recorders.push(recorder);
26
+ function registerToolCallRecorder(recorder, options = {}) {
27
+ if (recorders.some(one => one.recorder === recorder))
28
+ return;
29
+ recorders.push({ recorder, raw: new Set(options.raw ?? []) });
10
30
  }
11
31
  function clearToolCallRecorders() {
12
32
  recorders.length = 0;
13
33
  }
14
- async function recordToolCall(record, context) {
15
- for (const recorder of recorders) {
34
+ const hash = (value) => (0, crypto_1.createHash)('sha256').update(JSON.stringify(value ?? null)).digest('hex');
35
+ /** The ids an argument object names, by its keys - a value under any other key is not carried. */
36
+ function idsOf(args) {
37
+ if (!args || typeof args !== 'object')
38
+ return [];
39
+ const ids = [];
40
+ for (const [key, value] of Object.entries(args)) {
41
+ if (!/^(id|ids)$|[a-z](Id|Ids)$/.test(key))
42
+ continue;
43
+ for (const one of Array.isArray(value) ? value : [value])
44
+ if (typeof one === 'string' || typeof one === 'number')
45
+ ids.push(String(one));
46
+ }
47
+ return ids;
48
+ }
49
+ /** A run as a recorder sees it - the digest, and the raw text when its category was asked for. */
50
+ function digestOf(run, raw = false) {
51
+ const threw = run.error !== undefined;
52
+ const result = run.result;
53
+ /* The same shape the conversation row keeps (resultShapeOf) - one reading of an answer. */
54
+ const shape = threw ? undefined : (0, summarize_1.resultShapeOf)(result);
55
+ const errorCode = threw ? String(run.error?.code ?? 'tool-threw') : shape.errorCode;
56
+ const resultSize = shape?.size ?? 0;
57
+ const resultCount = shape?.count;
58
+ return {
59
+ tool: run.tool,
60
+ category: run.category,
61
+ targetIds: idsOf(run.args),
62
+ argsHash: hash(run.args),
63
+ resultSize,
64
+ ...(resultCount === undefined ? {} : { resultCount }),
65
+ ...(threw ? {} : { resultHash: hash(result) }),
66
+ ...(errorCode ? { errorCode } : {}),
67
+ ok: !errorCode,
68
+ durationMs: run.durationMs,
69
+ ...(raw ? { raw: { args: run.args, ...(threw ? { error: String(run.error?.message ?? run.error) } : { result }) } } : {})
70
+ };
71
+ }
72
+ async function recordToolCall(run, context) {
73
+ for (const { recorder, raw } of recorders) {
16
74
  try {
17
- await recorder(record, context);
75
+ await recorder(digestOf(run, raw.has(run.category)), context);
18
76
  }
19
77
  catch (e) {
20
- console.warn(`[ai-client-base] a tool call recorder failed for ${record.tool}:`, e?.message ?? e);
78
+ console.warn(`[ai-client-base] a tool call recorder failed for ${run.tool}:`, e?.message ?? e);
21
79
  }
22
80
  }
23
81
  }
@@ -1 +1 @@
1
- {"version":3,"file":"call-recorder.js","sourceRoot":"","sources":["../../../server/service/tool-registry/call-recorder.ts"],"names":[],"mappings":";;AA8BA,4DAEC;AAED,wDAEC;AAED,wCAQC;AAlBD,MAAM,SAAS,GAAuB,EAAE,CAAA;AAExC,SAAgB,wBAAwB,CAAC,QAA0B;IACjE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAAE,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;AAC7D,CAAC;AAED,SAAgB,sBAAsB;IACpC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAA;AACtB,CAAC;AAEM,KAAK,UAAU,cAAc,CAAC,MAAsB,EAAE,OAAwB;IACnF,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,IAAI,CAAC;YACH,MAAM,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;QACjC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,CAAC,IAAI,CAAC,oDAAoD,MAAM,CAAC,IAAI,GAAG,EAAG,CAAW,EAAE,OAAO,IAAI,CAAC,CAAC,CAAA;QAC9G,CAAC;IACH,CAAC;AACH,CAAC","sourcesContent":["/*\n * Every tool call of a registry conversation, handed to whoever writes them down.\n *\n * An application that keeps an AI audit (operato-office's AI 감사 기록) needs each call - which tool, with what, what\n * came back or why it failed - whoever registered the tool: its own tools, a read target's list query, a data entry\n * target's proposal. Wrapping each tool in the application left out the tools other packages declare, so the audit\n * missed the reads that mattered most (2026-10-16). The registry conversation runs every tool at one place and calls\n * the recorders there.\n *\n * A recorder that fails is said in the log and the call goes on - an audit that cannot be written never stops an\n * answer. A recorder decides for itself which conversations it writes down (`context.mode.kind`).\n */\nimport type { ToolCallContext } from './types'\n\nexport interface ToolCallRecord {\n tool: string\n /** The category the tool was offered from. */\n category: string\n args: unknown\n /** What the tool returned - absent when it threw. A refusal it returned (`{ rejected: true }`) is here. */\n result?: unknown\n /** Why it threw. */\n error?: string\n durationMs: number\n}\n\nexport type ToolCallRecorder = (record: ToolCallRecord, context: ToolCallContext) => void | Promise<void>\n\nconst recorders: ToolCallRecorder[] = []\n\nexport function registerToolCallRecorder(recorder: ToolCallRecorder): void {\n if (!recorders.includes(recorder)) recorders.push(recorder)\n}\n\nexport function clearToolCallRecorders(): void {\n recorders.length = 0\n}\n\nexport async function recordToolCall(record: ToolCallRecord, context: ToolCallContext): Promise<void> {\n for (const recorder of recorders) {\n try {\n await recorder(record, context)\n } catch (e) {\n console.warn(`[ai-client-base] a tool call recorder failed for ${record.tool}:`, (e as Error)?.message ?? e)\n }\n }\n}\n"]}
1
+ {"version":3,"file":"call-recorder.js","sourceRoot":"","sources":["../../../server/service/tool-registry/call-recorder.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Every tool call of a registry conversation, handed to whoever writes them down (ADR-0061 decision 8).\n *\n * An application that keeps an AI audit (operato-office's AI 감사 기록) needs each call - which tool, about what,\n * how much came back or why it failed - whoever registered the tool: its own tools, a read target's list query, a\n * data entry target's proposal. Wrapping each tool in the application left out the tools other packages declare,\n * so the audit missed the reads that mattered most (2026-10-16). The registry conversation runs every tool at one\n * place and calls the recorders there.\n *\n * A recorder is handed a digest: the tool, its category, the ids its arguments name, the size and hash of what came\n * back, an error code. The arguments and the result themselves - pay, shareholdings - are not copied into an audit\n * by default; a recorder that must keep them names the categories it keeps them for (`raw`).\n *\n * A recorder that fails is said in the log and the call goes on - an audit that cannot be written never stops an\n * answer. A recorder decides for itself which conversations it writes down (`context.mode.kind`).\n */\nimport { createHash } from 'crypto'\n\nimport { resultShapeOf } from '../assistant/summarize'\nimport type { ToolCallContext } from './types'\n\nexport interface ToolCallRecord {\n tool: string\n /** The category the tool was offered from. */\n category: string\n /** The ids the arguments name - `id`, `…Id`, `ids`, `…Ids` - and nothing else of them. */\n targetIds: string[]\n /** sha256 of the arguments - the same call is the same hash. */\n argsHash: string\n /** Characters of the result as JSON; 0 when the tool threw. */\n resultSize: number\n /** How many rows it carried - `read` of a list read, else the length of its first list; absent when it says none. */\n resultCount?: number\n resultHash?: string\n /** Why it failed: the code a refusal returned (`{ rejected: true, error }`), the thrown error's code, or `tool-threw`. */\n errorCode?: string\n ok: boolean\n durationMs: number\n /** The arguments and the result as they were - only for a category the recorder named in `raw`. */\n raw?: { args: unknown; result?: unknown; error?: string }\n}\n\nexport type ToolCallRecorder = (record: ToolCallRecord, context: ToolCallContext) => void | Promise<void>\n\nexport interface ToolCallRecorderOptions {\n /** Categories whose calls the recorder is handed with their arguments and result as they were. */\n raw?: string[]\n}\n\n/** A call as it ran - the registry door's side, before it is cut down for a recorder. */\nexport interface ToolCallRun {\n tool: string\n category: string\n args: unknown\n result?: unknown\n error?: unknown\n durationMs: number\n}\n\nconst recorders: { recorder: ToolCallRecorder; raw: Set<string> }[] = []\n\nexport function registerToolCallRecorder(recorder: ToolCallRecorder, options: ToolCallRecorderOptions = {}): void {\n if (recorders.some(one => one.recorder === recorder)) return\n recorders.push({ recorder, raw: new Set(options.raw ?? []) })\n}\n\nexport function clearToolCallRecorders(): void {\n recorders.length = 0\n}\n\nconst hash = (value: unknown) => createHash('sha256').update(JSON.stringify(value ?? null)).digest('hex')\n\n/** The ids an argument object names, by its keys - a value under any other key is not carried. */\nfunction idsOf(args: unknown): string[] {\n if (!args || typeof args !== 'object') return []\n const ids: string[] = []\n for (const [key, value] of Object.entries(args as Record<string, unknown>)) {\n if (!/^(id|ids)$|[a-z](Id|Ids)$/.test(key)) continue\n for (const one of Array.isArray(value) ? value : [value]) if (typeof one === 'string' || typeof one === 'number') ids.push(String(one))\n }\n return ids\n}\n\n/** A run as a recorder sees it - the digest, and the raw text when its category was asked for. */\nexport function digestOf(run: ToolCallRun, raw = false): ToolCallRecord {\n const threw = run.error !== undefined\n const result: any = run.result\n /* The same shape the conversation row keeps (resultShapeOf) - one reading of an answer. */\n const shape = threw ? undefined : resultShapeOf(result)\n const errorCode = threw ? String((run.error as any)?.code ?? 'tool-threw') : shape!.errorCode\n const resultSize = shape?.size ?? 0\n const resultCount = shape?.count\n return {\n tool: run.tool,\n category: run.category,\n targetIds: idsOf(run.args),\n argsHash: hash(run.args),\n resultSize,\n ...(resultCount === undefined ? {} : { resultCount }),\n ...(threw ? {} : { resultHash: hash(result) }),\n ...(errorCode ? { errorCode } : {}),\n ok: !errorCode,\n durationMs: run.durationMs,\n ...(raw ? { raw: { args: run.args, ...(threw ? { error: String((run.error as any)?.message ?? run.error) } : { result }) } } : {})\n }\n}\n\nexport async function recordToolCall(run: ToolCallRun, context: ToolCallContext): Promise<void> {\n for (const { recorder, raw } of recorders) {\n try {\n await recorder(digestOf(run, raw.has(run.category)), context)\n } catch (e) {\n console.warn(`[ai-client-base] a tool call recorder failed for ${run.tool}:`, (e as Error)?.message ?? e)\n }\n }\n}\n"]}
@@ -5,7 +5,7 @@
5
5
  */
6
6
  export { registerToolCategory, getToolCategories, getAllToolSpecs, getToolSpecsFor, getCategoryGuidance, findToolSpec, getToolKind, hasTool, getCategorySpecs, clearToolRegistry, getToolRegistryWarnings } from './registry';
7
7
  export { defaultValueTranslate } from './translate';
8
- export { registerToolCallRecorder, clearToolCallRecorders, recordToolCall } from './call-recorder';
9
- export type { ToolCallRecord, ToolCallRecorder } from './call-recorder';
8
+ export { registerToolCallRecorder, clearToolCallRecorders, recordToolCall, digestOf } from './call-recorder';
9
+ export type { ToolCallRecord, ToolCallRecorder, ToolCallRecorderOptions, ToolCallRun } from './call-recorder';
10
10
  export type { ToolCategoryFilter, ToolRegistryWarning } from './registry';
11
11
  export type { ToolSpec, ToolSpecBase, ReadToolSpec, WriteToolSpec, ActionToolSpec, ExternalToolSpec, ToolCategory, ReadToolBuilder, WriteToolBuilder, ActionToolBuilder, ExternalToolBuilder, ReadToolContext, WriteToolContext, ExternalToolContext, ToolCallContext, ToolCallMode, ToolTranslate, ToolAttachment, ToolImageAttachment, ToolTextAttachment } from './types';
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.recordToolCall = exports.clearToolCallRecorders = exports.registerToolCallRecorder = exports.defaultValueTranslate = exports.getToolRegistryWarnings = exports.clearToolRegistry = exports.getCategorySpecs = exports.hasTool = exports.getToolKind = exports.findToolSpec = exports.getCategoryGuidance = exports.getToolSpecsFor = exports.getAllToolSpecs = exports.getToolCategories = exports.registerToolCategory = void 0;
3
+ exports.digestOf = exports.recordToolCall = exports.clearToolCallRecorders = exports.registerToolCallRecorder = exports.defaultValueTranslate = exports.getToolRegistryWarnings = exports.clearToolRegistry = exports.getCategorySpecs = exports.hasTool = exports.getToolKind = exports.findToolSpec = exports.getCategoryGuidance = exports.getToolSpecsFor = exports.getAllToolSpecs = exports.getToolCategories = exports.registerToolCategory = void 0;
4
4
  /**
5
5
  * Tool Registry — board-ai 의 외부 도메인 LLM tool 노출 plugin point.
6
6
  *
@@ -24,4 +24,5 @@ var call_recorder_1 = require("./call-recorder");
24
24
  Object.defineProperty(exports, "registerToolCallRecorder", { enumerable: true, get: function () { return call_recorder_1.registerToolCallRecorder; } });
25
25
  Object.defineProperty(exports, "clearToolCallRecorders", { enumerable: true, get: function () { return call_recorder_1.clearToolCallRecorders; } });
26
26
  Object.defineProperty(exports, "recordToolCall", { enumerable: true, get: function () { return call_recorder_1.recordToolCall; } });
27
+ Object.defineProperty(exports, "digestOf", { enumerable: true, get: function () { return call_recorder_1.digestOf; } });
27
28
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../server/service/tool-registry/index.ts"],"names":[],"mappings":";;;AAAA;;;;GAIG;AACH,uCAYmB;AAXjB,gHAAA,oBAAoB,OAAA;AACpB,6GAAA,iBAAiB,OAAA;AACjB,2GAAA,eAAe,OAAA;AACf,2GAAA,eAAe,OAAA;AACf,+GAAA,mBAAmB,OAAA;AACnB,wGAAA,YAAY,OAAA;AACZ,uGAAA,WAAW,OAAA;AACX,mGAAA,OAAO,OAAA;AACP,4GAAA,gBAAgB,OAAA;AAChB,6GAAA,iBAAiB,OAAA;AACjB,mHAAA,uBAAuB,OAAA;AAGzB,yCAAmD;AAA1C,kHAAA,qBAAqB,OAAA;AAE9B,iDAAkG;AAAzF,yHAAA,wBAAwB,OAAA;AAAE,uHAAA,sBAAsB,OAAA;AAAE,+GAAA,cAAc,OAAA","sourcesContent":["/**\n * Tool Registry — board-ai 의 외부 도메인 LLM tool 노출 plugin point.\n *\n * 자세한 설계는 ./types 와 ./registry 의 헤더 주석 참조.\n */\nexport {\n registerToolCategory,\n getToolCategories,\n getAllToolSpecs,\n getToolSpecsFor,\n getCategoryGuidance,\n findToolSpec,\n getToolKind,\n hasTool,\n getCategorySpecs,\n clearToolRegistry,\n getToolRegistryWarnings\n} from './registry'\n\nexport { defaultValueTranslate } from './translate'\n\nexport { registerToolCallRecorder, clearToolCallRecorders, recordToolCall } from './call-recorder'\nexport type { ToolCallRecord, ToolCallRecorder } from './call-recorder'\n\n/* 대화별 노출 제한 타입은 registry 소유(정의가 거기 있다). */\nexport type { ToolCategoryFilter, ToolRegistryWarning } from './registry'\n\nexport type {\n ToolSpec,\n ToolSpecBase,\n ReadToolSpec,\n WriteToolSpec,\n ActionToolSpec,\n ExternalToolSpec,\n ToolCategory,\n ReadToolBuilder,\n WriteToolBuilder,\n ActionToolBuilder,\n ExternalToolBuilder,\n ReadToolContext,\n WriteToolContext,\n ExternalToolContext,\n ToolCallContext,\n ToolCallMode,\n ToolTranslate,\n ToolAttachment,\n ToolImageAttachment,\n ToolTextAttachment\n} from './types'\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../server/service/tool-registry/index.ts"],"names":[],"mappings":";;;AAAA;;;;GAIG;AACH,uCAYmB;AAXjB,gHAAA,oBAAoB,OAAA;AACpB,6GAAA,iBAAiB,OAAA;AACjB,2GAAA,eAAe,OAAA;AACf,2GAAA,eAAe,OAAA;AACf,+GAAA,mBAAmB,OAAA;AACnB,wGAAA,YAAY,OAAA;AACZ,uGAAA,WAAW,OAAA;AACX,mGAAA,OAAO,OAAA;AACP,4GAAA,gBAAgB,OAAA;AAChB,6GAAA,iBAAiB,OAAA;AACjB,mHAAA,uBAAuB,OAAA;AAGzB,yCAAmD;AAA1C,kHAAA,qBAAqB,OAAA;AAE9B,iDAA4G;AAAnG,yHAAA,wBAAwB,OAAA;AAAE,uHAAA,sBAAsB,OAAA;AAAE,+GAAA,cAAc,OAAA;AAAE,yGAAA,QAAQ,OAAA","sourcesContent":["/**\n * Tool Registry — board-ai 의 외부 도메인 LLM tool 노출 plugin point.\n *\n * 자세한 설계는 ./types 와 ./registry 의 헤더 주석 참조.\n */\nexport {\n registerToolCategory,\n getToolCategories,\n getAllToolSpecs,\n getToolSpecsFor,\n getCategoryGuidance,\n findToolSpec,\n getToolKind,\n hasTool,\n getCategorySpecs,\n clearToolRegistry,\n getToolRegistryWarnings\n} from './registry'\n\nexport { defaultValueTranslate } from './translate'\n\nexport { registerToolCallRecorder, clearToolCallRecorders, recordToolCall, digestOf } from './call-recorder'\nexport type { ToolCallRecord, ToolCallRecorder, ToolCallRecorderOptions, ToolCallRun } from './call-recorder'\n\n/* 대화별 노출 제한 타입은 registry 소유(정의가 거기 있다). */\nexport type { ToolCategoryFilter, ToolRegistryWarning } from './registry'\n\nexport type {\n ToolSpec,\n ToolSpecBase,\n ReadToolSpec,\n WriteToolSpec,\n ActionToolSpec,\n ExternalToolSpec,\n ToolCategory,\n ReadToolBuilder,\n WriteToolBuilder,\n ActionToolBuilder,\n ExternalToolBuilder,\n ReadToolContext,\n WriteToolContext,\n ExternalToolContext,\n ToolCallContext,\n ToolCallMode,\n ToolTranslate,\n ToolAttachment,\n ToolImageAttachment,\n ToolTextAttachment\n} from './types'\n"]}