@modelprofile.com/flexharness 6.0.0 → 7.0.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 (169) hide show
  1. package/dist_ts/00_commitinfo_data.js +1 -1
  2. package/dist_ts_chat/classes.chatsession.d.ts +37 -0
  3. package/dist_ts_chat/classes.chatsession.js +102 -0
  4. package/dist_ts_chat/index.d.ts +2 -0
  5. package/dist_ts_chat/index.js +2 -0
  6. package/dist_ts_chat/interfaces.d.ts +72 -0
  7. package/dist_ts_chat/interfaces.js +2 -0
  8. package/dist_ts_chat/plugins.d.ts +4 -0
  9. package/dist_ts_chat/plugins.js +4 -0
  10. package/dist_ts_chat_cli/components.chatapp.d.ts +10 -0
  11. package/dist_ts_chat_cli/components.chatapp.js +75 -0
  12. package/dist_ts_chat_cli/components.inputarea.d.ts +7 -0
  13. package/dist_ts_chat_cli/components.inputarea.js +18 -0
  14. package/dist_ts_chat_cli/components.message.d.ts +12 -0
  15. package/dist_ts_chat_cli/components.message.js +21 -0
  16. package/dist_ts_chat_cli/components.messagelist.d.ts +9 -0
  17. package/dist_ts_chat_cli/components.messagelist.js +19 -0
  18. package/dist_ts_chat_cli/components.statusbar.d.ts +9 -0
  19. package/dist_ts_chat_cli/components.statusbar.js +15 -0
  20. package/dist_ts_chat_cli/index.d.ts +2 -0
  21. package/dist_ts_chat_cli/index.js +2 -0
  22. package/dist_ts_chat_cli/plugins.d.ts +12 -0
  23. package/dist_ts_chat_cli/plugins.js +14 -0
  24. package/dist_ts_chat_cli/startchat.d.ts +18 -0
  25. package/dist_ts_chat_cli/startchat.js +17 -0
  26. package/dist_ts_chat_web/flexchat-input.d.ts +21 -0
  27. package/dist_ts_chat_web/flexchat-input.js +172 -0
  28. package/dist_ts_chat_web/flexchat-message.d.ts +26 -0
  29. package/dist_ts_chat_web/flexchat-message.js +174 -0
  30. package/dist_ts_chat_web/flexchat-window.d.ts +34 -0
  31. package/dist_ts_chat_web/flexchat-window.js +394 -0
  32. package/dist_ts_chat_web/index.d.ts +3 -0
  33. package/dist_ts_chat_web/index.js +4 -0
  34. package/dist_ts_chat_web/plugins.d.ts +6 -0
  35. package/dist_ts_chat_web/plugins.js +4 -0
  36. package/dist_ts_compaction/index.d.ts +2 -0
  37. package/dist_ts_compaction/index.js +2 -0
  38. package/dist_ts_compaction/plugins.d.ts +4 -0
  39. package/dist_ts_compaction/plugins.js +3 -0
  40. package/dist_ts_compaction/smartagent.compaction.d.ts +14 -0
  41. package/dist_ts_compaction/smartagent.compaction.js +49 -0
  42. package/dist_ts_document/index.d.ts +19 -0
  43. package/dist_ts_document/index.js +55 -0
  44. package/dist_ts_document/plugins.d.ts +3 -0
  45. package/dist_ts_document/plugins.js +4 -0
  46. package/dist_ts_kvm/classes.browserkvm.d.ts +22 -0
  47. package/dist_ts_kvm/classes.browserkvm.js +271 -0
  48. package/dist_ts_kvm/classes.kvmterminal.d.ts +8 -0
  49. package/dist_ts_kvm/classes.kvmterminal.js +88 -0
  50. package/dist_ts_kvm/commandwrappers.d.ts +14 -0
  51. package/dist_ts_kvm/commandwrappers.js +58 -0
  52. package/dist_ts_kvm/index.d.ts +6 -0
  53. package/dist_ts_kvm/index.js +7 -0
  54. package/dist_ts_kvm/interfaces.d.ts +106 -0
  55. package/dist_ts_kvm/interfaces.js +2 -0
  56. package/dist_ts_kvm/ocr.d.ts +14 -0
  57. package/dist_ts_kvm/ocr.js +23 -0
  58. package/dist_ts_kvm/plugins.d.ts +6 -0
  59. package/dist_ts_kvm/plugins.js +10 -0
  60. package/dist_ts_kvm/tools.d.ts +15 -0
  61. package/dist_ts_kvm/tools.js +40 -0
  62. package/dist_ts_mcp/index.d.ts +86 -0
  63. package/dist_ts_mcp/index.js +284 -0
  64. package/dist_ts_mcp/requestcontext.d.ts +11 -0
  65. package/dist_ts_mcp/requestcontext.js +42 -0
  66. package/dist_ts_media/index.d.ts +8 -0
  67. package/dist_ts_media/index.js +21 -0
  68. package/dist_ts_media/plugins.d.ts +2 -0
  69. package/dist_ts_media/plugins.js +3 -0
  70. package/dist_ts_ocr/classes.imageocr.d.ts +19 -0
  71. package/dist_ts_ocr/classes.imageocr.js +27 -0
  72. package/dist_ts_ocr/index.d.ts +2 -0
  73. package/dist_ts_ocr/index.js +3 -0
  74. package/dist_ts_ocr/ocr.mistral.d.ts +75 -0
  75. package/dist_ts_ocr/ocr.mistral.js +77 -0
  76. package/dist_ts_tools/index.d.ts +17 -0
  77. package/dist_ts_tools/index.js +10 -0
  78. package/dist_ts_tools/plugins.d.ts +7 -0
  79. package/dist_ts_tools/plugins.js +6 -0
  80. package/dist_ts_tools/tool.browser.d.ts +11 -0
  81. package/dist_ts_tools/tool.browser.js +128 -0
  82. package/dist_ts_tools/tool.context.d.ts +4 -0
  83. package/dist_ts_tools/tool.context.js +23 -0
  84. package/dist_ts_tools/tool.filesystem.d.ts +11 -0
  85. package/dist_ts_tools/tool.filesystem.js +106 -0
  86. package/dist_ts_tools/tool.http.d.ts +2 -0
  87. package/dist_ts_tools/tool.http.js +65 -0
  88. package/dist_ts_tools/tool.json.d.ts +2 -0
  89. package/dist_ts_tools/tool.json.js +47 -0
  90. package/dist_ts_tools/tool.shell.d.ts +15 -0
  91. package/dist_ts_tools/tool.shell.js +329 -0
  92. package/dist_ts_tools/utils.truncation.d.ts +10 -0
  93. package/dist_ts_tools/utils.truncation.js +26 -0
  94. package/dist_ts_tools_node/index.d.ts +5 -0
  95. package/dist_ts_tools_node/index.js +4 -0
  96. package/dist_ts_tools_node/plugins.d.ts +13 -0
  97. package/dist_ts_tools_node/plugins.js +13 -0
  98. package/dist_ts_tools_node/tool.context.d.ts +31 -0
  99. package/dist_ts_tools_node/tool.context.js +837 -0
  100. package/dist_ts_tools_node/tool.persistence.d.ts +15 -0
  101. package/dist_ts_tools_node/tool.persistence.js +129 -0
  102. package/dist_ts_tools_node/tools.local.d.ts +11 -0
  103. package/dist_ts_tools_node/tools.local.js +15 -0
  104. package/package.json +112 -4
  105. package/readme.md +122 -66
  106. package/ts/00_commitinfo_data.ts +1 -1
  107. package/ts/readme.md +122 -66
  108. package/ts_chat/classes.chatsession.ts +116 -0
  109. package/ts_chat/index.ts +8 -0
  110. package/ts_chat/interfaces.ts +64 -0
  111. package/ts_chat/plugins.ts +7 -0
  112. package/ts_chat/readme.md +49 -0
  113. package/ts_chat_cli/components.chatapp.ts +103 -0
  114. package/ts_chat_cli/components.inputarea.ts +29 -0
  115. package/ts_chat_cli/components.message.ts +48 -0
  116. package/ts_chat_cli/components.messagelist.ts +45 -0
  117. package/ts_chat_cli/components.statusbar.ts +31 -0
  118. package/ts_chat_cli/index.ts +2 -0
  119. package/ts_chat_cli/plugins.ts +21 -0
  120. package/ts_chat_cli/readme.md +40 -0
  121. package/ts_chat_cli/startchat.ts +34 -0
  122. package/ts_chat_web/flexchat-input.ts +184 -0
  123. package/ts_chat_web/flexchat-message.ts +185 -0
  124. package/ts_chat_web/flexchat-window.ts +416 -0
  125. package/ts_chat_web/index.ts +3 -0
  126. package/ts_chat_web/plugins.ts +9 -0
  127. package/ts_chat_web/readme.md +46 -0
  128. package/ts_compaction/index.ts +2 -0
  129. package/ts_compaction/plugins.ts +6 -0
  130. package/ts_compaction/readme.md +37 -0
  131. package/ts_compaction/smartagent.compaction.ts +59 -0
  132. package/ts_document/index.ts +82 -0
  133. package/ts_document/plugins.ts +3 -0
  134. package/ts_document/readme.md +49 -0
  135. package/ts_kvm/classes.browserkvm.ts +335 -0
  136. package/ts_kvm/classes.kvmterminal.ts +103 -0
  137. package/ts_kvm/commandwrappers.ts +83 -0
  138. package/ts_kvm/index.ts +6 -0
  139. package/ts_kvm/interfaces.ts +152 -0
  140. package/ts_kvm/ocr.ts +41 -0
  141. package/ts_kvm/plugins.ts +13 -0
  142. package/ts_kvm/readme.md +482 -0
  143. package/ts_kvm/tools.ts +58 -0
  144. package/ts_mcp/index.ts +470 -0
  145. package/ts_mcp/readme.md +37 -0
  146. package/ts_mcp/requestcontext.ts +66 -0
  147. package/ts_media/index.ts +29 -0
  148. package/ts_media/plugins.ts +2 -0
  149. package/ts_media/readme.md +37 -0
  150. package/ts_ocr/classes.imageocr.ts +53 -0
  151. package/ts_ocr/index.ts +2 -0
  152. package/ts_ocr/ocr.mistral.ts +192 -0
  153. package/ts_ocr/readme.md +48 -0
  154. package/ts_tools/index.ts +49 -0
  155. package/ts_tools/plugins.ts +7 -0
  156. package/ts_tools/readme.md +37 -0
  157. package/ts_tools/tool.browser.ts +159 -0
  158. package/ts_tools/tool.context.ts +23 -0
  159. package/ts_tools/tool.filesystem.ts +144 -0
  160. package/ts_tools/tool.http.ts +78 -0
  161. package/ts_tools/tool.json.ts +53 -0
  162. package/ts_tools/tool.shell.ts +418 -0
  163. package/ts_tools/utils.truncation.ts +39 -0
  164. package/ts_tools_node/index.ts +5 -0
  165. package/ts_tools_node/plugins.ts +16 -0
  166. package/ts_tools_node/readme.md +37 -0
  167. package/ts_tools_node/tool.context.ts +991 -0
  168. package/ts_tools_node/tool.persistence.ts +146 -0
  169. package/ts_tools_node/tools.local.ts +26 -0
