ptbk 0.119.0-21 → 0.119.0-26

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 (223) hide show
  1. package/README.md +16 -9
  2. package/dist/browser/browser.d.ts +50 -36
  3. package/dist/browser/browser.js +162 -118
  4. package/dist/browser/browser.js.map +1 -1
  5. package/dist/browser/fleet.d.ts +59 -0
  6. package/dist/browser/fleet.js +148 -0
  7. package/dist/browser/fleet.js.map +1 -0
  8. package/dist/browser/recording.js +2 -2
  9. package/dist/browser/recording.js.map +1 -1
  10. package/dist/chats/conversation.d.ts +1 -1
  11. package/dist/chats/conversation.js +8 -6
  12. package/dist/chats/conversation.js.map +1 -1
  13. package/dist/chats/local.js +5 -5
  14. package/dist/chats/local.js.map +1 -1
  15. package/dist/cli/commands/add.js +1 -1
  16. package/dist/cli/commands/add.js.map +1 -1
  17. package/dist/cli/commands/boilerplates.js +1 -1
  18. package/dist/cli/commands/boilerplates.js.map +1 -1
  19. package/dist/cli/commands/find.js +1 -1
  20. package/dist/cli/commands/find.js.map +1 -1
  21. package/dist/cli/commands/fix.js +9 -4
  22. package/dist/cli/commands/fix.js.map +1 -1
  23. package/dist/cli/commands/init.d.ts +5 -0
  24. package/dist/cli/commands/init.js +279 -118
  25. package/dist/cli/commands/init.js.map +1 -1
  26. package/dist/cli/commands/migrate.js +1 -1
  27. package/dist/cli/commands/migrate.js.map +1 -1
  28. package/dist/cli/commands/ping.js +20 -12
  29. package/dist/cli/commands/ping.js.map +1 -1
  30. package/dist/cli/commands/plan.js +20 -12
  31. package/dist/cli/commands/plan.js.map +1 -1
  32. package/dist/cli/commands/recover.js +1 -1
  33. package/dist/cli/commands/recover.js.map +1 -1
  34. package/dist/cli/commands/restart.js +6 -5
  35. package/dist/cli/commands/restart.js.map +1 -1
  36. package/dist/cli/commands/run.js +26 -15
  37. package/dist/cli/commands/run.js.map +1 -1
  38. package/dist/cli/commands/start.js +11 -7
  39. package/dist/cli/commands/start.js.map +1 -1
  40. package/dist/cli/commands/tool.d.ts +19 -0
  41. package/dist/cli/commands/tool.js +320 -0
  42. package/dist/cli/commands/tool.js.map +1 -0
  43. package/dist/cli/commands/verify.js +1 -1
  44. package/dist/cli/commands/verify.js.map +1 -1
  45. package/dist/cli/common.d.ts +7 -1
  46. package/dist/cli/common.js +37 -20
  47. package/dist/cli/common.js.map +1 -1
  48. package/dist/cli/compatibility.d.ts +8 -0
  49. package/dist/cli/compatibility.js +32 -0
  50. package/dist/cli/compatibility.js.map +1 -0
  51. package/dist/cli/parser.js +7 -3
  52. package/dist/cli/parser.js.map +1 -1
  53. package/dist/cli/registry.js +182 -7
  54. package/dist/cli/registry.js.map +1 -1
  55. package/dist/cli/service-view.js +1 -1
  56. package/dist/cli/service-view.js.map +1 -1
  57. package/dist/cli/sources.js +2 -0
  58. package/dist/cli/sources.js.map +1 -1
  59. package/dist/cli/spec.js +8 -6
  60. package/dist/cli/spec.js.map +1 -1
  61. package/dist/common/naming.d.ts +53 -0
  62. package/dist/common/naming.js +90 -0
  63. package/dist/common/naming.js.map +1 -0
  64. package/dist/engine/agenda.d.ts +70 -9
  65. package/dist/engine/agenda.js +294 -61
  66. package/dist/engine/agenda.js.map +1 -1
  67. package/dist/engine/executor.d.ts +5 -0
  68. package/dist/engine/executor.js +24 -11
  69. package/dist/engine/executor.js.map +1 -1
  70. package/dist/engine/harnesses.d.ts +82 -18
  71. package/dist/engine/harnesses.js +191 -39
  72. package/dist/engine/harnesses.js.map +1 -1
  73. package/dist/engine/preview.js +2 -2
  74. package/dist/engine/preview.js.map +1 -1
  75. package/dist/engine/routing.d.ts +10 -0
  76. package/dist/engine/routing.js +67 -28
  77. package/dist/engine/routing.js.map +1 -1
  78. package/dist/engine/snapshot.d.ts +107 -7
  79. package/dist/engine/state.d.ts +4 -2
  80. package/dist/engine/state.js.map +1 -1
  81. package/dist/engine/sync.d.ts +96 -0
  82. package/dist/engine/sync.js +199 -0
  83. package/dist/engine/sync.js.map +1 -0
  84. package/dist/engine/team.d.ts +1 -0
  85. package/dist/engine/team.js +12 -8
  86. package/dist/engine/team.js.map +1 -1
  87. package/dist/expert/_main.md +96 -67
  88. package/dist/expert/agents/_index.md +10 -7
  89. package/dist/expert/agents/core-agents.md +4 -2
  90. package/dist/expert/agents/fixer.md +15 -12
  91. package/dist/expert/cli/acceptance.md +96 -78
  92. package/dist/expert/cli/api.md +26 -14
  93. package/dist/expert/cli/autonomous-operation.md +17 -19
  94. package/dist/expert/cli/browser.md +24 -24
  95. package/dist/expert/cli/checks.md +18 -10
  96. package/dist/expert/cli/cli.md +48 -41
  97. package/dist/expert/cli/configuration-migrations.md +43 -0
  98. package/dist/expert/cli/configuration.md +24 -14
  99. package/dist/expert/cli/controls.md +23 -11
  100. package/dist/expert/cli/dashboard-details.md +28 -10
  101. package/dist/expert/cli/dashboard-layout.md +15 -15
  102. package/dist/expert/cli/dashboard.md +8 -10
  103. package/dist/expert/cli/environment.md +33 -0
  104. package/dist/expert/cli/execution.md +10 -8
  105. package/dist/expert/cli/git-persistence.md +27 -21
  106. package/dist/expert/cli/git-preflight.md +8 -4
  107. package/dist/expert/cli/git-synchronization.md +32 -6
  108. package/dist/expert/cli/harness-plugins.md +12 -12
  109. package/dist/expert/cli/harnesses.md +22 -16
  110. package/dist/expert/cli/initialization-ui.md +14 -14
  111. package/dist/expert/cli/initialization.md +31 -21
  112. package/dist/expert/cli/installation.md +6 -0
  113. package/dist/expert/cli/isolation.md +5 -3
  114. package/dist/expert/cli/releasing.md +17 -3
  115. package/dist/expert/cli/retries.md +10 -8
  116. package/dist/expert/cli/run.md +7 -5
  117. package/dist/expert/cli/start.md +21 -15
  118. package/dist/expert/cli/status-view.md +15 -17
  119. package/dist/expert/cli/synchronization-setup.md +24 -0
  120. package/dist/expert/cli/terminal.md +14 -16
  121. package/dist/expert/cli/tool-management.md +60 -0
  122. package/dist/expert/cli/tool-runtime.md +35 -0
  123. package/dist/expert/cli/tools-migration.md +50 -0
  124. package/dist/expert/cli/tools.md +73 -0
  125. package/dist/expert/cli/trace-configuration.md +9 -11
  126. package/dist/expert/cli/updates.md +7 -7
  127. package/dist/expert/cli/windows-installer.md +67 -0
  128. package/dist/expert/cli/workspace.md +2 -0
  129. package/dist/expert/coding-standards/_index.md +11 -0
  130. package/dist/expert/coding-standards/naming.md +30 -0
  131. package/dist/expert/coding-standards/shared-logic.md +27 -0
  132. package/dist/expert/concepts/automatic-repair.md +33 -0
  133. package/dist/expert/concepts/engine-and-project.md +7 -5
  134. package/dist/expert/dictionary.md +18 -18
  135. package/dist/harness/plugins/claude-code/index.js +4 -2
  136. package/dist/harness/plugins/claude-code/index.js.map +1 -1
  137. package/dist/harness/plugins/cline/index.js +1 -0
  138. package/dist/harness/plugins/cline/index.js.map +1 -1
  139. package/dist/harness/plugins/gemini/index.js +2 -0
  140. package/dist/harness/plugins/gemini/index.js.map +1 -1
  141. package/dist/harness/plugins/github-copilot/index.js +1 -0
  142. package/dist/harness/plugins/github-copilot/index.js.map +1 -1
  143. package/dist/harness/plugins/openai-codex/index.js +13 -9
  144. package/dist/harness/plugins/openai-codex/index.js.map +1 -1
  145. package/dist/harness/plugins/opencode/index.js +1 -0
  146. package/dist/harness/plugins/opencode/index.js.map +1 -1
  147. package/dist/harness/plugins/qwen-code/index.js +1 -0
  148. package/dist/harness/plugins/qwen-code/index.js.map +1 -1
  149. package/dist/harness/types.d.ts +16 -5
  150. package/dist/project/config.d.ts +135 -48
  151. package/dist/project/config.js +331 -119
  152. package/dist/project/config.js.map +1 -1
  153. package/dist/project/configuration.d.ts +43 -0
  154. package/dist/project/configuration.js +165 -0
  155. package/dist/project/configuration.js.map +1 -0
  156. package/dist/project/defaults.d.ts +4 -2
  157. package/dist/project/defaults.js +10 -5
  158. package/dist/project/defaults.js.map +1 -1
  159. package/dist/project/git.d.ts +28 -0
  160. package/dist/project/git.js +81 -0
  161. package/dist/project/git.js.map +1 -1
  162. package/dist/project/migrations.d.ts +96 -0
  163. package/dist/project/migrations.js +301 -0
  164. package/dist/project/migrations.js.map +1 -0
  165. package/dist/project/publication.d.ts +57 -0
  166. package/dist/project/publication.js +117 -0
  167. package/dist/project/publication.js.map +1 -0
  168. package/dist/project/readiness.d.ts +14 -5
  169. package/dist/project/readiness.js +23 -22
  170. package/dist/project/readiness.js.map +1 -1
  171. package/dist/project/setup.js +2 -0
  172. package/dist/project/setup.js.map +1 -1
  173. package/dist/service/actions.d.ts +12 -4
  174. package/dist/service/actions.js +32 -2
  175. package/dist/service/actions.js.map +1 -1
  176. package/dist/service/control.d.ts +1 -1
  177. package/dist/service/control.js +1 -1
  178. package/dist/service/host.d.ts +5 -2
  179. package/dist/service/host.js +26 -16
  180. package/dist/service/host.js.map +1 -1
  181. package/dist/service/http.js +7 -2
  182. package/dist/service/http.js.map +1 -1
  183. package/dist/service/launcher.d.ts +2 -1
  184. package/dist/service/launcher.js +1 -0
  185. package/dist/service/launcher.js.map +1 -1
  186. package/dist/service/records.d.ts +3 -0
  187. package/dist/service/records.js +1 -1
  188. package/dist/service/records.js.map +1 -1
  189. package/dist/service/spa/app.css +39 -0
  190. package/dist/service/spa/app.js +242 -39
  191. package/dist/service/worker.js +1 -0
  192. package/dist/service/worker.js.map +1 -1
  193. package/dist/tools/environment.d.ts +122 -0
  194. package/dist/tools/environment.js +199 -0
  195. package/dist/tools/environment.js.map +1 -0
  196. package/dist/tools/model.d.ts +180 -0
  197. package/dist/tools/model.js +111 -0
  198. package/dist/tools/model.js.map +1 -0
  199. package/dist/tools/normalize.d.ts +51 -0
  200. package/dist/tools/normalize.js +321 -0
  201. package/dist/tools/normalize.js.map +1 -0
  202. package/dist/tools/operations.d.ts +198 -0
  203. package/dist/tools/operations.js +378 -0
  204. package/dist/tools/operations.js.map +1 -0
  205. package/dist/tools/readiness.d.ts +72 -0
  206. package/dist/tools/readiness.js +160 -0
  207. package/dist/tools/readiness.js.map +1 -0
  208. package/dist/ui/dashboard.d.ts +3 -0
  209. package/dist/ui/dashboard.js +173 -2
  210. package/dist/ui/dashboard.js.map +1 -1
  211. package/dist/ui/details.d.ts +35 -1
  212. package/dist/ui/details.js +103 -2
  213. package/dist/ui/details.js.map +1 -1
  214. package/dist/ui/secret.d.ts +8 -0
  215. package/dist/ui/secret.js +41 -0
  216. package/dist/ui/secret.js.map +1 -0
  217. package/dist/ui/status-view.d.ts +1 -0
  218. package/dist/ui/status-view.js +33 -8
  219. package/dist/ui/status-view.js.map +1 -1
  220. package/dist/ui/tool-forms.d.ts +24 -0
  221. package/dist/ui/tool-forms.js +133 -0
  222. package/dist/ui/tool-forms.js.map +1 -0
  223. package/package.json +1 -1
