@vibesdotdev/integrations-pi 0.0.0-stage → 1.0.0-rc.1

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 (163) hide show
  1. package/LICENSE +126 -0
  2. package/REFERENCE.md +284 -0
  3. package/dist/extension/active-tools.d.ts +17 -0
  4. package/dist/extension/active-tools.d.ts.map +1 -0
  5. package/dist/extension/active-tools.js +47 -0
  6. package/dist/extension/active-tools.js.map +1 -0
  7. package/dist/extension/approvals.d.ts +26 -0
  8. package/dist/extension/approvals.d.ts.map +1 -0
  9. package/dist/extension/approvals.js +124 -0
  10. package/dist/extension/approvals.js.map +1 -0
  11. package/dist/extension/boot.d.ts +18 -0
  12. package/dist/extension/boot.d.ts.map +1 -0
  13. package/dist/extension/boot.js +129 -0
  14. package/dist/extension/boot.js.map +1 -0
  15. package/dist/extension/chrome.d.ts +37 -0
  16. package/dist/extension/chrome.d.ts.map +1 -0
  17. package/dist/extension/chrome.js +160 -0
  18. package/dist/extension/chrome.js.map +1 -0
  19. package/dist/extension/commands.d.ts +41 -0
  20. package/dist/extension/commands.d.ts.map +1 -0
  21. package/dist/extension/commands.js +47 -0
  22. package/dist/extension/commands.js.map +1 -0
  23. package/dist/extension/entry.d.ts +9 -0
  24. package/dist/extension/entry.d.ts.map +1 -0
  25. package/dist/extension/entry.js +16 -0
  26. package/dist/extension/entry.js.map +1 -0
  27. package/dist/extension/events.d.ts +17 -0
  28. package/dist/extension/events.d.ts.map +1 -0
  29. package/dist/extension/events.js +42 -0
  30. package/dist/extension/events.js.map +1 -0
  31. package/dist/extension/index.d.ts +54 -0
  32. package/dist/extension/index.d.ts.map +1 -0
  33. package/dist/extension/index.js +547 -0
  34. package/dist/extension/index.js.map +1 -0
  35. package/dist/extension/models.d.ts +30 -0
  36. package/dist/extension/models.d.ts.map +1 -0
  37. package/dist/extension/models.js +104 -0
  38. package/dist/extension/models.js.map +1 -0
  39. package/dist/extension/render.d.ts +17 -0
  40. package/dist/extension/render.d.ts.map +1 -0
  41. package/dist/extension/render.js +107 -0
  42. package/dist/extension/render.js.map +1 -0
  43. package/dist/extension/runtime-host.d.ts +6 -0
  44. package/dist/extension/runtime-host.d.ts.map +1 -0
  45. package/dist/extension/runtime-host.js +2 -0
  46. package/dist/extension/runtime-host.js.map +1 -0
  47. package/dist/external/external.plugin.d.ts +7 -0
  48. package/dist/external/external.plugin.d.ts.map +1 -0
  49. package/dist/external/external.plugin.js +44 -0
  50. package/dist/external/external.plugin.js.map +1 -0
  51. package/dist/external/index.d.ts +8 -0
  52. package/dist/external/index.d.ts.map +1 -0
  53. package/dist/external/index.js +8 -0
  54. package/dist/external/index.js.map +1 -0
  55. package/dist/external/pi/bootstrap.d.ts +34 -0
  56. package/dist/external/pi/bootstrap.d.ts.map +1 -0
  57. package/dist/external/pi/bootstrap.js +238 -0
  58. package/dist/external/pi/bootstrap.js.map +1 -0
  59. package/dist/external/pi/guide.d.ts +3 -0
  60. package/dist/external/pi/guide.d.ts.map +1 -0
  61. package/dist/external/pi/guide.js +33 -0
  62. package/dist/external/pi/guide.js.map +1 -0
  63. package/dist/external/pi/index.d.ts +162 -0
  64. package/dist/external/pi/index.d.ts.map +1 -0
  65. package/dist/external/pi/index.js +7 -0
  66. package/dist/external/pi/index.js.map +1 -0
  67. package/dist/external/pi/installer.d.ts +19 -0
  68. package/dist/external/pi/installer.d.ts.map +1 -0
  69. package/dist/external/pi/installer.descriptor.d.ts +373 -0
  70. package/dist/external/pi/installer.descriptor.d.ts.map +1 -0
  71. package/dist/external/pi/installer.descriptor.js +43 -0
  72. package/dist/external/pi/installer.descriptor.js.map +1 -0
  73. package/dist/external/pi/installer.js +82 -0
  74. package/dist/external/pi/installer.js.map +1 -0
  75. package/dist/external/pi/installers/errors.d.ts +16 -0
  76. package/dist/external/pi/installers/errors.d.ts.map +1 -0
  77. package/dist/external/pi/installers/errors.js +15 -0
  78. package/dist/external/pi/installers/errors.js.map +1 -0
  79. package/dist/external/pi/installers/extension.d.ts +16 -0
  80. package/dist/external/pi/installers/extension.d.ts.map +1 -0
  81. package/dist/external/pi/installers/extension.js +292 -0
  82. package/dist/external/pi/installers/extension.js.map +1 -0
  83. package/dist/external/pi/installers/plan.d.ts +29 -0
  84. package/dist/external/pi/installers/plan.d.ts.map +1 -0
  85. package/dist/external/pi/installers/plan.js +391 -0
  86. package/dist/external/pi/installers/plan.js.map +1 -0
  87. package/dist/external/pi/installers/transaction.d.ts +5 -0
  88. package/dist/external/pi/installers/transaction.d.ts.map +1 -0
  89. package/dist/external/pi/installers/transaction.js +66 -0
  90. package/dist/external/pi/installers/transaction.js.map +1 -0
  91. package/dist/external/pi/manifest.d.ts +6 -0
  92. package/dist/external/pi/manifest.d.ts.map +1 -0
  93. package/dist/external/pi/manifest.js +91 -0
  94. package/dist/external/pi/manifest.js.map +1 -0
  95. package/dist/external/pi-presets.d.ts +817 -0
  96. package/dist/external/pi-presets.d.ts.map +1 -0
  97. package/dist/external/pi-presets.js +75 -0
  98. package/dist/external/pi-presets.js.map +1 -0
  99. package/dist/harness/constants.d.ts +46 -0
  100. package/dist/harness/constants.d.ts.map +1 -0
  101. package/dist/harness/constants.js +52 -0
  102. package/dist/harness/constants.js.map +1 -0
  103. package/dist/harness/identity.d.ts +29 -0
  104. package/dist/harness/identity.d.ts.map +1 -0
  105. package/dist/harness/identity.js +40 -0
  106. package/dist/harness/identity.js.map +1 -0
  107. package/dist/harness/index.d.ts +19 -0
  108. package/dist/harness/index.d.ts.map +1 -0
  109. package/dist/harness/index.js +18 -0
  110. package/dist/harness/index.js.map +1 -0
  111. package/dist/harness/managed-block.d.ts +20 -0
  112. package/dist/harness/managed-block.d.ts.map +1 -0
  113. package/dist/harness/managed-block.js +23 -0
  114. package/dist/harness/managed-block.js.map +1 -0
  115. package/dist/harness/pi-naming.d.ts +32 -0
  116. package/dist/harness/pi-naming.d.ts.map +1 -0
  117. package/dist/harness/pi-naming.js +110 -0
  118. package/dist/harness/pi-naming.js.map +1 -0
  119. package/dist/harness/preflight.d.ts +5 -0
  120. package/dist/harness/preflight.d.ts.map +1 -0
  121. package/dist/harness/preflight.js +163 -0
  122. package/dist/harness/preflight.js.map +1 -0
  123. package/dist/harness/prompt.d.ts +14 -0
  124. package/dist/harness/prompt.d.ts.map +1 -0
  125. package/dist/harness/prompt.js +15 -0
  126. package/dist/harness/prompt.js.map +1 -0
  127. package/dist/harness/runtime.d.ts +137 -0
  128. package/dist/harness/runtime.d.ts.map +1 -0
  129. package/dist/harness/runtime.js +53 -0
  130. package/dist/harness/runtime.js.map +1 -0
  131. package/dist/harness/scope.d.ts +11 -0
  132. package/dist/harness/scope.d.ts.map +1 -0
  133. package/dist/harness/scope.js +47 -0
  134. package/dist/harness/scope.js.map +1 -0
  135. package/dist/harness/themes.d.ts +30 -0
  136. package/dist/harness/themes.d.ts.map +1 -0
  137. package/dist/harness/themes.js +225 -0
  138. package/dist/harness/themes.js.map +1 -0
  139. package/dist/index.d.ts +2 -0
  140. package/dist/index.d.ts.map +1 -0
  141. package/dist/index.js +2 -0
  142. package/dist/index.js.map +1 -0
  143. package/dist/schemas/extension-api.d.ts +102 -0
  144. package/dist/schemas/extension-api.d.ts.map +1 -0
  145. package/dist/schemas/extension-api.js +2 -0
  146. package/dist/schemas/extension-api.js.map +1 -0
  147. package/dist/schemas/extension-host.d.ts +11 -0
  148. package/dist/schemas/extension-host.d.ts.map +1 -0
  149. package/dist/schemas/extension-host.js +12 -0
  150. package/dist/schemas/extension-host.js.map +1 -0
  151. package/dist/schemas/extension.d.ts +212 -0
  152. package/dist/schemas/extension.d.ts.map +1 -0
  153. package/dist/schemas/extension.js +93 -0
  154. package/dist/schemas/extension.js.map +1 -0
  155. package/dist/schemas/installer.d.ts +872 -0
  156. package/dist/schemas/installer.d.ts.map +1 -0
  157. package/dist/schemas/installer.js +138 -0
  158. package/dist/schemas/installer.js.map +1 -0
  159. package/dist/themes/vibes-dark.json +63 -0
  160. package/dist/themes/vibes-high-contrast.json +63 -0
  161. package/dist/themes/vibes-light.json +63 -0
  162. package/package.json +110 -4
  163. package/README.md +0 -3
