@sentropic/h2a 0.98.6 → 0.98.7-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 (158) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/.codex-plugin/plugin.json +1 -1
  3. package/dist/cli-command-map.d.ts.map +1 -1
  4. package/dist/cli-command-map.js +1 -0
  5. package/dist/cli-command-map.js.map +1 -1
  6. package/dist/cli-contract.js +2 -2
  7. package/dist/cli-contract.js.map +1 -1
  8. package/dist/cli.d.ts.map +1 -1
  9. package/dist/cli.js +224 -16
  10. package/dist/cli.js.map +1 -1
  11. package/dist/hosts/agy.js +1 -1
  12. package/dist/hosts/agy.js.map +1 -1
  13. package/dist/hosts/installation-doctor.d.ts +1 -0
  14. package/dist/hosts/installation-doctor.d.ts.map +1 -1
  15. package/dist/hosts/installation-doctor.js +1 -1
  16. package/dist/hosts/installation-doctor.js.map +1 -1
  17. package/dist/hosts/muse.d.ts.map +1 -1
  18. package/dist/hosts/muse.js +2 -4
  19. package/dist/hosts/muse.js.map +1 -1
  20. package/dist/hosts/native-artifacts.d.ts +33 -0
  21. package/dist/hosts/native-artifacts.d.ts.map +1 -0
  22. package/dist/hosts/native-artifacts.js +104 -0
  23. package/dist/hosts/native-artifacts.js.map +1 -0
  24. package/dist/hosts/native-catalog.d.ts +19 -0
  25. package/dist/hosts/native-catalog.d.ts.map +1 -0
  26. package/dist/hosts/native-catalog.js +14 -0
  27. package/dist/hosts/native-catalog.js.map +1 -0
  28. package/dist/hosts/native-convergence.d.ts +132 -0
  29. package/dist/hosts/native-convergence.d.ts.map +1 -0
  30. package/dist/hosts/native-convergence.js +86 -0
  31. package/dist/hosts/native-convergence.js.map +1 -0
  32. package/dist/hosts/native-files.d.ts +40 -0
  33. package/dist/hosts/native-files.d.ts.map +1 -0
  34. package/dist/hosts/native-files.js +131 -0
  35. package/dist/hosts/native-files.js.map +1 -0
  36. package/dist/hosts/native-inspection.d.ts +31 -0
  37. package/dist/hosts/native-inspection.d.ts.map +1 -0
  38. package/dist/hosts/native-inspection.js +79 -0
  39. package/dist/hosts/native-inspection.js.map +1 -0
  40. package/dist/hosts/native-paths.d.ts +11 -0
  41. package/dist/hosts/native-paths.d.ts.map +1 -0
  42. package/dist/hosts/native-paths.js +21 -0
  43. package/dist/hosts/native-paths.js.map +1 -0
  44. package/dist/hosts/native-proof.d.ts +32 -0
  45. package/dist/hosts/native-proof.d.ts.map +1 -0
  46. package/dist/hosts/native-proof.js +31 -0
  47. package/dist/hosts/native-proof.js.map +1 -0
  48. package/dist/hosts/native-runtime-record.d.ts +3 -0
  49. package/dist/hosts/native-runtime-record.d.ts.map +1 -0
  50. package/dist/hosts/native-runtime-record.js +60 -0
  51. package/dist/hosts/native-runtime-record.js.map +1 -0
  52. package/dist/hosts/native-skills.d.ts +24 -0
  53. package/dist/hosts/native-skills.d.ts.map +1 -0
  54. package/dist/hosts/native-skills.js +56 -0
  55. package/dist/hosts/native-skills.js.map +1 -0
  56. package/dist/hosts/native-toml.d.ts +18 -0
  57. package/dist/hosts/native-toml.d.ts.map +1 -0
  58. package/dist/hosts/native-toml.js +91 -0
  59. package/dist/hosts/native-toml.js.map +1 -0
  60. package/dist/hosts/operator-notices.d.ts +3 -0
  61. package/dist/hosts/operator-notices.d.ts.map +1 -0
  62. package/dist/hosts/operator-notices.js +31 -0
  63. package/dist/hosts/operator-notices.js.map +1 -0
  64. package/dist/hosts/plugin.d.ts.map +1 -1
  65. package/dist/hosts/plugin.js +3 -2
  66. package/dist/hosts/plugin.js.map +1 -1
  67. package/dist/hosts/upgrade-equipment.d.ts +42 -0
  68. package/dist/hosts/upgrade-equipment.d.ts.map +1 -0
  69. package/dist/hosts/upgrade-equipment.js +26 -0
  70. package/dist/hosts/upgrade-equipment.js.map +1 -0
  71. package/dist/hosts/vibe-discovery.d.ts +12 -0
  72. package/dist/hosts/vibe-discovery.d.ts.map +1 -0
  73. package/dist/hosts/vibe-discovery.js +33 -0
  74. package/dist/hosts/vibe-discovery.js.map +1 -0
  75. package/dist/hosts/vibe-equipment.d.ts +71 -0
  76. package/dist/hosts/vibe-equipment.d.ts.map +1 -0
  77. package/dist/hosts/vibe-equipment.js +162 -0
  78. package/dist/hosts/vibe-equipment.js.map +1 -0
  79. package/dist/hosts/vibe-mcp.d.ts +32 -0
  80. package/dist/hosts/vibe-mcp.d.ts.map +1 -0
  81. package/dist/hosts/vibe-mcp.js +210 -0
  82. package/dist/hosts/vibe-mcp.js.map +1 -0
  83. package/dist/hosts/vibe.d.ts +12 -3
  84. package/dist/hosts/vibe.d.ts.map +1 -1
  85. package/dist/hosts/vibe.js +15 -7
  86. package/dist/hosts/vibe.js.map +1 -1
  87. package/dist/index.d.ts +1 -1
  88. package/dist/index.d.ts.map +1 -1
  89. package/dist/index.js +1 -1
  90. package/dist/index.js.map +1 -1
  91. package/dist/runtime/live/contracts.d.ts +55 -0
  92. package/dist/runtime/live/contracts.d.ts.map +1 -0
  93. package/dist/runtime/live/contracts.js +59 -0
  94. package/dist/runtime/live/contracts.js.map +1 -0
  95. package/dist/runtime/local-files/identity-fence.d.ts.map +1 -1
  96. package/dist/runtime/local-files/identity-fence.js +2 -0
  97. package/dist/runtime/local-files/identity-fence.js.map +1 -1
  98. package/dist/runtime/local-files/orphan-gc.d.ts +3 -0
  99. package/dist/runtime/local-files/orphan-gc.d.ts.map +1 -0
  100. package/dist/runtime/local-files/orphan-gc.js +69 -0
  101. package/dist/runtime/local-files/orphan-gc.js.map +1 -0
  102. package/dist/runtime/local-files/presence.d.ts +5 -2
  103. package/dist/runtime/local-files/presence.d.ts.map +1 -1
  104. package/dist/runtime/local-files/presence.js +32 -29
  105. package/dist/runtime/local-files/presence.js.map +1 -1
  106. package/dist/runtime/local-files/recipient-hints.d.ts +10 -0
  107. package/dist/runtime/local-files/recipient-hints.d.ts.map +1 -0
  108. package/dist/runtime/local-files/recipient-hints.js +156 -0
  109. package/dist/runtime/local-files/recipient-hints.js.map +1 -0
  110. package/dist/runtime/mcp/handlers.d.ts +1 -0
  111. package/dist/runtime/mcp/handlers.d.ts.map +1 -1
  112. package/dist/runtime/mcp/handlers.js +7 -4
  113. package/dist/runtime/mcp/handlers.js.map +1 -1
  114. package/dist/runtime/mcp/notifications.d.ts +2 -1
  115. package/dist/runtime/mcp/notifications.d.ts.map +1 -1
  116. package/dist/runtime/mcp/notifications.js +16 -2
  117. package/dist/runtime/mcp/notifications.js.map +1 -1
  118. package/dist/runtime/mcp/server.d.ts +3 -0
  119. package/dist/runtime/mcp/server.d.ts.map +1 -1
  120. package/dist/runtime/mcp/server.js +19 -6
  121. package/dist/runtime/mcp/server.js.map +1 -1
  122. package/dist/runtime/mcp/sessions.d.ts +6 -6
  123. package/dist/runtime/mcp/sessions.d.ts.map +1 -1
  124. package/dist/runtime/mcp/sessions.js +18 -6
  125. package/dist/runtime/mcp/sessions.js.map +1 -1
  126. package/dist/runtime/mcp/stdio.d.ts.map +1 -1
  127. package/dist/runtime/mcp/stdio.js +11 -0
  128. package/dist/runtime/mcp/stdio.js.map +1 -1
  129. package/dist/runtime/mcp/tools.js +1 -1
  130. package/dist/runtime/mcp/tools.js.map +1 -1
  131. package/dist/runtime/send.d.ts +10 -0
  132. package/dist/runtime/send.d.ts.map +1 -1
  133. package/dist/runtime/send.js +80 -5
  134. package/dist/runtime/send.js.map +1 -1
  135. package/dist/runtime/upgrade/index.d.ts +1 -0
  136. package/dist/runtime/upgrade/index.d.ts.map +1 -1
  137. package/dist/runtime/upgrade/index.js +1 -0
  138. package/dist/runtime/upgrade/index.js.map +1 -1
  139. package/dist/vendor/engram-live/contracts.d.ts +208 -0
  140. package/dist/vendor/engram-live/contracts.js +558 -0
  141. package/fixtures/native-host-catalog.json +1 -0
  142. package/fixtures/native-host-history.json +1261 -0
  143. package/fixtures/native-host-renderers.json +1 -0
  144. package/hooks/deny-manual-h2a-cli.mjs +38 -0
  145. package/hooks/hooks.json +17 -0
  146. package/hooks/vibe-post-agent.mjs +29 -0
  147. package/hooks/vibe-pre-tool.mjs +40 -0
  148. package/package.json +9 -6
  149. package/scripts/qualification-budget.mjs +56 -0
  150. package/scripts/qualification-cleanup.mjs +15 -0
  151. package/scripts/qualification-oracles.mjs +44 -0
  152. package/scripts/qualification-patch.mjs +21 -0
  153. package/scripts/qualification-poll-hosts.mjs +19 -0
  154. package/scripts/qualification-probe.mjs +63 -0
  155. package/scripts/qualification-rpc.mjs +59 -0
  156. package/scripts/qualification-vibe.mjs +159 -0
  157. package/scripts/qualify-host.mjs +143 -0
  158. package/skills/h2a/SKILL.md +6 -2