@@ -0,0 +1,378 @@
1
+ import { join } from 'node:path';
2
+ import { PtbkError, errorMessage } from '../common/errors.js';
3
+ import { readTextIfExists, writeFileAtomic } from '../common/fs.js';
4
+ import { ENVIRONMENT_NAME, KEBAB_IDENTIFIER, kebabIdentifier, matchEnum } from '../common/naming.js';
5
+ import { canonicalizeConfig, configText, parseConfigText } from '../project/config.js';
6
+ import { maintainProjectConfiguration } from '../project/configuration.js';
7
+ import { commitFileContents, git, ignoredPaths, inspectGit, readAtHead } from '../project/git.js';
8
+ import { dotEnvPath, editDotEnv, environmentReference, isEngineManagedAssignment, parseEnvironmentReference, readDotEnv } from './environment.js';
9
+ import { AUTHENTICATION_MODES, BROWSER_VARIANTS, HARNESS_VARIANTS, PROFILE_SOURCES, THINKING_LEVELS, TOOL_TYPES, toolTypeLabel, } from './model.js';
10
+ import { parseTools, serializeTool } from './normalize.js';
11
+ /**
12
+ * A usage error of tool management.
13
+ */
14
+ function invalid(message, next) {
15
+ return new PtbkError(message, { kind: 'usage', effect: 'Nothing was changed.', next: next ? [next] : undefined });
16
+ }
17
+ /**
18
+ * Canonical record from a tolerant draft, validated by the shared typed contract.
19
+ *
20
+ * @private shared tool management
21
+ */
22
+ export function recordFromDraft(draft) {
23
+ const type = matchEnum(draft.type, TOOL_TYPES);
24
+ if (!type)
25
+ throw invalid(`Unknown tool type "${draft.type}".`, `Use one of ${TOOL_TYPES.join(', ')}.`);
26
+ const variant = matchEnum(draft.variant, type === 'BROWSER' ? BROWSER_VARIANTS : HARNESS_VARIANTS);
27
+ if (!variant)
28
+ throw invalid(`Unknown ${toolTypeLabel(type)} variant "${draft.variant}".`, `Use one of ${(type === 'BROWSER' ? BROWSER_VARIANTS : HARNESS_VARIANTS).join(', ')}.`);
29
+ const name = KEBAB_IDENTIFIER.test(draft.name) ? draft.name : kebabIdentifier(draft.name);
30
+ if (!name)
31
+ throw invalid(`"${draft.name}" cannot be a tool name.`, 'Use a kebab-case name such as work-browser or codex-company.');
32
+ const raw = { type, variant, name, ...(draft.description !== undefined ? { description: draft.description } : {}), isEnabled: draft.isEnabled ?? true };
33
+ if (type === 'BROWSER') {
34
+ for (const field of ['authentication', 'apiKeyEnv', 'accountProfile', 'model', 'thinkingLevel', 'models'])
35
+ if (draft[field] !== undefined)
36
+ throw invalid(`--${field.replace(/[A-Z]/g, (letter) => `-${letter.toLowerCase()}`)} does not apply to a BROWSER tool.`);
37
+ const source = draft.profileSource === undefined ? 'MANAGED_GLOBAL' : matchEnum(draft.profileSource, PROFILE_SOURCES);
38
+ if (!source)
39
+ throw invalid(`Unknown profile source "${draft.profileSource}".`, `Use one of ${PROFILE_SOURCES.join(', ')}.`);
40
+ raw.profile = { source, ...(draft.profilePath !== undefined ? { path: draft.profilePath } : {}) };
41
+ raw.isHeadless = draft.isHeadless ?? true;
42
+ if (draft.executable !== undefined)
43
+ raw.executable = draft.executable;
44
+ }
45
+ else {
46
+ for (const field of ['profileSource', 'profilePath', 'isHeadless', 'executable'])
47
+ if (draft[field] !== undefined)
48
+ throw invalid(`--${field.replace(/[A-Z]/g, (letter) => `-${letter.toLowerCase()}`)} does not apply to a HARNESS tool.`);
49
+ const authentication = draft.authentication === undefined ? 'NATIVE' : matchEnum(draft.authentication, AUTHENTICATION_MODES);
50
+ if (!authentication)
51
+ throw invalid(`Unknown authentication "${draft.authentication}".`, `Use one of ${AUTHENTICATION_MODES.join(', ')}.`);
52
+ raw.authentication = authentication;
53
+ if (draft.apiKeyEnv !== undefined) {
54
+ if (!ENVIRONMENT_NAME.test(draft.apiKeyEnv))
55
+ throw invalid(`"${draft.apiKeyEnv}" is not an environment-variable name.`, 'Pass the variable name (e.g. COMPANY_OPENAI_API_KEY), never the key itself.');
56
+ raw.apiKey = environmentReference(draft.apiKeyEnv);
57
+ }
58
+ if (draft.accountProfile !== undefined)
59
+ raw.accountProfile = draft.accountProfile;
60
+ if (draft.model !== undefined)
61
+ raw.model = draft.model;
62
+ if (draft.thinkingLevel !== undefined) {
63
+ if (!matchEnum(draft.thinkingLevel, THINKING_LEVELS))
64
+ throw invalid(`Unknown thinking level "${draft.thinkingLevel}".`, 'Use LOW, MEDIUM, HIGH, XHIGH or MAX.');
65
+ raw.thinkingLevel = draft.thinkingLevel;
66
+ }
67
+ if (draft.models !== undefined)
68
+ raw.models = [...draft.models];
69
+ }
70
+ const parsed = parseTools([raw]);
71
+ const errors = parsed.problems.filter((problem) => problem.severity === 'error');
72
+ if (errors.length || !parsed.tools[0])
73
+ throw invalid(`The ${toolTypeLabel(type)} tool "${name}" is invalid: ${errors.map((problem) => `${problem.location.replace(/^ptbk\.json › tools\[0\]\.?/, '') || 'record'} ${problem.message}`).join('; ')}.`);
74
+ return parsed.tools[0];
75
+ }
76
+ /**
77
+ * Applies field changes to a typed record (a variant change keeps the type; incompatible fields are refused).
78
+ */
79
+ function modifiedRecord(record, changes, rename) {
80
+ const draft = { type: record.type, variant: changes.variant ?? record.variant, name: rename ?? record.name, isEnabled: record.isEnabled };
81
+ const optional = (key, change, current) => {
82
+ const value = change === undefined ? current : change === null ? undefined : change;
83
+ if (value !== undefined)
84
+ draft[key] = value;
85
+ };
86
+ optional('description', changes.description, record.description);
87
+ if (record.type === 'BROWSER') {
88
+ for (const field of ['authentication', 'apiKeyEnv', 'accountProfile', 'model', 'thinkingLevel', 'models'])
89
+ if (changes[field] !== undefined)
90
+ throw invalid(`--${field.replace(/[A-Z]/g, (letter) => `-${letter.toLowerCase()}`)} does not apply to a BROWSER tool.`);
91
+ const source = changes.profileSource ?? record.profile.source;
92
+ draft.profileSource = source;
93
+ // Switching the source drops a path that belonged to the previous source, unless one is supplied.
94
+ const keepPath = changes.profileSource === undefined || changes.profileSource === record.profile.source;
95
+ optional('profilePath', changes.profilePath, keepPath ? record.profile.path : undefined);
96
+ draft.isHeadless = changes.isHeadless ?? record.isHeadless;
97
+ optional('executable', changes.executable, record.executable);
98
+ }
99
+ else {
100
+ for (const field of ['profileSource', 'profilePath', 'isHeadless', 'executable'])
101
+ if (changes[field] !== undefined)
102
+ throw invalid(`--${field.replace(/[A-Z]/g, (letter) => `-${letter.toLowerCase()}`)} does not apply to a HARNESS tool.`);
103
+ draft.authentication = changes.authentication ?? record.authentication;
104
+ optional('apiKeyEnv', changes.apiKeyEnv, parseEnvironmentReference(record.apiKey));
105
+ optional('accountProfile', changes.accountProfile, record.accountProfile);
106
+ optional('model', changes.model, record.model);
107
+ optional('thinkingLevel', changes.thinkingLevel, record.thinkingLevel);
108
+ optional('models', changes.models, record.models);
109
+ }
110
+ return recordFromDraft(draft);
111
+ }
112
+ /**
113
+ * Plans one operation on a raw tools array (pure): the new canonical array and what changes. Unknown extension
114
+ * fields of untouched and modified records are preserved.
115
+ *
116
+ * @private shared tool management
117
+ */
118
+ export function planToolOperation(rawTools, operation) {
119
+ const parsed = parseTools(rawTools);
120
+ const tools = [...rawTools];
121
+ const indexOf = (name) => tools.findIndex((entry) => entry !== null && typeof entry === 'object' && entry.name === name);
122
+ const recordOf = (name) => {
123
+ const record = parsed.tools.find((tool) => tool.name === name);
124
+ if (!record) {
125
+ const known = parsed.tools.map((tool) => tool.name);
126
+ throw new PtbkError(indexOf(name) >= 0 ? `The tool "${name}" is invalid in ptbk.json; repair it first.` : `No tool is named "${name}".`, { kind: 'not-found', effect: 'Nothing was changed.', next: [known.length ? `Configured tools: ${known.join(', ')} (\`ptbk tool list\`).` : 'No tools are configured; add one with `ptbk tool add`.'] });
127
+ }
128
+ return record;
129
+ };
130
+ const position = (name, before, after) => {
131
+ if (before && after)
132
+ throw invalid('Give either --before or --after, not both.');
133
+ const anchor = before ?? after;
134
+ if (!anchor)
135
+ return tools.length;
136
+ if (anchor === name)
137
+ throw invalid('A tool cannot be moved relative to itself.');
138
+ const index = indexOf(anchor);
139
+ if (index < 0)
140
+ throw invalid(`No tool is named "${anchor}".`);
141
+ return before ? index : index + 1;
142
+ };
143
+ switch (operation.kind) {
144
+ case 'add': {
145
+ const record = recordFromDraft(operation.tool);
146
+ if (indexOf(record.name) >= 0 || parsed.tools.some((tool) => tool.name === record.name))
147
+ throw new PtbkError(`A tool named "${record.name}" already exists.`, { kind: 'conflict', effect: 'Nothing was changed.', next: ['Choose another name, or change the existing tool with `ptbk tool modify`.'] });
148
+ const at = position(record.name, operation.before, operation.after);
149
+ tools.splice(at, 0, serializeTool(record));
150
+ return { tools, summary: `Add ${toolTypeLabel(record.type)} tool ${record.name}`, name: record.name, type: record.type, after: record, noop: false };
151
+ }
152
+ case 'modify': {
153
+ const record = recordOf(operation.name);
154
+ const rename = operation.rename && operation.rename !== record.name ? (KEBAB_IDENTIFIER.test(operation.rename) ? operation.rename : kebabIdentifier(operation.rename)) : undefined;
155
+ if (operation.rename && !rename && operation.rename !== record.name)
156
+ throw invalid(`"${operation.rename}" cannot be a tool name.`);
157
+ if (rename && (indexOf(rename) >= 0 || parsed.tools.some((tool) => tool.name === rename)))
158
+ throw new PtbkError(`A tool named "${rename}" already exists.`, { kind: 'conflict', effect: 'Nothing was changed.' });
159
+ const next = modifiedRecord(record, operation.changes, rename);
160
+ const index = indexOf(record.name);
161
+ const serialized = serializeTool(next, tools[index]);
162
+ const noop = JSON.stringify(serialized) === JSON.stringify(tools[index]);
163
+ tools[index] = serialized;
164
+ return { tools, summary: rename ? `Rename tool ${record.name} to ${rename}` : `Modify tool ${record.name}`, name: record.name, type: record.type, before: record, after: next, noop };
165
+ }
166
+ case 'enable':
167
+ case 'disable': {
168
+ const record = recordOf(operation.name);
169
+ const isEnabled = operation.kind === 'enable';
170
+ const index = indexOf(record.name);
171
+ const next = { ...record, isEnabled };
172
+ tools[index] = serializeTool(next, tools[index]);
173
+ return { tools, summary: `${isEnabled ? 'Enable' : 'Disable'} tool ${record.name}`, name: record.name, type: record.type, before: record, after: next, noop: record.isEnabled === isEnabled };
174
+ }
175
+ case 'remove': {
176
+ const record = recordOf(operation.name);
177
+ tools.splice(indexOf(record.name), 1);
178
+ return { tools, summary: `Remove tool ${record.name}`, name: record.name, type: record.type, before: record, noop: false };
179
+ }
180
+ case 'move': {
181
+ const record = recordOf(operation.name);
182
+ const from = indexOf(record.name);
183
+ const [entry] = tools.splice(from, 1);
184
+ const at = position(record.name, operation.before, operation.after);
185
+ tools.splice(at, 0, entry);
186
+ return { tools, summary: `Move tool ${record.name}${operation.before ? ` before ${operation.before}` : operation.after ? ` after ${operation.after}` : ' to the end'}`, name: record.name, type: record.type, before: record, after: record, noop: at === from };
187
+ }
188
+ }
189
+ }
190
+ /**
191
+ * Applies a batch of operations to a raw configuration (pure; used by init inside its setup transaction).
192
+ *
193
+ * @private shared tool management
194
+ */
195
+ export function applyToolOperationsToConfig(raw, operations) {
196
+ const result = structuredClone(raw);
197
+ let tools = Array.isArray(result.tools) ? result.tools : [];
198
+ for (const operation of operations)
199
+ tools = planToolOperation(tools, operation).tools;
200
+ result.tools = tools;
201
+ return canonicalizeConfig(result).raw;
202
+ }
203
+ /**
204
+ * Protections of one plan that need an explicit acknowledgement (recomputed when the operation is applied).
205
+ */
206
+ function requirements(plan, operation, tools, inUse, acknowledgements) {
207
+ const found = [];
208
+ const command = commandOf(operation);
209
+ const affectsUse = operation.kind === 'modify' || operation.kind === 'disable' || operation.kind === 'remove';
210
+ if (affectsUse && inUse.has(plan.name) && !acknowledgements.force) {
211
+ found.push({
212
+ kind: 'in-use',
213
+ message: `The tool "${plan.name}" is in use by active work.`,
214
+ alternatives: [
215
+ `${command} --force # save now; the work that already acquired the tool finishes with its original configuration (not a kill)`,
216
+ `ptbk stop --force # stop the whole engine; after it has stopped, repeat: ${command}`,
217
+ ],
218
+ });
219
+ }
220
+ const enabledBefore = tools.filter((tool) => tool.type === plan.type && tool.isEnabled).length;
221
+ const parsedAfter = parseTools(plan.tools).tools;
222
+ const enabledAfter = parsedAfter.filter((tool) => tool.type === plan.type && tool.isEnabled).length;
223
+ if ((operation.kind === 'disable' || operation.kind === 'remove') && enabledBefore > 0 && enabledAfter === 0 && !acknowledgements.confirmLastOfType) {
224
+ const label = toolTypeLabel(plan.type);
225
+ found.push({
226
+ kind: 'last-of-type',
227
+ message: `"${plan.name}" is the last enabled ${label}. The engine keeps running, but cannot start ordinary new work until another ${label} is enabled or added.`,
228
+ alternatives: [`${command} --yes # confirm`],
229
+ });
230
+ }
231
+ return found;
232
+ }
233
+ /**
234
+ * The equivalent CLI command of an operation (for alternatives shown by every client).
235
+ *
236
+ * @private shared tool management
237
+ */
238
+ export function commandOf(operation) {
239
+ switch (operation.kind) {
240
+ case 'add':
241
+ return `ptbk tool add ${operation.tool.type} --variant ${operation.tool.variant} --name ${operation.tool.name}`;
242
+ case 'modify':
243
+ return `ptbk tool modify ${operation.name}${operation.rename ? ` --rename ${operation.rename}` : ''} …`;
244
+ case 'move':
245
+ return `ptbk tool move ${operation.name} ${operation.before ? `--before ${operation.before}` : `--after ${operation.after ?? ''}`}`.trim();
246
+ default:
247
+ return `ptbk tool ${operation.kind} ${operation.name}`;
248
+ }
249
+ }
250
+ /**
251
+ * Adds an ignore line to `.gitignore` content (pure; `undefined` when already present).
252
+ */
253
+ function withIgnoreLine(content, line) {
254
+ const lines = content.split(/\r?\n/).map((entry) => entry.trim());
255
+ if (lines.includes(line) || lines.includes(`/${line}`))
256
+ return undefined;
257
+ const newline = content.includes('\r\n') ? '\r\n' : '\n';
258
+ const prefix = content && !content.endsWith('\n') ? newline : '';
259
+ return `${content}${prefix}${content ? newline : ''}# Local secrets (never committed)${newline}${line}${newline}`;
260
+ }
261
+ /**
262
+ * The single implementation behind init, `ptbk tool`, dashboards and the API: validates the operation against the
263
+ * configuration current at application time, applies the shared protections, edits `.env` non-destructively for a
264
+ * supplied secret, and commits only its own non-secret changes immediately (`PTBK: <operation>`), even during an
265
+ * unrelated active task whose edits stay uncommitted in the working tree.
266
+ *
267
+ * @private shared tool management
268
+ */
269
+ export async function applyToolOperation(project, request, context) {
270
+ const gitLock = context.gitLock ?? (async (action) => await action());
271
+ const gitInfo = await inspectGit(project.root);
272
+ if (gitInfo.state !== 'repository')
273
+ throw new PtbkError('Tool management needs the project’s Git working tree.', { kind: 'setup', project: project.root, next: ['Run `ptbk init`.'] });
274
+ const repositoryRoot = gitInfo.root;
275
+ // Required configuration evolution comes first, as its own committed pass.
276
+ await maintainProjectConfiguration(project, { commit: true, env: context.env, gitLock, normalize: false });
277
+ await context.sync?.before?.().catch(() => undefined);
278
+ const outcome = await gitLock(async () => {
279
+ const workingText = await readTextIfExists(project.configPath);
280
+ const headText = await readAtHead(repositoryRoot, project.configPath);
281
+ if (workingText === undefined)
282
+ throw new PtbkError('This project has no ptbk.json.', { kind: 'setup', project: project.root, next: ['Run `ptbk init`.'] });
283
+ if (headText === undefined) {
284
+ throw new PtbkError('ptbk.json is not committed yet (an explicitly uncommitted setup).', { kind: 'conflict', project: project.root, effect: 'Nothing was changed.', next: ['Commit ptbk.json first; tool changes are always committed on their own.'] });
285
+ }
286
+ const working = parseConfigText(workingText);
287
+ const head = parseConfigText(headText);
288
+ if (working.diagnostics.length || head.diagnostics.length)
289
+ throw new PtbkError('ptbk.json is not valid JSON.', { kind: 'configuration', project: project.root, reason: [...working.diagnostics, ...head.diagnostics].map((diagnostic) => diagnostic.message).join('; '), effect: 'Nothing was changed.' });
290
+ const toolsOf = (raw) => (Array.isArray(raw.tools) ? raw.tools : []);
291
+ // The committed change is planned on HEAD; the same change is applied to the working copy, so someone else's
292
+ // uncommitted edit of ptbk.json stays uncommitted and is never swept into this commit.
293
+ const plan = planToolOperation(toolsOf(head.raw), request.operation);
294
+ let workingPlan;
295
+ try {
296
+ workingPlan = workingText === headText ? plan : planToolOperation(toolsOf(working.raw), request.operation);
297
+ }
298
+ catch (error) {
299
+ throw new PtbkError('ptbk.json has uncommitted edits that conflict with this tool change.', { kind: 'conflict', project: project.root, reason: errorMessage(error), effect: 'Nothing was changed.', next: ['Commit or discard the ptbk.json edits, then retry.'] });
300
+ }
301
+ const before = parseTools(toolsOf(head.raw)).tools;
302
+ const needed = requirements(plan, request.operation, before, context.inUse ?? new Set(), request.acknowledgements ?? {});
303
+ if (needed.length)
304
+ return { status: 'needs-acknowledgement', summary: needed.map((requirement) => requirement.message).join(' '), requirements: needed };
305
+ const notes = [];
306
+ const files = [];
307
+ // A supplied secret goes only to the ignored local .env (timestamped, non-destructive).
308
+ const envChanges = [];
309
+ if (request.secret) {
310
+ const reference = parseEnvironmentReference(plan.after?.apiKey);
311
+ if (plan.type !== 'HARNESS' || !reference)
312
+ throw invalid('A secret can only be stored for a HARNESS tool with an apiKey reference.', 'Pass --api-key-env NAME together with --api-key-stdin.');
313
+ if (reference !== request.secret.variable)
314
+ throw invalid(`The secret is for ${request.secret.variable}, but the tool references ${reference}.`);
315
+ const tracked = await git(repositoryRoot, ['ls-files', '--error-unmatch', '--', dotEnvPath(project.root)], { literal: true });
316
+ if (tracked.exitCode === 0) {
317
+ throw new PtbkError('.env is tracked by Git, so ptbk does not store secrets in it.', { kind: 'conflict', project: project.root, effect: 'Nothing was changed.', next: ['Untrack it (`git rm --cached .env`, commit) and rotate any secret that was committed, then retry.'] });
318
+ }
319
+ if (!(await ignoredPaths(project.root, [dotEnvPath(project.root)])).size) {
320
+ const gitignore = join(project.root, '.gitignore');
321
+ const headIgnore = (await readAtHead(repositoryRoot, gitignore)) ?? '';
322
+ const workingIgnore = (await readTextIfExists(gitignore)) ?? '';
323
+ const committed = withIgnoreLine(headIgnore, '.env');
324
+ if (committed)
325
+ files.push({ path: gitignore, content: committed, working: withIgnoreLine(workingIgnore, '.env') ?? workingIgnore });
326
+ notes.push('Added .env to .gitignore before storing the secret.');
327
+ }
328
+ envChanges.push({ kind: 'set', name: request.secret.variable, value: request.secret.value });
329
+ }
330
+ // Removal retires a credential only when ptbk added it and nothing else can be using it.
331
+ if (request.operation.kind === 'remove' && plan.before?.type === 'HARNESS') {
332
+ const variable = parseEnvironmentReference(plan.before.apiKey);
333
+ if (variable) {
334
+ const remaining = parseTools(plan.tools).tools.some((tool) => tool.type === 'HARNESS' && parseEnvironmentReference(tool.apiKey) === variable);
335
+ const dotEnv = await readDotEnv(project.root);
336
+ const elsewhere = (await git(repositoryRoot, ['grep', '--untracked', '-I', '-l', '-w', '-F', variable, '--', '.', ':!ptbk.json'], { literal: false })).stdout.trim();
337
+ if (remaining)
338
+ notes.push(`${variable} stays active in .env: another tool (enabled or disabled) still references it.`);
339
+ else if (elsewhere)
340
+ notes.push(`${variable} stays active in .env: it is also used by ${elsewhere.split('\n').slice(0, 3).join(', ')}.`);
341
+ else if (!isEngineManagedAssignment(dotEnv, variable))
342
+ notes.push(`${variable} stays active: ptbk did not add it, so its other consumers are unknown.`);
343
+ else
344
+ envChanges.push({ kind: 'retire', name: variable });
345
+ }
346
+ }
347
+ if (plan.noop && !envChanges.length)
348
+ return { status: 'no-op', summary: `${plan.summary}: nothing to change.`, notes };
349
+ if (envChanges.length) {
350
+ const edit = await editDotEnv(project.root, envChanges, { reason: plan.summary.toLowerCase(), operation: commandOf(request.operation), timeZone: context.timeZone });
351
+ notes.push(...edit.notes);
352
+ }
353
+ let commit;
354
+ if (!plan.noop) {
355
+ const headConfig = canonicalizeConfig({ ...head.raw, tools: plan.tools }).raw;
356
+ const workingConfig = canonicalizeConfig({ ...working.raw, tools: workingPlan.tools }).raw;
357
+ files.unshift({ path: project.configPath, content: configText(headConfig), working: configText(workingConfig) });
358
+ const result = await commitFileContents({
359
+ projectRoot: project.root,
360
+ repositoryRoot,
361
+ files: files.map((file) => ({ path: file.path, content: file.content })),
362
+ subject: plan.summary,
363
+ body: [`Saved tool management${request.via ? ` (${request.via})` : ''}: ${commandOf(request.operation)}`, ...notes.filter((note) => !/\.env/.test(note) || /gitignore/.test(note))].join('\n'),
364
+ trailers: { 'PTBK-Tool': plan.after?.name ?? plan.name },
365
+ temporaryDirectory: project.runtime.temporary,
366
+ env: context.env,
367
+ });
368
+ commit = result.committed ? result.sha : undefined;
369
+ for (const file of files)
370
+ await writeFileAtomic(file.path, file.working);
371
+ }
372
+ return { status: 'applied', summary: plan.summary, commit, tool: plan.after, notes };
373
+ });
374
+ if (outcome.status === 'applied')
375
+ await context.sync?.after?.().catch(() => undefined);
376
+ return outcome;
377
+ }
378
+ //# sourceMappingURL=operations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"operations.js","sourceRoot":"","sources":["../../src/tools/operations.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,72 @@
1
+ import type { EffectiveSettings } from '../project/config.js';
2
+ import type { Project } from '../project/workspace.js';
3
+ import type { HarnessPool } from '../engine/harnesses.js';
4
+ import type { ToolsView, ToolView } from '../engine/snapshot.js';
5
+ import { type BrowserToolRecord, type ToolRecord } from './model.js';
6
+ /**
7
+ * Observed readiness of one browser tool (never launches it).
8
+ *
9
+ * @private tool readiness
10
+ */
11
+ export type BrowserReadiness = {
12
+ readonly usable: boolean;
13
+ readonly summary: string;
14
+ readonly nextAction?: string;
15
+ readonly executable?: string;
16
+ readonly profilePath: string;
17
+ };
18
+ /**
19
+ * Checks a browser tool without launching it: executable, and an explicitly selected existing profile.
20
+ *
21
+ * @private tool readiness
22
+ */
23
+ export declare function inspectBrowserTool(project: Project, tool: BrowserToolRecord, env: NodeJS.ProcessEnv): Promise<BrowserReadiness>;
24
+ /**
25
+ * Non-secret display fields of a tool (an API key only as its reference and effective source).
26
+ *
27
+ * @private tool readiness
28
+ */
29
+ export declare function toolFields(project: Project, tool: ToolRecord, env: NodeJS.ProcessEnv, pool?: HarnessPool): Record<string, string>;
30
+ /**
31
+ * Display name of a tool's adapter.
32
+ *
33
+ * @private tool readiness
34
+ */
35
+ export declare function variantLabel(tool: Pick<ToolRecord, 'type' | 'variant'>): string;
36
+ /**
37
+ * Inputs of the shared tool inventory view.
38
+ *
39
+ * @private tool readiness
40
+ */
41
+ export type ToolInventoryInput = {
42
+ readonly project: Project;
43
+ readonly settings: EffectiveSettings;
44
+ readonly env: NodeJS.ProcessEnv;
45
+ /** Live harness inspections (already refreshed). */
46
+ readonly pool: HarnessPool;
47
+ /** Browser readiness by name (already inspected). */
48
+ readonly browsers: ReadonlyMap<string, BrowserReadiness>;
49
+ /** Names held by active work. */
50
+ readonly inUse?: ReadonlySet<string>;
51
+ /** Names whose acquired old configuration is still used (changed, disabled or removed). */
52
+ readonly retained?: ReadonlySet<string>;
53
+ };
54
+ /**
55
+ * Builds the shared ordered tool inventory with the baseline readiness of new work: at least one enabled usable
56
+ * browser and harness. Missing resources are a running engine's wait, never a stop.
57
+ *
58
+ * @private tool readiness
59
+ */
60
+ export declare function toolInventory(input: ToolInventoryInput): ToolsView;
61
+ /**
62
+ * What new work waits for, when no enabled usable browser or harness exists.
63
+ *
64
+ * @private tool readiness
65
+ */
66
+ export declare function baselineWait(items: readonly ToolView[]): ToolsView['waiting'];
67
+ /**
68
+ * Inspects every configured tool once (read-only; no browser launch, no model call).
69
+ *
70
+ * @private tool readiness
71
+ */
72
+ export declare function inspectInventory(project: Project, settings: EffectiveSettings, env: NodeJS.ProcessEnv, pool: HarnessPool): Promise<ToolsView>;