@@ -0,0 +1,146 @@
1
+ import * as plugins from './plugins.js';
2
+ import type { IToolJobSnapshot, IToolJobStore, IToolJobState } from '@modelprofile.com/flexharness-agent';
3
+
4
+ export interface IFileToolJobStoreOptions {
5
+ filePath: string;
6
+ lockTimeoutMs?: number;
7
+ }
8
+
9
+ const decodeSnapshot = (value: unknown): IToolJobSnapshot => {
10
+ const snapshot = value as Partial<IToolJobSnapshot>;
11
+ if (
12
+ !snapshot
13
+ || snapshot.schemaVersion !== plugins.JOB_SNAPSHOT_SCHEMA_VERSION
14
+ || !Number.isSafeInteger(snapshot.revision)
15
+ || (snapshot.revision ?? -1) < 1
16
+ || !Array.isArray(snapshot.jobs)
17
+ ) {
18
+ throw new Error('Invalid tool job snapshot.');
19
+ }
20
+ return snapshot as IToolJobSnapshot;
21
+ };
22
+
23
+ const sleep = async (milliseconds: number): Promise<void> => {
24
+ await new Promise((resolve) => setTimeout(resolve, milliseconds));
25
+ };
26
+
27
+ export class FileToolJobStore implements IToolJobStore {
28
+ private readonly filePath: string;
29
+ private readonly lockTimeoutMs: number;
30
+
31
+ constructor(options: IFileToolJobStoreOptions) {
32
+ if (!options.filePath.trim()) throw new Error('FileToolJobStore filePath must not be empty.');
33
+ this.filePath = plugins.path.resolve(options.filePath);
34
+ this.lockTimeoutMs = options.lockTimeoutMs ?? 10_000;
35
+ if (!Number.isSafeInteger(this.lockTimeoutMs) || this.lockTimeoutMs <= 0) {
36
+ throw new Error('lockTimeoutMs must be a positive integer.');
37
+ }
38
+ }
39
+
40
+ private async readSnapshot(): Promise<IToolJobSnapshot | undefined> {
41
+ try {
42
+ return decodeSnapshot(plugins.v8.deserialize(await plugins.fs.promises.readFile(this.filePath)));
43
+ } catch (error) {
44
+ if ((error as NodeJS.ErrnoException).code === 'ENOENT') return undefined;
45
+ throw error;
46
+ }
47
+ }
48
+
49
+ private async withLock<TValue>(
50
+ operation: () => Promise<TValue>,
51
+ abortSignal?: AbortSignal,
52
+ ): Promise<TValue> {
53
+ const lockPath = `${this.filePath}.lock`;
54
+ const ownerPath = plugins.path.join(lockPath, 'owner');
55
+ const ownerToken = plugins.crypto.randomUUID();
56
+ const ownerRecord = JSON.stringify({ token: ownerToken });
57
+ await plugins.fs.promises.mkdir(plugins.path.dirname(lockPath), { recursive: true });
58
+ const startedAt = Date.now();
59
+ while (true) {
60
+ abortSignal?.throwIfAborted();
61
+ try {
62
+ await plugins.fs.promises.mkdir(lockPath);
63
+ try {
64
+ await plugins.fs.promises.writeFile(ownerPath, ownerRecord, 'utf8');
65
+ } catch (error) {
66
+ await plugins.fs.promises.rm(lockPath, { recursive: true, force: true });
67
+ throw error;
68
+ }
69
+ break;
70
+ } catch (error) {
71
+ if ((error as NodeJS.ErrnoException).code !== 'EEXIST') throw error;
72
+ if (Date.now() - startedAt >= this.lockTimeoutMs) {
73
+ throw new Error(`Timed out waiting for the tool job store lock at "${lockPath}".`);
74
+ }
75
+ await sleep(20);
76
+ }
77
+ }
78
+ try {
79
+ return await operation();
80
+ } finally {
81
+ let stillOwner = false;
82
+ try {
83
+ const owner = JSON.parse(
84
+ await plugins.fs.promises.readFile(ownerPath, 'utf8'),
85
+ ) as { token?: unknown };
86
+ stillOwner = owner.token === ownerToken;
87
+ } catch {}
88
+ if (stillOwner) {
89
+ await plugins.fs.promises.rm(lockPath, { recursive: true, force: true });
90
+ }
91
+ }
92
+ }
93
+
94
+ private async writeAtomic(
95
+ snapshot: IToolJobSnapshot,
96
+ abortSignal?: AbortSignal,
97
+ ): Promise<void> {
98
+ abortSignal?.throwIfAborted();
99
+ const directoryPath = plugins.path.dirname(this.filePath);
100
+ await plugins.fs.promises.mkdir(directoryPath, { recursive: true });
101
+ const temporaryPath = `${this.filePath}.${process.pid}.${plugins.crypto.randomUUID()}.tmp`;
102
+ let handle: Awaited<ReturnType<typeof plugins.fs.promises.open>> | undefined;
103
+ try {
104
+ handle = await plugins.fs.promises.open(temporaryPath, 'wx');
105
+ await handle.writeFile(plugins.v8.serialize(snapshot));
106
+ await handle.sync();
107
+ await handle.close();
108
+ handle = undefined;
109
+ abortSignal?.throwIfAborted();
110
+ await plugins.fs.promises.rename(temporaryPath, this.filePath);
111
+ const directoryHandle = await plugins.fs.promises.open(directoryPath, 'r');
112
+ try {
113
+ await directoryHandle.sync();
114
+ } finally {
115
+ await directoryHandle.close();
116
+ }
117
+ } finally {
118
+ if (handle) await handle.close().catch(() => undefined);
119
+ await plugins.fs.promises.rm(temporaryPath, { force: true });
120
+ }
121
+ }
122
+
123
+ public async load(abortSignal?: AbortSignal): Promise<IToolJobSnapshot | undefined> {
124
+ abortSignal?.throwIfAborted();
125
+ const snapshot = await this.readSnapshot();
126
+ abortSignal?.throwIfAborted();
127
+ return snapshot;
128
+ }
129
+
130
+ public async save(
131
+ jobs: readonly IToolJobState[],
132
+ expectedRevision: number,
133
+ abortSignal?: AbortSignal,
134
+ ): Promise<number> {
135
+ return this.withLock(async () => {
136
+ abortSignal?.throwIfAborted();
137
+ const actualRevision = (await this.readSnapshot())?.revision ?? 0;
138
+ if (actualRevision !== expectedRevision) {
139
+ throw new plugins.ToolJobStoreConflictError(expectedRevision, actualRevision);
140
+ }
141
+ const revision = expectedRevision + 1;
142
+ await this.writeAtomic(plugins.createToolJobSnapshot(jobs, revision), abortSignal);
143
+ return revision;
144
+ }, abortSignal);
145
+ }
146
+ }
@@ -0,0 +1,26 @@
1
+ import * as plugins from './plugins.js';
2
+ import { createLocalToolExecutionContext } from './tool.context.js';
3
+
4
+ export interface IFilesystemToolOptions extends plugins.ICreateFilesystemToolsOptions {
5
+ rootDir?: string;
6
+ context?: plugins.IToolExecutionContext;
7
+ }
8
+
9
+ export interface IShellToolOptions extends plugins.ICreateShellToolsOptions {
10
+ cwd?: string;
11
+ context?: plugins.IToolExecutionContext;
12
+ }
13
+
14
+ export function filesystemTool(options?: IFilesystemToolOptions): plugins.ToolSet {
15
+ const context = options?.context ?? createLocalToolExecutionContext({ rootDir: options?.rootDir });
16
+ return plugins.createFilesystemTools(context, options);
17
+ }
18
+
19
+ export function shellTool(options?: IShellToolOptions): plugins.ToolSet {
20
+ const context = options?.context ?? createLocalToolExecutionContext({ cwd: options?.cwd });
21
+ return plugins.createShellTools(context, {
22
+ ...options,
23
+ // An internally created context has no caller-visible background-job owner.
24
+ includeBackground: options?.context ? true : false,
25
+ });
26
+ }