@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.
- package/.claude-plugin/plugin.json +1 -1
- package/.codex-plugin/plugin.json +1 -1
- package/dist/cli-command-map.d.ts.map +1 -1
- package/dist/cli-command-map.js +1 -0
- package/dist/cli-command-map.js.map +1 -1
- package/dist/cli-contract.js +2 -2
- package/dist/cli-contract.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +224 -16
- package/dist/cli.js.map +1 -1
- package/dist/hosts/agy.js +1 -1
- package/dist/hosts/agy.js.map +1 -1
- package/dist/hosts/installation-doctor.d.ts +1 -0
- package/dist/hosts/installation-doctor.d.ts.map +1 -1
- package/dist/hosts/installation-doctor.js +1 -1
- package/dist/hosts/installation-doctor.js.map +1 -1
- package/dist/hosts/muse.d.ts.map +1 -1
- package/dist/hosts/muse.js +2 -4
- package/dist/hosts/muse.js.map +1 -1
- package/dist/hosts/native-artifacts.d.ts +33 -0
- package/dist/hosts/native-artifacts.d.ts.map +1 -0
- package/dist/hosts/native-artifacts.js +104 -0
- package/dist/hosts/native-artifacts.js.map +1 -0
- package/dist/hosts/native-catalog.d.ts +19 -0
- package/dist/hosts/native-catalog.d.ts.map +1 -0
- package/dist/hosts/native-catalog.js +14 -0
- package/dist/hosts/native-catalog.js.map +1 -0
- package/dist/hosts/native-convergence.d.ts +132 -0
- package/dist/hosts/native-convergence.d.ts.map +1 -0
- package/dist/hosts/native-convergence.js +86 -0
- package/dist/hosts/native-convergence.js.map +1 -0
- package/dist/hosts/native-files.d.ts +40 -0
- package/dist/hosts/native-files.d.ts.map +1 -0
- package/dist/hosts/native-files.js +131 -0
- package/dist/hosts/native-files.js.map +1 -0
- package/dist/hosts/native-inspection.d.ts +31 -0
- package/dist/hosts/native-inspection.d.ts.map +1 -0
- package/dist/hosts/native-inspection.js +79 -0
- package/dist/hosts/native-inspection.js.map +1 -0
- package/dist/hosts/native-paths.d.ts +11 -0
- package/dist/hosts/native-paths.d.ts.map +1 -0
- package/dist/hosts/native-paths.js +21 -0
- package/dist/hosts/native-paths.js.map +1 -0
- package/dist/hosts/native-proof.d.ts +32 -0
- package/dist/hosts/native-proof.d.ts.map +1 -0
- package/dist/hosts/native-proof.js +31 -0
- package/dist/hosts/native-proof.js.map +1 -0
- package/dist/hosts/native-runtime-record.d.ts +3 -0
- package/dist/hosts/native-runtime-record.d.ts.map +1 -0
- package/dist/hosts/native-runtime-record.js +60 -0
- package/dist/hosts/native-runtime-record.js.map +1 -0
- package/dist/hosts/native-skills.d.ts +24 -0
- package/dist/hosts/native-skills.d.ts.map +1 -0
- package/dist/hosts/native-skills.js +56 -0
- package/dist/hosts/native-skills.js.map +1 -0
- package/dist/hosts/native-toml.d.ts +18 -0
- package/dist/hosts/native-toml.d.ts.map +1 -0
- package/dist/hosts/native-toml.js +91 -0
- package/dist/hosts/native-toml.js.map +1 -0
- package/dist/hosts/operator-notices.d.ts +3 -0
- package/dist/hosts/operator-notices.d.ts.map +1 -0
- package/dist/hosts/operator-notices.js +31 -0
- package/dist/hosts/operator-notices.js.map +1 -0
- package/dist/hosts/plugin.d.ts.map +1 -1
- package/dist/hosts/plugin.js +3 -2
- package/dist/hosts/plugin.js.map +1 -1
- package/dist/hosts/upgrade-equipment.d.ts +42 -0
- package/dist/hosts/upgrade-equipment.d.ts.map +1 -0
- package/dist/hosts/upgrade-equipment.js +26 -0
- package/dist/hosts/upgrade-equipment.js.map +1 -0
- package/dist/hosts/vibe-discovery.d.ts +12 -0
- package/dist/hosts/vibe-discovery.d.ts.map +1 -0
- package/dist/hosts/vibe-discovery.js +33 -0
- package/dist/hosts/vibe-discovery.js.map +1 -0
- package/dist/hosts/vibe-equipment.d.ts +71 -0
- package/dist/hosts/vibe-equipment.d.ts.map +1 -0
- package/dist/hosts/vibe-equipment.js +162 -0
- package/dist/hosts/vibe-equipment.js.map +1 -0
- package/dist/hosts/vibe-mcp.d.ts +32 -0
- package/dist/hosts/vibe-mcp.d.ts.map +1 -0
- package/dist/hosts/vibe-mcp.js +210 -0
- package/dist/hosts/vibe-mcp.js.map +1 -0
- package/dist/hosts/vibe.d.ts +12 -3
- package/dist/hosts/vibe.d.ts.map +1 -1
- package/dist/hosts/vibe.js +15 -7
- package/dist/hosts/vibe.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/runtime/live/contracts.d.ts +55 -0
- package/dist/runtime/live/contracts.d.ts.map +1 -0
- package/dist/runtime/live/contracts.js +59 -0
- package/dist/runtime/live/contracts.js.map +1 -0
- package/dist/runtime/local-files/identity-fence.d.ts.map +1 -1
- package/dist/runtime/local-files/identity-fence.js +2 -0
- package/dist/runtime/local-files/identity-fence.js.map +1 -1
- package/dist/runtime/local-files/orphan-gc.d.ts +3 -0
- package/dist/runtime/local-files/orphan-gc.d.ts.map +1 -0
- package/dist/runtime/local-files/orphan-gc.js +69 -0
- package/dist/runtime/local-files/orphan-gc.js.map +1 -0
- package/dist/runtime/local-files/presence.d.ts +5 -2
- package/dist/runtime/local-files/presence.d.ts.map +1 -1
- package/dist/runtime/local-files/presence.js +32 -29
- package/dist/runtime/local-files/presence.js.map +1 -1
- package/dist/runtime/local-files/recipient-hints.d.ts +10 -0
- package/dist/runtime/local-files/recipient-hints.d.ts.map +1 -0
- package/dist/runtime/local-files/recipient-hints.js +156 -0
- package/dist/runtime/local-files/recipient-hints.js.map +1 -0
- package/dist/runtime/mcp/handlers.d.ts +1 -0
- package/dist/runtime/mcp/handlers.d.ts.map +1 -1
- package/dist/runtime/mcp/handlers.js +7 -4
- package/dist/runtime/mcp/handlers.js.map +1 -1
- package/dist/runtime/mcp/notifications.d.ts +2 -1
- package/dist/runtime/mcp/notifications.d.ts.map +1 -1
- package/dist/runtime/mcp/notifications.js +16 -2
- package/dist/runtime/mcp/notifications.js.map +1 -1
- package/dist/runtime/mcp/server.d.ts +3 -0
- package/dist/runtime/mcp/server.d.ts.map +1 -1
- package/dist/runtime/mcp/server.js +19 -6
- package/dist/runtime/mcp/server.js.map +1 -1
- package/dist/runtime/mcp/sessions.d.ts +6 -6
- package/dist/runtime/mcp/sessions.d.ts.map +1 -1
- package/dist/runtime/mcp/sessions.js +18 -6
- package/dist/runtime/mcp/sessions.js.map +1 -1
- package/dist/runtime/mcp/stdio.d.ts.map +1 -1
- package/dist/runtime/mcp/stdio.js +11 -0
- package/dist/runtime/mcp/stdio.js.map +1 -1
- package/dist/runtime/mcp/tools.js +1 -1
- package/dist/runtime/mcp/tools.js.map +1 -1
- package/dist/runtime/send.d.ts +10 -0
- package/dist/runtime/send.d.ts.map +1 -1
- package/dist/runtime/send.js +80 -5
- package/dist/runtime/send.js.map +1 -1
- package/dist/runtime/upgrade/index.d.ts +1 -0
- package/dist/runtime/upgrade/index.d.ts.map +1 -1
- package/dist/runtime/upgrade/index.js +1 -0
- package/dist/runtime/upgrade/index.js.map +1 -1
- package/dist/vendor/engram-live/contracts.d.ts +208 -0
- package/dist/vendor/engram-live/contracts.js +558 -0
- package/fixtures/native-host-catalog.json +1 -0
- package/fixtures/native-host-history.json +1261 -0
- package/fixtures/native-host-renderers.json +1 -0
- package/hooks/deny-manual-h2a-cli.mjs +38 -0
- package/hooks/hooks.json +17 -0
- package/hooks/vibe-post-agent.mjs +29 -0
- package/hooks/vibe-pre-tool.mjs +40 -0
- package/package.json +9 -6
- package/scripts/qualification-budget.mjs +56 -0
- package/scripts/qualification-cleanup.mjs +15 -0
- package/scripts/qualification-oracles.mjs +44 -0
- package/scripts/qualification-patch.mjs +21 -0
- package/scripts/qualification-poll-hosts.mjs +19 -0
- package/scripts/qualification-probe.mjs +63 -0
- package/scripts/qualification-rpc.mjs +59 -0
- package/scripts/qualification-vibe.mjs +159 -0
- package/scripts/qualify-host.mjs +143 -0
- 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 @@
|
|
|
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":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAErD,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAKnD,MAAM,UAAU,oBAAoB,CAAC,OAKpC;IACC,MAAM,MAAM,GAAqB,EAAE,CAAC;IACpC,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnC,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;QAC7F,MAAM,QAAQ,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,QAAQ,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC;QAC7I,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,KAAK,KAAK,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ,CAAC;QACnE,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,KAAK,CAAC,WAAW,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;QAClJ,MAAM,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,8BAA8B,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;QACxN,KAAK,MAAM,SAAS,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,qBAAqB,CAAC,IAAI,EAAE,EAAE,CAAC;YACrE,IAAI,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,oCAAoC,KAAK,CAAC,WAAW,IAAI,SAAS,EAAE,CAAC,CAAC;QACpL,CAAC;QACD,MAAM,IAAI,GAAG,CAAC,GAAW,EAAE,QAAQ,GAAG,EAAE,EAAE,EAAE;YAC1C,gBAAgB,CAAC,GAAG,CAAC,CAAC;YACtB,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;gBAC9D,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,IAAI,CAAC,QAAQ;oBAAE,SAAS;gBACrD,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;gBACrE,gBAAgB,CAAC,IAAI,CAAC,CAAC;gBACvB,IAAI,KAAK,CAAC,WAAW,EAAE;oBAAE,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;qBACpC,IAAI,KAAK,CAAC,MAAM,EAAE;oBAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,YAAY,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC,MAAM,IAAI,OAAO,CAAC,OAAO,IAAI,KAAK,CAAC,WAAW,IAAI,GAAG,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;;oBAC/K,MAAM,IAAI,KAAK,CAAC,+BAA+B,IAAI,EAAE,CAAC,CAAC;YAC9D,CAAC;QACH,CAAC,CAAC;QACF,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QACxB,IAAI,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;QAC1B,IAAI,MAAM;YAAE,MAAM,GAAG,EAAE,GAAG,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,GAAG,SAAS,UAAU,CAAC,EAAE,CAAC;QACrG,IAAI,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC;QACjE,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,QAAQ,GAAG,eAAe,MAAM,CAAC,IAAI,sCAAsC,MAAM,CAAC,IAAI,EAAE,CAAC;YAC/F,IAAI,CAAC;gBACH,MAAM,KAAK,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;gBACxC,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,oBAAoB,IAAI,KAAK,CAAC,WAAW,KAAK,MAAM,CAAC,WAAW,IAAI,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,QAAQ,CAAC,OAAO,EAAE;oBAAE,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC;YACpM,CAAC;YAAC,MAAM,CAAC;gBACP,iEAAiE;gBACjE,oEAAoE;gBACpE,QAAQ,GAAG,iBAAiB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,WAAW,CAAC,cAAc,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC;gBACzG,eAAe,CAAC,QAAQ,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC,MAAM,IAAI,OAAO,CAAC,OAAO,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,CAAC,gBAAgB,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;IACrM,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -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 @@
|
|
|
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":"AAAA;;;;;;;;;;;;;GAaG;
|
|
1
|
+
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../src/hosts/plugin.ts"],"names":[],"mappings":"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"}
|
package/dist/hosts/plugin.js
CHANGED
|
@@ -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: "
|
|
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}`
|