@@ -0,0 +1,391 @@
1
+ import { CapabilityError } from '@vibesdotdev/kernel';
2
+ import * as z from 'zod/v4';
3
+ import { PiManagedSettingsSchema, PiPlanInputSchema, PiSettingsSchema, PiStringListSchema } from "../../../schemas/installer.js";
4
+ /**
5
+ * Pure planning for the files the Pi harness owns.
6
+ *
7
+ * No IO here: given the bytes already on disk plus the requested profile,
8
+ * this decides the exact desired bytes, the semantic change list, the legacy
9
+ * forms it will migrate, and the conflicts it will refuse to overwrite.
10
+ * install, dry-run, status, and uninstall all read the same plan, so a dry run
11
+ * cannot disagree with the real thing.
12
+ */
13
+ import { HARNESS_SYSTEM_PROMPT_PROVENANCE_MARKER, VIBES_HARNESS_MARKER_VERSION, VIBES_MANAGED_SETTINGS_KEY, buildStaticHarnessBriefing } from '@vibesdotdev/external/harness';
14
+ import { DEFAULT_PI_TOOL_POLICY_PROFILE, VIBES_PI_EXTENSION_PACKAGE, piDefaultToolsForProfile } from "../../../harness/constants.js";
15
+ import { DEFAULT_PI_VIBES_THEME, PI_THEME_REF, isPiVibesThemeName, renderPiVibesThemes, } from "../../../harness/themes.js";
16
+ /**
17
+ * Frozen pre-live-catalog prompt texts. Pre-marker installs baked a prompt
18
+ * that enumerated the curated harness table; the managed-block migration
19
+ * strips exactly these bytes so they are replaced, not duplicated. Frozen:
20
+ * do not edit, do not reuse for new installs.
21
+ */
22
+ export const LEGACY_PI_PROMPT_TEXTS = [
23
+ "System prompt provenance: @vibesdotdev/tools harness projection (overlay.surface.system-agent + guardrails.session-protocol).\n\nYou are a Vibes-projected agent. Host built-in tools are disabled where this\nharness allows it. Use vibes_* tools for work.\n\n- vibes_tools_run — invoke any registered vibes tool by id + JSON input.\n- vibes_session — session lifecycle (init / packet / status).\n- vibes_workspace_fs — workspace file actions (list / read / write / edit).\n- Also callable: vibes_work_list, vibes_setup_status, vibes_setup_requirements, vibes_auth_status, vibes_account_whoami, vibes_dev_code_atlas_search.\n- Prefer concrete outputs. Verify with tools before claiming.\n\nThese are the only callable Vibes tool names in this host. The canonical dotted\nids (for example vibes.tools.run) are CLI routing identity; never\nemit one as a tool name.\n\nIf a requested operation is unavailable, say the constraint and the next viable action.",
24
+ "System prompt provenance: @vibesdotdev/tools harness projection (overlay.surface.system-agent + guardrails.session-protocol).\n\nYou are a Vibes-projected agent. Host built-in tools are disabled where this\nharness allows it. Use vibes.* tools for work.\n\n- vibes.tools.run — invoke any registered vibes tool by id + JSON input.\n- vibes.session — session lifecycle (init / packet / status).\n- vibes.workspace-fs — workspace file actions (list / read / write / edit).\n- Prefer concrete outputs. Verify with tools before claiming.\n\nIf a requested operation is unavailable, say the constraint and the next viable action."
25
+ ];
26
+ import { managedBlockVersion, managedFileVersion, removeManagedBlock, replaceManagedBlock, withManagedFileHeader } from '@vibesdotdev/external/harness';
27
+ import { isLegacyPiExtensionModule } from "../../../harness/managed-block.js";
28
+ import { JsonValueSchema } from '@vibesdotdev/kernel/schemas/json';
29
+ export const PI_SYSTEM_PROMPT_BLOCK_KIND = 'pi-system-prompt';
30
+ export const PI_EXTENSION_FILE_KIND = 'pi-extension';
31
+ /** Prompt Pi is given. Generic by design: the live extension briefing names
32
+ * the tools actually registered at Pi load, so the baked file must not repeat
33
+ * a tool list that can drift from the registry. */
34
+ export function renderPiSystemPrompt() {
35
+ return buildStaticHarnessBriefing('vibes_*');
36
+ }
37
+ /** The project-local module Pi loads; the specifier is JSON-escaped. */
38
+ export function renderPiVibesExtension(packageName = VIBES_PI_EXTENSION_PACKAGE) {
39
+ const body = 'import create from ' + JSON.stringify(packageName) + ';\nexport default create;\n';
40
+ return withManagedFileHeader(PI_EXTENSION_FILE_KIND, body);
41
+ }
42
+ export function parsePiSettings(raw, _path) {
43
+ if (raw === undefined)
44
+ return {};
45
+ try {
46
+ return PiSettingsSchema.parse(JSON.parse(raw));
47
+ }
48
+ catch (cause) {
49
+ throw new CapabilityError('Pi settings must contain a JSON object; the file was preserved.', 'INVALID_INPUT', {
50
+ reason: 'pi-settings-invalid', cause
51
+ });
52
+ }
53
+ }
54
+ function readMarker(settings) {
55
+ const raw = settings[VIBES_MANAGED_SETTINGS_KEY];
56
+ if (raw === undefined)
57
+ return null;
58
+ const marker = PiManagedSettingsSchema.safeParse(raw);
59
+ if (!marker.success)
60
+ throw new CapabilityError('The Pi ownership marker is invalid; settings were preserved.', 'INVALID_INPUT', {
61
+ reason: 'pi-marker-invalid', cause: marker.error
62
+ });
63
+ return marker.data;
64
+ }
65
+ function describeDefaultTools(before, after) {
66
+ const shown = (value) => {
67
+ const parsed = PiStringListSchema.safeParse(value);
68
+ return parsed.success ? '[' + parsed.data.join(', ') + ']' : 'host default';
69
+ };
70
+ return 'defaultTools ' + shown(before) + ' -> ' + shown(after);
71
+ }
72
+ /** Plan an install (also used for repair, upgrade, and dry-run). */
73
+ export function planPiHarnessFiles(rawInput, settingsPath = '.pi/settings.json') {
74
+ const input = PiPlanInputSchema.parse(rawInput);
75
+ const conflicts = [];
76
+ const migrations = [];
77
+ const changes = [];
78
+ // --- extension module ------------------------------------------------
79
+ const desiredExtension = renderPiVibesExtension(input.packageName);
80
+ const existingExtension = input.extension;
81
+ if (existingExtension !== undefined) {
82
+ const marker = managedFileVersion(existingExtension, PI_EXTENSION_FILE_KIND);
83
+ if (marker === null) {
84
+ if (isLegacyPiExtensionModule(existingExtension)) {
85
+ migrations.push('extension module: adding the v' +
86
+ VIBES_HARNESS_MARKER_VERSION +
87
+ ' ownership marker to the pre-marker re-export');
88
+ }
89
+ else {
90
+ conflicts.push({
91
+ kind: 'extension',
92
+ reason: 'a non-Vibes module already occupies this path',
93
+ remedy: 'move the file, or add the vibes ownership marker once it is a Vibes re-export'
94
+ });
95
+ }
96
+ }
97
+ else if (marker !== VIBES_HARNESS_MARKER_VERSION) {
98
+ migrations.push('extension module: upgrading marker v' + marker + ' to v' + VIBES_HARNESS_MARKER_VERSION);
99
+ }
100
+ }
101
+ changes.push({
102
+ kind: 'extension',
103
+ action: existingExtension === undefined
104
+ ? 'created'
105
+ : existingExtension === desiredExtension
106
+ ? 'preserved'
107
+ : 'updated',
108
+ summary: 're-export ' + input.packageName
109
+ });
110
+ // --- SYSTEM.md --------------------------------------------------------
111
+ const prompt = renderPiSystemPrompt();
112
+ const legacyPromptLine = HARNESS_SYSTEM_PROMPT_PROVENANCE_MARKER;
113
+ let ownerContent = input.systemPrompt ?? '';
114
+ const existingSystem = input.systemPrompt;
115
+ const existingVersion = existingSystem === undefined
116
+ ? null
117
+ : managedBlockVersion(existingSystem, PI_SYSTEM_PROMPT_BLOCK_KIND);
118
+ if (existingSystem !== undefined && existingVersion === null) {
119
+ const legacyIndex = existingSystem.indexOf(legacyPromptLine);
120
+ if (legacyIndex === 0) {
121
+ // Pre-marker installs prepended the bare prompt. Strip exactly that
122
+ // text so the managed block replaces it instead of duplicating it.
123
+ // The pre-marker installer prepended the canonical prompt text, which
124
+ // named the dotted OpenCode spellings. Strip that exact text as well as
125
+ // the current Pi text so the managed block replaces it instead of
126
+ // stacking a second briefing on top.
127
+ let stripped = existingSystem;
128
+ for (const superseded of [prompt, ...LEGACY_PI_PROMPT_TEXTS]) {
129
+ stripped = stripped
130
+ .replace(superseded + '\n\n', '')
131
+ .replace(superseded + '\n', '')
132
+ .replace(superseded, '');
133
+ }
134
+ stripped = stripped.replace(/^\n+/, '');
135
+ if (stripped !== existingSystem) {
136
+ ownerContent = stripped;
137
+ migrations.push('SYSTEM.md: converting the unmarked harness prompt into a v' +
138
+ VIBES_HARNESS_MARKER_VERSION +
139
+ ' managed block');
140
+ }
141
+ }
142
+ }
143
+ else if (existingVersion !== null && existingVersion !== VIBES_HARNESS_MARKER_VERSION) {
144
+ migrations.push('SYSTEM.md: upgrading marker v' + existingVersion + ' to v' + VIBES_HARNESS_MARKER_VERSION);
145
+ }
146
+ // Pi reads the whole file, but the harness briefing belongs at the top.
147
+ const desiredSystemPrompt = replaceManagedBlock(ownerContent, PI_SYSTEM_PROMPT_BLOCK_KIND, prompt);
148
+ changes.push({
149
+ kind: 'system-prompt',
150
+ action: existingSystem === undefined
151
+ ? 'created'
152
+ : existingSystem === desiredSystemPrompt
153
+ ? 'preserved'
154
+ : 'updated',
155
+ summary: ownerContent.length === 0
156
+ ? 'harness prompt only'
157
+ : 'harness prompt plus existing project instructions'
158
+ });
159
+ // --- settings.json ---------------------------------------------------
160
+ const settings = parsePiSettings(input.settings, settingsPath);
161
+ const previousMarker = readMarker(settings);
162
+ const themeFiles = renderPiVibesThemes();
163
+ for (const file of themeFiles) {
164
+ const existing = input.themes?.[file.filename];
165
+ const owned = existing !== undefined && previousMarker?.themeContents?.[file.filename] === existing;
166
+ if (existing !== undefined && !owned) {
167
+ conflicts.push({
168
+ kind: 'theme',
169
+ reason: 'theme ' + file.filename + ' is unowned or has been modified',
170
+ remedy: 'move the theme aside before installing; existing theme edits will not be overwritten'
171
+ });
172
+ }
173
+ changes.push({
174
+ kind: 'theme',
175
+ action: existing === undefined ? 'created' : !owned || existing === file.content ? 'preserved' : 'updated',
176
+ summary: file.filename
177
+ });
178
+ }
179
+ const profile = input.profile ?? previousMarker?.profile ?? DEFAULT_PI_TOOL_POLICY_PROFILE;
180
+ const existingExtensions = settings.extensions;
181
+ const extensionList = PiStringListSchema.safeParse(existingExtensions);
182
+ const singleExtension = z.string().safeParse(existingExtensions);
183
+ let extensions = [];
184
+ if (existingExtensions === undefined) {
185
+ extensions = [];
186
+ }
187
+ else if (extensionList.success) {
188
+ extensions = extensionList.data;
189
+ if (previousMarker === null)
190
+ migrations.push('settings.json: preserving the existing extensions array');
191
+ }
192
+ else if (singleExtension.success) {
193
+ extensions = [singleExtension.data];
194
+ migrations.push('settings.json: promoting the single string extensions value to an array');
195
+ }
196
+ else {
197
+ conflicts.push({ kind: 'settings', reason: 'settings.extensions must be an array of strings or a string',
198
+ remedy: 'correct the extensions key, then re-run install' });
199
+ }
200
+ if (!extensions.includes(input.extensionRef))
201
+ extensions.push(input.extensionRef);
202
+ const existingThemes = settings.themes;
203
+ const themeList = PiStringListSchema.safeParse(existingThemes);
204
+ let themeRefs = [PI_THEME_REF];
205
+ if (themeList.success)
206
+ themeRefs = [...new Set([...themeList.data, PI_THEME_REF])];
207
+ else if (existingThemes !== undefined)
208
+ conflicts.push({
209
+ kind: 'settings', reason: 'settings.themes must be an array of strings',
210
+ remedy: 'correct the themes key, then re-run install'
211
+ });
212
+ settings.themes = themeRefs;
213
+ const beforeTheme = settings.theme;
214
+ if (beforeTheme === undefined) {
215
+ settings.theme = DEFAULT_PI_VIBES_THEME;
216
+ }
217
+ const desiredDefaultTools = piDefaultToolsForProfile(profile, input.knownBuiltins);
218
+ const beforeDefaultTools = settings.defaultTools;
219
+ if (beforeDefaultTools !== undefined && !PiStringListSchema.safeParse(beforeDefaultTools).success) {
220
+ conflicts.push({ kind: 'settings', reason: 'settings.defaultTools must be an array of strings',
221
+ remedy: 'correct the tool policy before installing; existing policy was preserved' });
222
+ }
223
+ if (desiredDefaultTools !== undefined) {
224
+ settings.defaultTools = desiredDefaultTools;
225
+ }
226
+ else if (previousMarker !== null && previousMarker.profile !== 'native') {
227
+ // Release the restriction we installed, restoring the user's host policy.
228
+ if (previousMarker.previousDefaultTools !== undefined) {
229
+ settings.defaultTools = previousMarker.previousDefaultTools;
230
+ }
231
+ else {
232
+ delete settings.defaultTools;
233
+ }
234
+ }
235
+ settings.extensions = [...new Set(extensions)];
236
+ const managed = {
237
+ package: input.packageName,
238
+ markerVersion: VIBES_HARNESS_MARKER_VERSION,
239
+ profile,
240
+ extensionRef: input.extensionRef,
241
+ themeContents: Object.fromEntries(themeFiles.map(file => [file.filename, file.content])),
242
+ addedThemeRef: previousMarker?.addedThemeRef === true ||
243
+ !themeList.success || !themeList.data.includes(PI_THEME_REF),
244
+ selectedTheme: previousMarker?.selectedTheme === true || beforeTheme === undefined,
245
+ previousDefaultTools: previousMarker === null || (previousMarker.profile === 'native' && profile !== 'native')
246
+ ? PiStringListSchema.safeParse(beforeDefaultTools).data
247
+ : previousMarker.previousDefaultTools,
248
+ previousTheme: previousMarker?.previousTheme ??
249
+ (!isPiVibesThemeName(beforeTheme) ? z.string().safeParse(beforeTheme).data : undefined)
250
+ };
251
+ if (managed.previousDefaultTools === undefined)
252
+ delete managed.previousDefaultTools;
253
+ if (managed.previousTheme === undefined)
254
+ delete managed.previousTheme;
255
+ settings[VIBES_MANAGED_SETTINGS_KEY] = JsonValueSchema.parse(JSON.parse(JSON.stringify(managed)));
256
+ const desiredSettings = JSON.stringify(settings, null, 2) + '\n';
257
+ changes.push({
258
+ kind: 'settings',
259
+ action: input.settings === undefined
260
+ ? 'created'
261
+ : input.settings === desiredSettings
262
+ ? 'preserved'
263
+ : 'updated',
264
+ summary: describeDefaultTools(beforeDefaultTools, settings.defaultTools) +
265
+ ' + extensions includes ' +
266
+ input.extensionRef
267
+ });
268
+ return {
269
+ extensionContent: desiredExtension,
270
+ systemPromptContent: desiredSystemPrompt,
271
+ settingsContent: desiredSettings,
272
+ changes,
273
+ migrations,
274
+ conflicts,
275
+ managed,
276
+ themeFiles
277
+ };
278
+ }
279
+ /** Remove exactly the bytes the installer wrote, restoring captured values. */
280
+ export function planPiHarnessRemoval(input, settingsPath = '.pi/settings.json') {
281
+ const changes = [];
282
+ const conflicts = [];
283
+ const settings = parsePiSettings(input.settings, settingsPath);
284
+ const marker = readMarker(settings);
285
+ const removeThemeFiles = [];
286
+ let retainedTheme = false;
287
+ for (const file of renderPiVibesThemes()) {
288
+ const existing = input.themes?.[file.filename];
289
+ if (existing === undefined)
290
+ continue;
291
+ const owned = marker?.themeContents?.[file.filename] === existing;
292
+ if (owned)
293
+ removeThemeFiles.push(file.filename);
294
+ else
295
+ retainedTheme = true;
296
+ changes.push({
297
+ kind: 'theme',
298
+ action: owned ? 'removed' : 'preserved',
299
+ summary: file.filename + (owned ? '' : ': unowned or modified; left untouched')
300
+ });
301
+ }
302
+ const managedExtension = input.extension !== undefined &&
303
+ managedFileVersion(input.extension, PI_EXTENSION_FILE_KIND) !== null;
304
+ if (input.extension !== undefined && !managedExtension) {
305
+ conflicts.push({
306
+ kind: 'extension',
307
+ reason: 'the module at this path carries no Vibes ownership marker',
308
+ remedy: 'remove it yourself; uninstall will not delete a file it does not own'
309
+ });
310
+ }
311
+ changes.push({
312
+ kind: 'extension',
313
+ action: managedExtension ? 'removed' : 'preserved',
314
+ summary: managedExtension ? 'deleting the Vibes re-export' : 'nothing of ours to delete'
315
+ });
316
+ let systemPromptContent = input.systemPrompt;
317
+ if (input.systemPrompt !== undefined) {
318
+ const stripped = removeManagedBlock(input.systemPrompt, PI_SYSTEM_PROMPT_BLOCK_KIND);
319
+ systemPromptContent = stripped !== input.systemPrompt && stripped.length === 0 ? undefined : stripped;
320
+ changes.push({
321
+ kind: 'system-prompt',
322
+ action: stripped === input.systemPrompt ? 'preserved' : 'updated',
323
+ summary: stripped === input.systemPrompt
324
+ ? 'no managed prompt block; left untouched'
325
+ : stripped.length === 0
326
+ ? 'no project instructions left; file removed'
327
+ : 'harness prompt block removed, project instructions kept'
328
+ });
329
+ }
330
+ let settingsContent = input.settings;
331
+ if (input.settings !== undefined) {
332
+ if (marker === null) {
333
+ changes.push({
334
+ kind: 'settings',
335
+ action: 'preserved',
336
+ summary: 'no Vibes ownership marker; settings left untouched'
337
+ });
338
+ }
339
+ else {
340
+ const remaining = Array.isArray(settings.extensions)
341
+ ? settings.extensions.filter((entry) => entry !== marker.extensionRef && entry !== input.extensionRef)
342
+ : settings.extensions;
343
+ if (Array.isArray(remaining) && remaining.length === 0)
344
+ delete settings.extensions;
345
+ else if (Array.isArray(remaining))
346
+ settings.extensions = remaining;
347
+ const remainingThemes = marker.addedThemeRef && !retainedTheme && Array.isArray(settings.themes)
348
+ ? settings.themes.filter((entry) => entry !== PI_THEME_REF)
349
+ : settings.themes;
350
+ if (Array.isArray(remainingThemes) && remainingThemes.length === 0)
351
+ delete settings.themes;
352
+ else if (Array.isArray(remainingThemes))
353
+ settings.themes = remainingThemes;
354
+ if (marker.selectedTheme && settings.theme === DEFAULT_PI_VIBES_THEME &&
355
+ (input.themes?.[DEFAULT_PI_VIBES_THEME + '.json'] === undefined ||
356
+ removeThemeFiles.includes(DEFAULT_PI_VIBES_THEME + '.json')))
357
+ delete settings.theme;
358
+ if (marker.profile !== 'native') {
359
+ if (marker.previousDefaultTools !== undefined) {
360
+ settings.defaultTools = marker.previousDefaultTools;
361
+ }
362
+ else {
363
+ delete settings.defaultTools;
364
+ }
365
+ }
366
+ delete settings[VIBES_MANAGED_SETTINGS_KEY];
367
+ settingsContent =
368
+ Object.keys(settings).length === 0
369
+ ? undefined
370
+ : JSON.stringify(settings, null, 2) + '\n';
371
+ changes.push({
372
+ kind: 'settings',
373
+ action: 'updated',
374
+ summary: marker.profile === 'native'
375
+ ? 'native defaultTools preserved'
376
+ : marker.previousDefaultTools === undefined
377
+ ? 'defaultTools released to the host default'
378
+ : 'defaultTools restored to [' + marker.previousDefaultTools.join(', ') + ']'
379
+ });
380
+ }
381
+ }
382
+ return {
383
+ removeExtensionFile: managedExtension,
384
+ systemPromptContent,
385
+ settingsContent,
386
+ removeThemeFiles,
387
+ changes,
388
+ conflicts
389
+ };
390
+ }
391
+ //# sourceMappingURL=plan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan.js","sourceRoot":"","sources":["../../../../src/external/pi/installers/plan.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { type FileSystemAdapterInterface } from '@vibesdotdev/filesystem';
2
+ import type { PiTextWrite } from '../../../schemas/installer.ts';
3
+ /** Snapshot before mutation; rollback attempted targets in reverse order, preserving every failure. */
4
+ export declare function applyPiChanges(fs: FileSystemAdapterInterface, changes: readonly PiTextWrite[]): Promise<void>;
5
+ //# sourceMappingURL=transaction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transaction.d.ts","sourceRoot":"","sources":["../../../../src/external/pi/installers/transaction.ts"],"names":[],"mappings":"AACA,OAAO,EAA8B,KAAK,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AAGtG,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAEjE,uGAAuG;AACvG,wBAAsB,cAAc,CAAC,EAAE,EAAE,0BAA0B,EAAE,OAAO,EAAE,SAAS,WAAW,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA2BnH"}
@@ -0,0 +1,66 @@
1
+ import { PiInstallError } from "./errors.js";
2
+ import { createFileExclusiveChecked } from '@vibesdotdev/filesystem';
3
+ import { CapabilityError, settle } from '@vibesdotdev/kernel';
4
+ import { readPiText } from "../../../harness/runtime.js";
5
+ /** Snapshot before mutation; rollback attempted targets in reverse order, preserving every failure. */
6
+ export async function applyPiChanges(fs, changes) {
7
+ const prior = await Promise.all(changes.map(async (change) => ({ change, content: await readPiText(fs, change.path) })));
8
+ const attempted = [];
9
+ const applied = await settle(async () => {
10
+ for (const entry of prior) {
11
+ if (entry.content === entry.change.content)
12
+ continue;
13
+ attempted.push(entry);
14
+ if (entry.change.content === undefined)
15
+ await fs.remove(entry.change.path);
16
+ else
17
+ await publish(fs, entry.change);
18
+ }
19
+ });
20
+ if (applied.ok)
21
+ return;
22
+ const failures = [];
23
+ for (const entry of attempted.reverse()) {
24
+ const restored = await settle(async () => {
25
+ if (entry.content === undefined) {
26
+ if (await fs.exists(entry.change.path))
27
+ await fs.remove(entry.change.path);
28
+ }
29
+ else
30
+ await publish(fs, { path: entry.change.path, content: entry.content });
31
+ });
32
+ if (!restored.ok)
33
+ failures.push(new CapabilityError('A Pi install target could not be restored.', 'UNAVAILABLE', {
34
+ reason: 'pi-rollback-failed', cause: restored.cause
35
+ }));
36
+ }
37
+ throw new PiInstallError('Pi installation failed; inspect rollback diagnostics before retrying.', {
38
+ reason: 'pi-install-write-failed', rollbackErrors: failures.map(failure => failure.message),
39
+ cause: failures.length ? new AggregateError([applied.cause, ...failures], 'Pi installation and rollback failed', { cause: applied.cause }) : applied.cause
40
+ });
41
+ }
42
+ async function publish(fs, change) {
43
+ if (change.content === undefined)
44
+ return;
45
+ const content = change.content;
46
+ await fs.mkdir(fs.dirname(change.path), { recursive: true });
47
+ const temporary = change.path + '.' + crypto.randomUUID() + '.tmp';
48
+ if (!await createFileExclusiveChecked(fs, temporary, content, 'utf8'))
49
+ throw new CapabilityError('A Pi installation temporary file already exists.', 'CONFLICT', { reason: 'pi-install-temp-conflict' });
50
+ const published = await settle(async () => {
51
+ if (change.mode !== undefined)
52
+ await fs.writeFile(temporary, content, { encoding: 'utf8', mode: change.mode });
53
+ await fs.rename(temporary, change.path);
54
+ });
55
+ if (published.ok)
56
+ return;
57
+ const cleaned = await settle(async () => { if (await fs.exists(temporary))
58
+ await fs.remove(temporary); });
59
+ if (!cleaned.ok)
60
+ throw new CapabilityError('A Pi write and temporary-file cleanup failed.', 'UNAVAILABLE', {
61
+ reason: 'pi-install-cleanup-failed',
62
+ cause: new AggregateError([published.cause, cleaned.cause], 'Pi temporary cleanup failed', { cause: published.cause })
63
+ });
64
+ throw published.cause;
65
+ }
66
+ //# sourceMappingURL=transaction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transaction.js","sourceRoot":"","sources":["../../../../src/external/pi/installers/transaction.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Pi agent — mcporter / ACP bridge profile; MCP via agent pack + guide preset.
3
+ */
4
+ import { type ExternalHostManifest } from '@vibesdotdev/external';
5
+ export declare const piManifest: ExternalHostManifest;
6
+ //# sourceMappingURL=manifest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../../src/external/pi/manifest.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAkB,KAAK,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAElF,eAAO,MAAM,UAAU,EAAE,oBAqFvB,CAAC"}
@@ -0,0 +1,91 @@
1
+ /**
2
+ * Pi agent — mcporter / ACP bridge profile; MCP via agent pack + guide preset.
3
+ */
4
+ import { createManifest } from '@vibesdotdev/external';
5
+ export const piManifest = createManifest({
6
+ id: 'pi',
7
+ name: 'Pi',
8
+ shortName: 'pi',
9
+ description: 'Pi coding agent — MCP via mcporter bridge; ACP-hosted agent pack profile',
10
+ category: 'cli',
11
+ website: 'https://github.com/badlogic/pi-mono',
12
+ platforms: ['darwin', 'linux'],
13
+ configs: [
14
+ {
15
+ path: '${HOME}/.pi/agent/settings.json',
16
+ format: 'json',
17
+ scope: 'global'
18
+ },
19
+ {
20
+ path: '${CWD}/.pi/settings.json',
21
+ format: 'json',
22
+ scope: 'project'
23
+ }
24
+ ],
25
+ assets: {
26
+ plugins: '.pi/extensions',
27
+ settings: '.pi/settings.json'
28
+ },
29
+ mcp: {
30
+ supported: false,
31
+ transports: [],
32
+ defaultServerName: 'vibes'
33
+ },
34
+ hooks: { supported: false, events: [] },
35
+ plugins: {
36
+ supported: true,
37
+ format: 'typescript',
38
+ entryPoint: 'index.ts'
39
+ },
40
+ detection: {
41
+ command: 'pi',
42
+ versionArgs: ['--version'],
43
+ configDir: '${HOME}/.pi/agent'
44
+ },
45
+ integration: {
46
+ plugins: {
47
+ installer: './installers/extension.ts'
48
+ },
49
+ presets: {
50
+ available: ['pi-vibes-mcporter-guide', 'pi-vibes-deep'],
51
+ default: 'pi-vibes-deep'
52
+ }
53
+ },
54
+ version: '1.0.0',
55
+ launch: {
56
+ defaultMode: 'headless',
57
+ modes: {
58
+ headless: {
59
+ command: 'pi',
60
+ stdin: 'null',
61
+ argv: [
62
+ '-p',
63
+ '--mode',
64
+ 'json',
65
+ { when: 'model', args: ['--model', '${model}'] },
66
+ '${prompt}'
67
+ ]
68
+ },
69
+ 'headless-print': {
70
+ command: 'pi',
71
+ stdin: 'null',
72
+ argv: [
73
+ { when: 'model', args: ['--model', '${model}'] },
74
+ '--thinking',
75
+ 'high',
76
+ '--approve',
77
+ '--no-session',
78
+ '--mode',
79
+ 'json',
80
+ '--print',
81
+ '${prompt}'
82
+ ]
83
+ }
84
+ }
85
+ },
86
+ metadata: {
87
+ agentPackProfile: 'acp-hosted',
88
+ mcpBridge: 'mcporter'
89
+ }
90
+ });
91
+ //# sourceMappingURL=manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../../src/external/pi/manifest.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,cAAc,EAA6B,MAAM,uBAAuB,CAAC;AAElF,MAAM,CAAC,MAAM,UAAU,GAAyB,cAAc,CAAC;IAC9D,EAAE,EAAE,IAAI;IACR,IAAI,EAAE,IAAI;IACV,SAAS,EAAE,IAAI;IACf,WAAW,EAAE,0EAA0E;IACvF,QAAQ,EAAE,KAAK;IACf,OAAO,EAAE,qCAAqC;IAC9C,SAAS,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC9B,OAAO,EAAE;QACR;YACC,IAAI,EAAE,iCAAiC;YACvC,MAAM,EAAE,MAAM;YACd,KAAK,EAAE,QAAQ;SACf;QACD;YACC,IAAI,EAAE,0BAA0B;YAChC,MAAM,EAAE,MAAM;YACd,KAAK,EAAE,SAAS;SAChB;KACD;IACD,MAAM,EAAE;QACP,OAAO,EAAE,gBAAgB;QACzB,QAAQ,EAAE,mBAAmB;KAC7B;IACD,GAAG,EAAE;QACJ,SAAS,EAAE,KAAK;QAChB,UAAU,EAAE,EAAE;QACd,iBAAiB,EAAE,OAAO;KAC1B;IACD,KAAK,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE;IACvC,OAAO,EAAE;QACR,SAAS,EAAE,IAAI;QACf,MAAM,EAAE,YAAY;QACpB,UAAU,EAAE,UAAU;KACtB;IACD,SAAS,EAAE;QACV,OAAO,EAAE,IAAI;QACb,WAAW,EAAE,CAAC,WAAW,CAAC;QAC1B,SAAS,EAAE,mBAAmB;KAC9B;IACD,WAAW,EAAE;QACZ,OAAO,EAAE;YACR,SAAS,EAAE,2BAA2B;SACtC;QACD,OAAO,EAAE;YACR,SAAS,EAAE,CAAC,yBAAyB,EAAE,eAAe,CAAC;YACvD,OAAO,EAAE,eAAe;SACxB;KACD;IACD,OAAO,EAAE,OAAO;IAChB,MAAM,EAAE;QACP,WAAW,EAAE,UAAU;QACvB,KAAK,EAAE;YACN,QAAQ,EAAE;gBACT,OAAO,EAAE,IAAI;gBACb,KAAK,EAAE,MAAM;gBACb,IAAI,EAAE;oBACL,IAAI;oBACJ,QAAQ;oBACR,MAAM;oBACN,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,SAAS,EAAE,UAAU,CAAC,EAAE;oBAChD,WAAW;iBACX;aACD;YACD,gBAAgB,EAAE;gBACjB,OAAO,EAAE,IAAI;gBACb,KAAK,EAAE,MAAM;gBACb,IAAI,EAAE;oBACL,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,SAAS,EAAE,UAAU,CAAC,EAAE;oBAChD,YAAY;oBACZ,MAAM;oBACN,WAAW;oBACX,cAAc;oBACd,QAAQ;oBACR,MAAM;oBACN,SAAS;oBACT,WAAW;iBACX;aACD;SACD;KACD;IACD,QAAQ,EAAE;QACT,gBAAgB,EAAE,YAAY;QAC9B,SAAS,EAAE,UAAU;KACrB;CACD,CAAC,CAAC"}