@@ -0,0 +1,79 @@
1
+ import { accessSync, constants, lstatSync, statSync } from 'node:fs';
2
+ import { delimiter, join } from 'node:path';
3
+ import { digest, snapshot } from './native-files.js';
4
+ import { parseNativeToml } from './native-toml.js';
5
+ import { MISSING_VIBE_MCP, nativeRoot, REGISTRY_WAITING, stateRoot, VIBE_LIFECYCLE_SCOPE, VIBE_RESTART } from './native-paths.js';
6
+ export function nativeCliPresent(host) {
7
+ return (process.env.PATH ?? '').split(delimiter).some(dir => {
8
+ try {
9
+ accessSync(join(dir, host), constants.X_OK);
10
+ return statSync(join(dir, host)).isFile();
11
+ }
12
+ catch (e) {
13
+ if (!['ENOENT', 'ENOTDIR'].includes(e.code ?? ''))
14
+ throw e;
15
+ return false;
16
+ }
17
+ });
18
+ }
19
+ export function inspectNativeHost(host, root = nativeRoot(host)) {
20
+ let rootPresent = false;
21
+ try {
22
+ rootPresent = lstatSync(root).isDirectory();
23
+ }
24
+ catch (e) {
25
+ if (e.code !== 'ENOENT')
26
+ throw e;
27
+ }
28
+ // Shared Gemini files are never evidence of an Antigravity installation.
29
+ const detected = host === 'agy' ? nativeCliPresent('agy') : rootPresent || nativeCliPresent(host);
30
+ const configPath = join(root, host === 'vibe' ? 'config.toml' : host === 'agy' ? 'config/mcp_config.json' : 'settings.json');
31
+ const configFile = snapshot(configPath);
32
+ const config = configFile ? host === 'vibe' ? parseNativeToml(configFile.bytes.toString()) : JSON.parse(configFile.bytes.toString()) : {};
33
+ if (!config || typeof config !== 'object' || Array.isArray(config))
34
+ throw new Error(`incompatible configuration: ${configPath}`);
35
+ const servers = host === 'vibe' ? config.mcp_servers ?? [] : Object.entries(config.mcpServers ?? {}).map(([name, value]) => ({ name, ...value }));
36
+ if (!Array.isArray(servers))
37
+ throw new Error(`incompatible MCP collection: ${configPath}`);
38
+ // Only a Vibe-valid enabled entry counts: the Pydantic union is
39
+ // discriminated on `transport` (no default), so an entry without a valid
40
+ // transport crashes vibe at startup and must read as absent; a disabled
41
+ // entry exposes no tool and must read as absent too.
42
+ const h2aServers = servers.filter(server => {
43
+ if (!server || typeof server !== 'object')
44
+ return false;
45
+ const entry = server;
46
+ if (!(entry.name === 'h2a' || Array.isArray(entry.args) && entry.args.includes('mcp-serve')))
47
+ return false;
48
+ if (entry.disabled === true)
49
+ return false;
50
+ if (typeof entry.url === 'string')
51
+ return entry.transport === 'streamable-http' || entry.transport === 'http';
52
+ return entry.transport === 'stdio';
53
+ });
54
+ const disabled = config.disabled_tools ?? [];
55
+ const hidden = Array.isArray(disabled) && disabled.some(name => ['*', 'h2a_*', 'mcp_h2a_*'].includes(name));
56
+ const mcpAvailable = h2aServers.length > 0 && !hidden;
57
+ let importStatus = 'pending';
58
+ if (host === 'agy') {
59
+ try {
60
+ const observed = JSON.parse(snapshot(join(stateRoot(host, root), 'import-observation.json'))?.bytes.toString() ?? '{}');
61
+ const shared = snapshot(join(root, '.h2a-install-agy/shared-owner.json'));
62
+ if (observed.schema === 1 && observed.root === root && shared && observed.sharedManifestHash === digest(shared.bytes) && ['observed-success', 'failed'].includes(observed.status))
63
+ importStatus = observed.status;
64
+ }
65
+ catch { /* A malformed observation is never proof of import. */ }
66
+ }
67
+ return {
68
+ host, root, state: stateRoot(host, root), detected, configPath, config, h2aServers, mcpAvailable,
69
+ migration: h2aServers.length ? 'voie directe — non migrée' : REGISTRY_WAITING,
70
+ bootstrap: 'Interface R5/R7 non livrée; aucun reçu de production reconnu',
71
+ registryDiagnostic: host === 'vibe' && !mcpAvailable ? MISSING_VIBE_MCP : undefined,
72
+ installationRoute: host === 'vibe' && !mcpAvailable ? 'Voie directe intérimaire disponible : h2a host setup --host vibe --write (dérogation transitoire O7.2, migration R5/R7 attendue) ; bootstrap B attendu pour la voie registre.' : undefined,
73
+ restart: host === 'vibe' ? VIBE_RESTART : 'Restart the host after changing its native components.',
74
+ lifecycleScope: host === 'vibe' ? VIBE_LIFECYCLE_SCOPE : 'Aucune surface native de hooks vérifiée; M-B reste le critère de clôture.',
75
+ import: host === 'agy' ? { status: importStatus, commands: ['agy plugin import gemini', 'agy plugin enable h2a'], sharedGeminiEffect: true } : undefined,
76
+ filters: { enabled: config.enabled_skills ?? [], disabled: config.disabled_skills ?? [], skillPaths: config.skill_paths ?? [], disabledTools: disabled, enabledTools: config.enabled_tools ?? [] }
77
+ };
78
+ }
79
+ //# sourceMappingURL=native-inspection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native-inspection.js","sourceRoot":"","sources":["../../src/hosts/native-inspection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export declare const NATIVE_HOSTS: readonly ["vibe", "muse", "agy"];
2
+ export type NativeHost = typeof NATIVE_HOSTS[number];
3
+ export declare const isNativeHost: (host: string) => host is NativeHost;
4
+ export declare function vibeHome(home?: string, env?: NodeJS.ProcessEnv): string;
5
+ export declare function nativeRoot(host: NativeHost, home?: string): string;
6
+ export declare function stateRoot(host: NativeHost, root?: string): string;
7
+ export declare const REGISTRY_WAITING = "non migr\u00E9 \u2014 bootstrap registre attendu";
8
+ export declare const MISSING_VIBE_MCP = "Skills install\u00E9es, outils MCP absents \u2014 bootstrap registre attendu";
9
+ export declare const VIBE_RESTART = "Nouvelle session ou reprise propre (session au repos, journal vide). Une reprise apr\u00E8s interruption conserve les anciens bindings.";
10
+ export declare const VIBE_LIFECYCLE_SCOPE: string;
11
+ //# sourceMappingURL=native-paths.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native-paths.d.ts","sourceRoot":"","sources":["../../src/hosts/native-paths.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,YAAY,kCAAmC,CAAC;AAC7D,MAAM,MAAM,UAAU,GAAG,OAAO,YAAY,CAAC,MAAM,CAAC,CAAC;AACrD,eAAO,MAAM,YAAY,GAAI,MAAM,MAAM,KAAG,IAAI,IAAI,UAAuD,CAAC;AAC5G,wBAAgB,QAAQ,CAAC,IAAI,SAAY,EAAE,GAAG,oBAAc,GAAG,MAAM,CAGpE;AACD,wBAAgB,UAAU,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,SAAY,GAAG,MAAM,CAErE;AACD,wBAAgB,SAAS,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,SAAmB,GAAG,MAAM,CAE3E;AACD,eAAO,MAAM,gBAAgB,qDAA2C,CAAC;AACzE,eAAO,MAAM,gBAAgB,iFAAuE,CAAC;AACrG,eAAO,MAAM,YAAY,4IAAuI,CAAC;AACjK,eAAO,MAAM,oBAAoB,QAE6H,CAAC"}
@@ -0,0 +1,21 @@
1
+ import { homedir } from 'node:os';
2
+ import { isAbsolute, join, resolve } from 'node:path';
3
+ export const NATIVE_HOSTS = ['vibe', 'muse', 'agy'];
4
+ export const isNativeHost = (host) => NATIVE_HOSTS.includes(host);
5
+ export function vibeHome(home = homedir(), env = process.env) {
6
+ const root = env.VIBE_HOME?.trim() || join(home, '.vibe');
7
+ return resolve(root === '~' ? home : root.startsWith('~/') ? join(home, root.slice(2)) : root);
8
+ }
9
+ export function nativeRoot(host, home = homedir()) {
10
+ return host === 'vibe' ? vibeHome(home) : host === 'muse' ? join(home, '.config/muse') : join(home, '.gemini');
11
+ }
12
+ export function stateRoot(host, root = nativeRoot(host)) {
13
+ return join(root, host === 'agy' ? '.h2a-install-agy' : '.h2a-install');
14
+ }
15
+ export const REGISTRY_WAITING = 'non migré — bootstrap registre attendu';
16
+ export const MISSING_VIBE_MCP = 'Skills installées, outils MCP absents — bootstrap registre attendu';
17
+ export const VIBE_RESTART = 'Nouvelle session ou reprise propre (session au repos, journal vide). Une reprise après interruption conserve les anciens bindings.';
18
+ export const VIBE_LIFECYCLE_SCOPE = 'Profil dédié à une seule session parente non forkée, sans isolation automatique démontrée. ' +
19
+ 'Sous-agent ou fork: aucun record. /branch et fork ACP: copie inactive dès sa reprise; session/fork attache la copie par défaut dès sa création. ' +
20
+ 'L’origine continue d’enregistrer. vibe -c peut reprendre la copie la plus récente; utiliser vibe --resume <id-origine> ou une nouvelle session non forkée.';
21
+ //# sourceMappingURL=native-paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native-paths.js","sourceRoot":"","sources":["../../src/hosts/native-paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACtD,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAU,CAAC;AAE7D,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,IAAY,EAAsB,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAkB,CAAC,CAAC;AAC5G,MAAM,UAAU,QAAQ,CAAC,IAAI,GAAG,OAAO,EAAE,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG;IAC1D,MAAM,IAAI,GAAG,GAAG,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC1D,OAAO,OAAO,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AACjG,CAAC;AACD,MAAM,UAAU,UAAU,CAAC,IAAgB,EAAE,IAAI,GAAG,OAAO,EAAE;IAC3D,OAAO,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;AACjH,CAAC;AACD,MAAM,UAAU,SAAS,CAAC,IAAgB,EAAE,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC;IACjE,OAAO,IAAI,CAAC,IAAI,EAAE,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC;AAC1E,CAAC;AACD,MAAM,CAAC,MAAM,gBAAgB,GAAG,wCAAwC,CAAC;AACzE,MAAM,CAAC,MAAM,gBAAgB,GAAG,oEAAoE,CAAC;AACrG,MAAM,CAAC,MAAM,YAAY,GAAG,oIAAoI,CAAC;AACjK,MAAM,CAAC,MAAM,oBAAoB,GAAG,6FAA6F;IAC/H,kJAAkJ;IAClJ,4JAA4J,CAAC"}
@@ -0,0 +1,32 @@
1
+ export declare const PROOF_COMPONENTS: readonly ["skills", "guard", "lifecycle", "MCP", "context"];
2
+ export type ProofComponent = typeof PROOF_COMPONENTS[number];
3
+ export interface NativeQualification {
4
+ schema: 1;
5
+ host: string;
6
+ root: string;
7
+ fixture: boolean;
8
+ recordedAt: string;
9
+ runtime: {
10
+ distribution: 'mistral-vibe' | 'muse' | 'agy';
11
+ version: string;
12
+ recordSha256: string;
13
+ recordPath: string;
14
+ metadataPath: string;
15
+ generatedFiles?: Record<string, string>;
16
+ };
17
+ components: Partial<Record<ProofComponent, {
18
+ status: 'qualified' | 'partial' | 'failed';
19
+ dependencies: Record<string, string>;
20
+ evidence: string[];
21
+ evidenceHashes: Record<string, string>;
22
+ scope: string;
23
+ }>>;
24
+ }
25
+ export declare function inspectNativeQualification(state: string, host: string, root: string, observed: Record<string, string>): {
26
+ status: string;
27
+ components: Record<"skills" | "guard" | "lifecycle" | "MCP" | "context", string>;
28
+ guardEligible: boolean;
29
+ };
30
+ export declare function mcpFingerprint(config: Record<string, unknown>): string;
31
+ export declare function fileFingerprint(path: string): string;
32
+ //# sourceMappingURL=native-proof.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native-proof.d.ts","sourceRoot":"","sources":["../../src/hosts/native-proof.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,gBAAgB,6DAA8D,CAAC;AAC5F,MAAM,MAAM,cAAc,GAAG,OAAO,gBAAgB,CAAC,MAAM,CAAC,CAAC;AAC7D,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,CAAC,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAC5E,OAAO,EAAE;QAAE,YAAY,EAAE,cAAc,GAAG,MAAM,GAAG,KAAK,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,CAAC;IACrL,UAAU,EAAE,OAAO,CAAC,MAAM,CAAC,cAAc,EAAE;QAAE,MAAM,EAAE,WAAW,GAAG,SAAS,GAAG,QAAQ,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAAC,QAAQ,EAAE,MAAM,EAAE,CAAC;QAAC,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC,CAAC;CAC9M;AACD,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;;;;EAoBrH;AACD,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAmC;AAC1G,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAuD"}
@@ -0,0 +1,31 @@
1
+ import { join } from 'node:path';
2
+ import { digest, snapshot } from './native-files.js';
3
+ import { semanticDigest } from './native-toml.js';
4
+ import { verifyRuntimeRecord } from './native-runtime-record.js';
5
+ export const PROOF_COMPONENTS = ['skills', 'guard', 'lifecycle', 'MCP', 'context'];
6
+ export function inspectNativeQualification(state, host, root, observed) {
7
+ const file = snapshot(join(state, 'qualification.json'));
8
+ const components = Object.fromEntries(PROOF_COMPONENTS.map(c => [c, 'absent']));
9
+ if (!file)
10
+ return { status: 'absent', components, guardEligible: false };
11
+ const proof = JSON.parse(file.bytes.toString());
12
+ if (proof.schema !== 1 || proof.host !== host || proof.root !== root || typeof proof.fixture !== 'boolean' || !Number.isFinite(Date.parse(proof.recordedAt)) || !proof.components || !proof.runtime?.recordPath || !proof.runtime.metadataPath)
13
+ return { status: 'incompatible', components, guardEligible: false };
14
+ const metadata = snapshot(proof.runtime.metadataPath)?.bytes.toString() ?? '';
15
+ const runtimeCurrent = fileFingerprint(proof.runtime.recordPath) === proof.runtime.recordSha256 && verifyRuntimeRecord(proof.runtime.recordPath, proof.runtime.generatedFiles) && /^Version: ([^\r\n]+)$/m.exec(metadata)?.[1] === proof.runtime.version &&
16
+ (host !== 'vibe' || proof.runtime.distribution === 'mistral-vibe' && /Name: mistral[-_]vibe/i.test(metadata));
17
+ for (const component of PROOF_COMPONENTS) {
18
+ const result = proof.components[component];
19
+ if (!result)
20
+ continue;
21
+ const evidenceCurrent = Array.isArray(result.evidence) && result.evidence.length > 0 && result.evidence.every(path => !!snapshot(path) && result.evidenceHashes?.[path] === fileFingerprint(path));
22
+ const fresh = runtimeCurrent && evidenceCurrent && result.dependencies && Object.keys(result.dependencies).length > 0 && Object.entries(result.dependencies).every(([name, hash]) => observed[name] === hash);
23
+ components[component] = proof.fixture ? 'fixture-only' : !fresh ? 'obsolete' : result.status;
24
+ }
25
+ const mcp = proof.components.MCP;
26
+ const guardEligible = components.MCP === 'qualified' && !!mcp?.evidence?.length && ['MCP', 'profile', 'entrypoint', 'node'].every(k => !!mcp.dependencies[k]);
27
+ return { status: proof.fixture ? 'fixture-only' : Object.values(components).every(s => s === 'qualified') ? 'qualified' : 'partial', components, guardEligible };
28
+ }
29
+ export function mcpFingerprint(config) { return semanticDigest(config); }
30
+ export function fileFingerprint(path) { return digest(snapshot(path)?.bytes ?? 'missing'); }
31
+ //# sourceMappingURL=native-proof.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native-proof.js","sourceRoot":"","sources":["../../src/hosts/native-proof.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,CAAU,CAAC;AAO5F,MAAM,UAAU,0BAA0B,CAAC,KAAa,EAAE,IAAY,EAAE,IAAY,EAAE,QAAgC;IACpH,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,oBAAoB,CAAC,CAAC,CAAC;IACzD,MAAM,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAmC,CAAC;IAClH,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC;IACzE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAwB,CAAC;IACvE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI,IAAI,OAAO,KAAK,CAAC,OAAO,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,UAAU,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,YAAY;QAC5O,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,UAAU,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC;IACtE,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC;IAC9E,MAAM,cAAc,GAAG,eAAe,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,KAAK,CAAC,OAAO,CAAC,YAAY,IAAI,mBAAmB,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,wBAAwB,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,OAAO,CAAC,OAAO;QACtP,CAAC,IAAI,KAAK,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,YAAY,KAAK,cAAc,IAAI,wBAAwB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;IAChH,KAAK,MAAM,SAAS,IAAI,gBAAgB,EAAE,CAAC;QACzC,MAAM,MAAM,GAAG,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QAC3C,IAAI,CAAC,MAAM;YAAE,SAAS;QACtB,MAAM,eAAe,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,cAAc,EAAE,CAAC,IAAI,CAAC,KAAK,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC;QACnM,MAAM,KAAK,GAAG,cAAc,IAAI,eAAe,IAAI,MAAM,CAAC,YAAY,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC;QAC9M,UAAU,CAAC,SAAS,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC;IAC/F,CAAC;IACD,MAAM,GAAG,GAAG,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC;IACjC,MAAM,aAAa,GAAG,UAAU,CAAC,GAAG,KAAK,WAAW,IAAI,CAAC,CAAC,GAAG,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9J,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,EAAE,UAAU,EAAE,aAAa,EAAE,CAAC;AACnK,CAAC;AACD,MAAM,UAAU,cAAc,CAAC,MAA+B,IAAY,OAAO,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AAC1G,MAAM,UAAU,eAAe,CAAC,IAAY,IAAY,OAAO,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,IAAI,SAAS,CAAC,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare function captureRuntimeGeneratedFiles(recordPath: string): Record<string, string>;
2
+ export declare function verifyRuntimeRecord(recordPath: string, generated?: Record<string, string>): boolean;
3
+ //# sourceMappingURL=native-runtime-record.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native-runtime-record.d.ts","sourceRoot":"","sources":["../../src/hosts/native-runtime-record.ts"],"names":[],"mappings":"AAmBA,wBAAgB,4BAA4B,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAGvF;AACD,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,GAAG,OAAO,CAWvG"}
@@ -0,0 +1,60 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { dirname, isAbsolute, resolve } from 'node:path';
3
+ import { digest, snapshot } from './native-files.js';
4
+ // Wheel RECORD is CSV. Never execute an interpreter to inspect a distribution.
5
+ function recordRows(recordPath) {
6
+ const source = snapshot(recordPath)?.bytes.toString();
7
+ if (!source)
8
+ return [];
9
+ const rows = [];
10
+ let row = [], cell = '', quoted = false;
11
+ for (let i = 0; i < source.length; i++) {
12
+ const c = source[i];
13
+ if (c === '"') {
14
+ if (quoted && source[i + 1] === '"') {
15
+ cell += '"';
16
+ i++;
17
+ }
18
+ else
19
+ quoted = !quoted;
20
+ }
21
+ else if (!quoted && (c === ',' || c === '\n')) {
22
+ row.push(cell.replace(/\r$/, ''));
23
+ cell = '';
24
+ if (c === '\n') {
25
+ rows.push(row);
26
+ row = [];
27
+ }
28
+ }
29
+ else
30
+ cell += c;
31
+ }
32
+ if (quoted)
33
+ return [];
34
+ if (cell || row.length) {
35
+ row.push(cell);
36
+ rows.push(row);
37
+ }
38
+ return rows;
39
+ }
40
+ export function captureRuntimeGeneratedFiles(recordPath) {
41
+ return Object.fromEntries(recordRows(recordPath).filter(([path, hash, size]) => /^(?:vibe|mistralai_vibe_local_harness)\/(?:[^/]+\/)*__pycache__\/[^/]+\.pyc$/.test(path) && hash === '' && size === '')
42
+ .map(([path]) => [path, digest(snapshot(resolve(dirname(dirname(recordPath)), path))?.bytes ?? 'missing')]));
43
+ }
44
+ export function verifyRuntimeRecord(recordPath, generated = {}) {
45
+ const rows = recordRows(recordPath), base = dirname(dirname(recordPath));
46
+ const relevant = rows.filter(([path]) => /^(?:vibe|mistralai_vibe_local_harness)\//.test(path));
47
+ if (!relevant.length)
48
+ return false;
49
+ return relevant.every(([path, hash, size]) => {
50
+ if (isAbsolute(path) || path.split('/').includes('..'))
51
+ return false;
52
+ if (hash === '' && size === '' && /\/__pycache__\/[^/]+\.pyc$/.test(path))
53
+ return generated[path] === digest(snapshot(resolve(base, path))?.bytes ?? 'missing');
54
+ if (!hash?.startsWith('sha256='))
55
+ return false;
56
+ const bytes = snapshot(resolve(base, path))?.bytes;
57
+ return !!bytes && String(bytes.length) === size && createHash('sha256').update(bytes).digest('base64url') === hash.slice(7);
58
+ });
59
+ }
60
+ //# sourceMappingURL=native-runtime-record.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native-runtime-record.js","sourceRoot":"","sources":["../../src/hosts/native-runtime-record.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import type { NativeArtifact } from './native-artifacts.js';
2
+ export interface NativeSkill {
3
+ installName: string;
4
+ raw: string;
5
+ source: string;
6
+ resourceDir: string;
7
+ parsed: {
8
+ name: string;
9
+ description: string;
10
+ body: string;
11
+ };
12
+ }
13
+ export declare function nativeSkillArtifacts(options: {
14
+ host: string;
15
+ root: string;
16
+ version: string;
17
+ skills: readonly NativeSkill[];
18
+ enabled?: readonly string[];
19
+ disabled?: readonly string[];
20
+ project?: boolean;
21
+ renderGemini: (skill: NativeSkill['parsed']) => string;
22
+ historicalHashes: (host: string, name: string) => readonly string[];
23
+ }): NativeArtifact[];
24
+ //# sourceMappingURL=native-skills.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native-skills.d.ts","sourceRoot":"","sources":["../../src/hosts/native-skills.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IACtE,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CAC7D;AACD,wBAAgB,oBAAoB,CAAC,OAAO,EAAE;IAC5C,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,SAAS,WAAW,EAAE,CAAC;IAC5E,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAAC,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC7E,YAAY,EAAE,CAAC,KAAK,EAAE,WAAW,CAAC,QAAQ,CAAC,KAAK,MAAM,CAAC;IACvD,gBAAgB,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,SAAS,MAAM,EAAE,CAAC;CACrE,GAAG,cAAc,EAAE,CAyCnB"}
@@ -0,0 +1,56 @@
1
+ import { existsSync, readdirSync, readFileSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { assertNativePath } from './native-files.js';
4
+ import { parseNativeToml } from './native-toml.js';
5
+ export function nativeSkillArtifacts(options) {
6
+ const result = [];
7
+ for (const skill of options.skills) {
8
+ if (!/^[a-z0-9][a-z0-9._-]*$/i.test(skill.installName))
9
+ throw new Error('unsafe skill name');
10
+ const selected = !options.disabled?.includes(skill.installName) && (!options.enabled?.length || options.enabled.includes(skill.installName));
11
+ const gemini = options.host === 'agy' || options.host === 'gemini';
12
+ const target = gemini ? join(options.root, 'commands', `${skill.installName}.toml`) : join(options.root, 'skills', skill.installName, 'SKILL.md');
13
+ const resources = gemini ? join(options.root, options.project ? 'skill-resources' : '.h2a-install/skill-resources', skill.source, options.version, skill.installName) : join(options.root, 'skills', skill.installName);
14
+ for (const reference of skill.raw.match(/\bassets\/[\w./-]+/g) ?? []) {
15
+ if (reference.split('/').includes('..') || !existsSync(join(skill.resourceDir, reference)))
16
+ throw new Error(`required skill resource missing: ${skill.installName}/${reference}`);
17
+ }
18
+ const walk = (dir, relative = '') => {
19
+ assertNativePath(dir);
20
+ for (const entry of readdirSync(dir, { withFileTypes: true })) {
21
+ if (entry.name === 'SKILL.md' && !relative)
22
+ continue;
23
+ const rel = join(relative, entry.name), path = join(dir, entry.name);
24
+ assertNativePath(path);
25
+ if (entry.isDirectory())
26
+ walk(path, rel);
27
+ else if (entry.isFile())
28
+ result.push({ path: join(resources, rel), bytes: readFileSync(path), source: `${skill.source}@${options.version}/${skill.installName}/${rel}`, selected });
29
+ else
30
+ throw new Error(`unsupported skill resource: ${path}`);
31
+ }
32
+ };
33
+ walk(skill.resourceDir);
34
+ let parsed = skill.parsed;
35
+ if (gemini)
36
+ parsed = { ...parsed, body: parsed.body.replace(/\bassets\//g, `${resources}/assets/`) };
37
+ let rendered = gemini ? options.renderGemini(parsed) : skill.raw;
38
+ if (gemini) {
39
+ const expected = `You are the ${parsed.name} custom command for Gemini CLI.\n\n${parsed.body}`;
40
+ try {
41
+ const value = parseNativeToml(rendered);
42
+ if (Object.keys(value).sort().join(',') !== 'description,prompt' || value.description !== parsed.description || value.prompt?.trimEnd() !== expected.trimEnd())
43
+ throw new Error('unsafe literal');
44
+ }
45
+ catch {
46
+ // Native resource paths can contain triple apostrophes. Keep the
47
+ // historical renderer/catalog intact; use a validated basic string.
48
+ rendered = `description = ${JSON.stringify(parsed.description)}\nprompt = ${JSON.stringify(expected)}\n`;
49
+ parseNativeToml(rendered);
50
+ }
51
+ }
52
+ result.push({ path: target, bytes: rendered, source: `${skill.source}@${options.version}/${skill.installName}`, selected, historical: options.historicalHashes(options.host, skill.installName) });
53
+ }
54
+ return result;
55
+ }
56
+ //# sourceMappingURL=native-skills.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native-skills.js","sourceRoot":"","sources":["../../src/hosts/native-skills.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { NativeManifest } from './native-files.js';
2
+ export type VibeHook = {
3
+ name: string;
4
+ type: string;
5
+ command: string;
6
+ timeout: number;
7
+ match?: string;
8
+ strict?: boolean;
9
+ };
10
+ export declare function parseNativeToml(text: string): Record<string, any>;
11
+ export declare const semanticDigest: (value: unknown) => string;
12
+ export declare function recoverNativeHooks(manifest: NativeManifest, pending: NativeManifest, text: string): void;
13
+ export declare function renderVibeHook(hook: VibeHook): string;
14
+ export declare function editVibeHooks(text: string, wanted: readonly VibeHook[], owned: Record<string, string>): {
15
+ text: string;
16
+ owned: Record<string, string>;
17
+ };
18
+ //# sourceMappingURL=native-toml.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native-toml.d.ts","sourceRoot":"","sources":["../../src/hosts/native-toml.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACxD,MAAM,MAAM,QAAQ,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAC1H,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAEjE;AAOD,eAAO,MAAM,cAAc,GAAI,OAAO,OAAO,KAAG,MAAkC,CAAC;AACnF,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,cAAc,EAAE,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAOxG;AACD,wBAAgB,cAAc,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,CAErD;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,QAAQ,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,CA4CvJ"}
@@ -0,0 +1,91 @@
1
+ import { getStaticTOMLValue, parseForESLint } from 'toml-eslint-parser';
2
+ import { digest } from './native-files.js';
3
+ export function parseNativeToml(text) {
4
+ return getStaticTOMLValue(parseForESLint(text, { tomlVersion: '1.0.0' }).ast);
5
+ }
6
+ const canonical = (value) => {
7
+ if (value instanceof Date)
8
+ return JSON.stringify(value.toISOString());
9
+ if (Array.isArray(value))
10
+ return '[' + value.map(canonical).join(',') + ']';
11
+ if (value && typeof value === 'object')
12
+ return '{' + Object.entries(value).sort(([a], [b]) => a.localeCompare(b)).map(([k, v]) => JSON.stringify(k) + ':' + canonical(v)).join(',') + '}';
13
+ return JSON.stringify(value);
14
+ };
15
+ export const semanticDigest = (value) => digest(canonical(value));
16
+ export function recoverNativeHooks(manifest, pending, text) {
17
+ const actual = parseNativeToml(text).hooks ?? [];
18
+ for (const hook of actual)
19
+ if (pending.hooks?.[hook.name] === semanticDigest(hook)) {
20
+ manifest.hooks = { ...manifest.hooks, [hook.name]: pending.hooks[hook.name] };
21
+ if (hook.name === 'sentropic-h2a-deny-manual-cli') {
22
+ manifest.guard = pending.guard;
23
+ manifest.guardBinding = pending.guardBinding;
24
+ }
25
+ }
26
+ if (pending.lifecycle)
27
+ manifest.lifecycle = { ...pending.lifecycle };
28
+ }
29
+ export function renderVibeHook(hook) {
30
+ return '[[hooks]]\n' + Object.entries(hook).map(([key, value]) => `${key} = ${JSON.stringify(value)}`).join('\n') + '\n';
31
+ }
32
+ // Use parser ranges, never a regex approximation of TOML or rendered-TOML validation.
33
+ export function editVibeHooks(text, wanted, owned) {
34
+ const ast = parseForESLint(text, { tomlVersion: '1.0.0' }).ast;
35
+ const value = getStaticTOMLValue(ast);
36
+ const hooks = value.hooks ?? [];
37
+ if (!Array.isArray(hooks))
38
+ throw new Error('incompatible hooks collection');
39
+ const nodes = ast.body[0].body;
40
+ const tables = nodes.filter(n => n.type === 'TOMLTable' && n.kind === 'array' && n.key.keys.length === 1 && getStaticTOMLValue(n.key.keys[0]) === 'hooks');
41
+ const assignment = nodes.find(n => n.type === 'TOMLKeyValue' && n.key.keys.length === 1 && getStaticTOMLValue(n.key.keys[0]) === 'hooks');
42
+ if (assignment && hooks.length)
43
+ throw new Error('nonempty inline hooks array cannot be safely edited');
44
+ const names = new Set([...Object.keys(owned), ...wanted.map(h => h.name)]);
45
+ const edits = [];
46
+ const nextOwned = {};
47
+ const seen = new Set();
48
+ for (let i = 0; i < hooks.length; i++) {
49
+ const hook = hooks[i];
50
+ if (!names.has(hook.name))
51
+ continue;
52
+ if (seen.has(hook.name))
53
+ throw new Error(`duplicate hook: ${hook.name}`);
54
+ seen.add(hook.name);
55
+ if (!owned[hook.name])
56
+ throw new Error(`unknown hook ownership: ${hook.name}`);
57
+ if (owned[hook.name] !== semanticDigest(hook))
58
+ throw new Error(`customized hook preserved: ${hook.name}`);
59
+ const desired = wanted.find(h => h.name === hook.name);
60
+ if (desired)
61
+ nextOwned[hook.name] = semanticDigest(desired);
62
+ if (!desired || semanticDigest(desired) !== semanticDigest(hook)) {
63
+ const node = tables[i];
64
+ if (!node)
65
+ throw new Error('unsupported hook table layout');
66
+ // Added blocks own their leading separator; keep unrelated trailing bytes.
67
+ const start = !desired && text[node.range[0] - 1] === '\n' ? node.range[0] - 1 : node.range[0];
68
+ const end = !desired && text[node.range[1]] === '\n' ? node.range[1] + 1 : node.range[1];
69
+ edits.push({ start, end, bytes: desired ? renderVibeHook(desired).trimEnd() : '' });
70
+ }
71
+ }
72
+ const additions = [];
73
+ for (const hook of wanted) {
74
+ nextOwned[hook.name] = semanticDigest(hook);
75
+ if (!seen.has(hook.name))
76
+ additions.push('\n' + renderVibeHook(hook));
77
+ }
78
+ if (additions.length)
79
+ edits.push({ start: text.length, end: text.length, bytes: additions.join('') });
80
+ if (assignment && wanted.length)
81
+ edits.push({ start: assignment.range[0], end: assignment.range[1], bytes: '' });
82
+ let rendered = text;
83
+ for (const edit of edits.sort((a, b) => b.start - a.start))
84
+ rendered = rendered.slice(0, edit.start) + edit.bytes + rendered.slice(edit.end);
85
+ const after = parseNativeToml(rendered);
86
+ const thirds = (v) => ({ ...v, hooks: (v.hooks ?? []).filter((h) => !names.has(h.name)) });
87
+ if (canonical(thirds(value)) !== canonical(thirds(after)))
88
+ throw new Error('third-party TOML changed');
89
+ return { text: rendered, owned: nextOwned };
90
+ }
91
+ //# sourceMappingURL=native-toml.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native-toml.js","sourceRoot":"","sources":["../../src/hosts/native-toml.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare const HOST_UPDATE_NOTICE = "Composants d\u2019h\u00F4tes \u00E0 actualiser : h2a doctor --repair";
2
+ export declare function captureHostOperatorNotices(): string[];
3
+ //# sourceMappingURL=operator-notices.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"operator-notices.d.ts","sourceRoot":"","sources":["../../src/hosts/operator-notices.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,kBAAkB,yEAA0D,CAAC;AAC1F,wBAAgB,0BAA0B,IAAI,MAAM,EAAE,CAerD"}
@@ -0,0 +1,31 @@
1
+ import { readFileSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { currentCliVersion } from '../runtime/upgrade/index.js';
4
+ import { NATIVE_HOSTS, nativeRoot, stateRoot } from './native-paths.js';
5
+ import { inspectNativeHost } from './native-inspection.js';
6
+ import { digest, readNativeManifest } from './native-files.js';
7
+ // Refresh outside tool calls; h2a_identity_status remains an in-memory read.
8
+ export const HOST_UPDATE_NOTICE = 'Composants d’hôtes à actualiser : h2a doctor --repair';
9
+ export function captureHostOperatorNotices() {
10
+ for (const host of NATIVE_HOSTS) {
11
+ try {
12
+ if (!inspectNativeHost(host).detected)
13
+ continue;
14
+ const root = nativeRoot(host);
15
+ const manifests = [readNativeManifest(stateRoot(host, root), host === 'agy' ? 'gemini-commands' : host, root, '', host === 'agy' ? 'shared-owner.json' : 'manifest.json')];
16
+ for (const manifest of manifests) {
17
+ if (manifest.version !== currentCliVersion())
18
+ return [HOST_UPDATE_NOTICE];
19
+ for (const [path, entry] of Object.entries(manifest.files ?? {})) {
20
+ if (entry.selected && digest(readFileSync(join(root, path))) !== entry.sha256)
21
+ return [HOST_UPDATE_NOTICE];
22
+ }
23
+ }
24
+ }
25
+ catch {
26
+ return [HOST_UPDATE_NOTICE];
27
+ }
28
+ }
29
+ return [];
30
+ }
31
+ //# sourceMappingURL=operator-notices.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"operator-notices.js","sourceRoot":"","sources":["../../src/hosts/operator-notices.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACxE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAC/D,6EAA6E;AAC7E,MAAM,CAAC,MAAM,kBAAkB,GAAG,uDAAuD,CAAC;AAC1F,MAAM,UAAU,0BAA0B;IACxC,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;QAChC,IAAI,CAAC;YACH,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,QAAQ;gBAAE,SAAS;YAChD,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;YAC9B,MAAM,SAAS,GAAG,CAAC,kBAAkB,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC;YAC3K,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;gBACnC,IAAI,QAAQ,CAAC,OAAO,KAAK,iBAAiB,EAAE;oBAAE,OAAO,CAAC,kBAAkB,CAAC,CAAC;gBAC1E,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE,CAAsD,EAAE,CAAC;oBACtH,IAAI,KAAK,CAAC,QAAQ,IAAI,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,MAAM;wBAAE,OAAO,CAAC,kBAAkB,CAAC,CAAC;gBAC7G,CAAC;YACD,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;QAAC,CAAC;IAC1C,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../src/hosts/plugin.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../src/hosts/plugin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAIH,MAAM,MAAM,sBAAsB,GAC9B,sBAAsB,GACtB,cAAc,GACd,kBAAkB,GAClB,iBAAiB,GACjB,cAAc,GACd,WAAW,GACX,YAAY,GACZ,iBAAiB,CAAC;AAEtB,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,gFAAgF;IAChF,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,SAAS,EAAE,sBAAsB,CAAC;IAC3C,yDAAyD;IACzD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,2EAA2E;IAC3E,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;CACxB;AAED,0FAA0F;AAC1F,eAAO,MAAM,uBAAuB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAiEjF,CAAC;AAEF,eAAO,MAAM,qBAAqB,UAAuC,CAAC;AAE1E,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,8FAA8F;IAC9F,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,sBAAsB,CAAC;IAC3C,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,uFAAuF;IACvF,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,oFAAoF;IACpF,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,oFAAoF;IACpF,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,qBAAqB,GAC7B,iBAAiB,GAAG,SAAS,CA0B/B;AAED,iDAAiD;AACjD,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC;QAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;QAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACvF;AAED,6EAA6E;AAC7E,MAAM,MAAM,iBAAiB,GAAG,oBAAoB,CAAC;AAErD;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,iBAAiB,CAErE;AAED;;;;GAIG;AACH,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,MAAM,GAAG,oBAAoB,CAEjF;AAED,8EAA8E;AAC9E,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAWvD;AAED,uEAAuE;AACvE,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAW7D;AAED;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,qBAAqB,iBAAiB,CAAC;AACpD,eAAO,MAAM,0BAA0B,cAAc,CAAC;AACtD,uEAAuE;AACvE,eAAO,MAAM,0BAA0B,uBAAuB,CAAC;AAE/D,sEAAsE;AACtE,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,oEAAoE;IACpE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED;;;;GAIG;AACH,MAAM,WAAW,8BAA8B;IAC7C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE;QAAE,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACrE,QAAQ,CAAC,MAAM,EAAE;QAAE,QAAQ,CAAC,YAAY,EAAE,WAAW,CAAC;QAAC,QAAQ,CAAC,cAAc,EAAE,YAAY,CAAA;KAAE,CAAC;IAC/F,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED,2EAA2E;AAC3E,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE;QAAE,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IACrD,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,8BAA8B,CAAC,CAAC;CACjE;AAED,oFAAoF;AACpF,wBAAgB,mBAAmB,CACjC,IAAI,GAAE,MAA8B,GACnC,sBAAsB,CASxB;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CACtC,IAAI,GAAE,MAA8B,EACpC,WAAW,GAAE,MAAmC,GAC/C,2BAA2B,CAa7B;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,wBAAwB,CACtC,cAAc,EAAE,MAAM,EACtB,IAAI,GAAE,MAA8B,EACpC,WAAW,GAAE,MAAmC,GAC/C,SAAS,MAAM,EAAE,CASnB"}
@@ -12,6 +12,7 @@
12
12
  * the one push gap). No host is privileged; agy is a first-class target here
13
13
  * (EVO-0), with a polling fallback instead of push.
14
14
  */
15
+ import { VIBE_LIFECYCLE_SCOPE, VIBE_RESTART } from './native-paths.js';
15
16
  /** The supported hosts, at parity (codex/claude/gemini/agy/hermes/muse/vibe/opencode). */
16
17
  export const H2A_HOST_PLUGIN_TARGETS = {
17
18
  claude: {
@@ -76,7 +77,7 @@ export const H2A_HOST_PLUGIN_TARGETS = {
76
77
  resumeCommand: "vibe -c",
77
78
  mechanism: "vibe-hooks",
78
79
  push: true,
79
- hint: "Register the record command as a `post_agent` hook in `~/.vibe/hooks.toml` ([[hooks]] name = \"h2a-drumbeat-record\", type = \"post_agent\", command = <record>). Vibe has no prompt-level hook, so the drive receive gate is not wired; poll `h2a drumbeat scan` / `h2a blockage list` as the fallback. Skills install to `~/.vibe/skills/h2a` via `h2a install-skills --host vibe`."
80
+ hint: "Use host plugin --host vibe --instance <id> --write <VIBE_HOME>/hooks.toml for the managed post_agent wrapper. drive receive: N-A. " + VIBE_LIFECYCLE_SCOPE + ' ' + VIBE_RESTART
80
81
  }
81
82
  };
82
83
  export const H2A_HOST_PLUGIN_HOSTS = Object.keys(H2A_HOST_PLUGIN_TARGETS);
@@ -106,7 +107,7 @@ export function renderStopHook(host, options) {
106
107
  push: target.push,
107
108
  hint: target.hint,
108
109
  record,
109
- receive,
110
+ receive: host === 'vibe' ? 'N-A' : receive,
110
111
  // Poll command for every host (agy and muse use it as their only path; the others
111
112
  // can use it as a manual fallback). Drumbeat scan + blockage list.
112
113
  poll: `h2a drumbeat scan${rootArg}`