forkit-ai-footprints 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/PRIVACY.md +150 -0
- package/README.md +313 -0
- package/STATUS.md +136 -0
- package/dist/agents.d.ts +22 -0
- package/dist/agents.js +281 -0
- package/dist/aggregate.d.ts +28 -0
- package/dist/aggregate.js +151 -0
- package/dist/assets/forkit-icon-dark.png +0 -0
- package/dist/assets/forkit-icon-light.png +0 -0
- package/dist/bootstrap/Forkit AI Footprint.app/Contents/Info.plist +5 -0
- package/dist/bootstrap/Forkit AI Footprint.app/Contents/MacOS/Forkit AI Footprint +0 -0
- package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/ForkitAIFootprint.icns +0 -0
- package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/ForkitStatusTemplate.png +0 -0
- package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/agents.d.ts +22 -0
- package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/agents.js +281 -0
- package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/aggregate.d.ts +28 -0
- package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/aggregate.js +151 -0
- package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/assets/forkit-icon-dark.png +0 -0
- package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/assets/forkit-icon-light.png +0 -0
- package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/census.d.ts +3 -0
- package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/census.js +196 -0
- package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/cli.d.ts +32 -0
- package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/cli.js +404 -0
- package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/doctor.d.ts +14 -0
- package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/doctor.js +71 -0
- package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/endpoints.d.ts +8 -0
- package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/endpoints.js +45 -0
- package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/evaluate.d.ts +44 -0
- package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/evaluate.js +102 -0
- package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/filesystem.d.ts +11 -0
- package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/filesystem.js +226 -0
- package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/format.d.ts +7 -0
- package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/format.js +78 -0
- package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/hash.d.ts +4 -0
- package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/hash.js +16 -0
- package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/index.d.ts +22 -0
- package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/index.js +58 -0
- package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/insights.d.ts +13 -0
- package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/insights.js +76 -0
- package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/local-device.d.ts +19 -0
- package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/local-device.js +81 -0
- package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/locales.json +272 -0
- package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/localization.d.ts +277 -0
- package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/localization.js +55 -0
- package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/mcp.d.ts +9 -0
- package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/mcp.js +93 -0
- package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/monitor.d.ts +99 -0
- package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/monitor.js +285 -0
- package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/providers/base.d.ts +34 -0
- package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/providers/base.js +88 -0
- package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/providers/index.d.ts +6 -0
- package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/providers/index.js +24 -0
- package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/providers/lmstudio.d.ts +9 -0
- package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/providers/lmstudio.js +71 -0
- package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/providers/ollama.d.ts +12 -0
- package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/providers/ollama.js +171 -0
- package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/providers/openai-compatible.d.ts +10 -0
- package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/providers/openai-compatible.js +68 -0
- package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/resource-evidence.d.ts +17 -0
- package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/resource-evidence.js +52 -0
- package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/runtime-activity.d.ts +5 -0
- package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/runtime-activity.js +66 -0
- package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/runtime-identity.d.ts +7 -0
- package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/runtime-identity.js +66 -0
- package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/server.d.ts +21 -0
- package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/server.js +308 -0
- package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/share-page.d.ts +75 -0
- package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/share-page.js +167 -0
- package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/sharing.d.ts +35 -0
- package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/sharing.js +67 -0
- package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/tools.d.ts +9 -0
- package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/tools.js +106 -0
- package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/types.d.ts +166 -0
- package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/types.js +3 -0
- package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/version.d.ts +4 -0
- package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/dist/version.js +13 -0
- package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/node_modules/ps-list/index.d.ts +76 -0
- package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/node_modules/ps-list/index.js +366 -0
- package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/node_modules/ps-list/license +9 -0
- package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/node_modules/ps-list/package.json +44 -0
- package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/node_modules/ps-list/readme.md +56 -0
- package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/node_modules/ps-list/vendor/fastlist-0.3.0-x64.exe +0 -0
- package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/node_modules/ps-list/vendor/fastlist-0.3.0-x86.exe +0 -0
- package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/app/package.json +6 -0
- package/dist/bootstrap/Forkit AI Footprint.app/Contents/Resources/runtime/node +0 -0
- package/dist/bootstrap/Forkit AI Footprint.app/Contents/_CodeSignature/CodeResources +931 -0
- package/dist/census.d.ts +3 -0
- package/dist/census.js +196 -0
- package/dist/cli.d.ts +32 -0
- package/dist/cli.js +404 -0
- package/dist/doctor.d.ts +14 -0
- package/dist/doctor.js +71 -0
- package/dist/endpoints.d.ts +8 -0
- package/dist/endpoints.js +45 -0
- package/dist/evaluate.d.ts +44 -0
- package/dist/evaluate.js +102 -0
- package/dist/filesystem.d.ts +11 -0
- package/dist/filesystem.js +226 -0
- package/dist/format.d.ts +7 -0
- package/dist/format.js +78 -0
- package/dist/hash.d.ts +4 -0
- package/dist/hash.js +16 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.js +58 -0
- package/dist/insights.d.ts +13 -0
- package/dist/insights.js +76 -0
- package/dist/local-device.d.ts +19 -0
- package/dist/local-device.js +81 -0
- package/dist/locales.json +272 -0
- package/dist/localization.d.ts +277 -0
- package/dist/localization.js +55 -0
- package/dist/mcp.d.ts +9 -0
- package/dist/mcp.js +93 -0
- package/dist/monitor.d.ts +99 -0
- package/dist/monitor.js +285 -0
- package/dist/providers/base.d.ts +34 -0
- package/dist/providers/base.js +88 -0
- package/dist/providers/index.d.ts +6 -0
- package/dist/providers/index.js +24 -0
- package/dist/providers/lmstudio.d.ts +9 -0
- package/dist/providers/lmstudio.js +71 -0
- package/dist/providers/ollama.d.ts +12 -0
- package/dist/providers/ollama.js +171 -0
- package/dist/providers/openai-compatible.d.ts +10 -0
- package/dist/providers/openai-compatible.js +68 -0
- package/dist/resource-evidence.d.ts +17 -0
- package/dist/resource-evidence.js +52 -0
- package/dist/runtime-activity.d.ts +5 -0
- package/dist/runtime-activity.js +66 -0
- package/dist/runtime-identity.d.ts +7 -0
- package/dist/runtime-identity.js +66 -0
- package/dist/server.d.ts +21 -0
- package/dist/server.js +308 -0
- package/dist/share-page.d.ts +75 -0
- package/dist/share-page.js +167 -0
- package/dist/sharing.d.ts +35 -0
- package/dist/sharing.js +67 -0
- package/dist/tools.d.ts +9 -0
- package/dist/tools.js +106 -0
- package/dist/types.d.ts +166 -0
- package/dist/types.js +3 -0
- package/dist/version.d.ts +4 -0
- package/dist/version.js +13 -0
- package/docs/GLOBAL_DISTRIBUTION.md +79 -0
- package/docs/MACOS_ACCURACY_GATE.md +140 -0
- package/docs/MACOS_TESTER_GUIDE.md +88 -0
- package/examples/macos-truth.template.json +10 -0
- package/package.json +75 -0
- package/release/channels.json +41 -0
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.buildCensusShareSnapshot = buildCensusShareSnapshot;
|
|
7
|
+
exports.buildLocalScanView = buildLocalScanView;
|
|
8
|
+
exports.renderCensusSharePage = renderCensusSharePage;
|
|
9
|
+
const node_fs_1 = __importDefault(require("node:fs"));
|
|
10
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
11
|
+
const localization_1 = require("./localization");
|
|
12
|
+
function escapeHtml(value) {
|
|
13
|
+
return String(value).replaceAll('&', '&').replaceAll('<', '<').replaceAll('>', '>').replaceAll('"', '"').replaceAll("'", ''');
|
|
14
|
+
}
|
|
15
|
+
function safeScriptJson(value) { return JSON.stringify(value).replaceAll('<', '\\u003c'); }
|
|
16
|
+
function formatDecimalStorage(bytes) {
|
|
17
|
+
if (bytes <= 0)
|
|
18
|
+
return '0 B';
|
|
19
|
+
const units = ['B', 'KB', 'MB', 'GB', 'TB', 'PB'];
|
|
20
|
+
let value = bytes;
|
|
21
|
+
let unit = 0;
|
|
22
|
+
while (unit < units.length - 1 && value >= 1000) {
|
|
23
|
+
value /= 1000;
|
|
24
|
+
unit += 1;
|
|
25
|
+
}
|
|
26
|
+
return `${value.toFixed(value < 10 && unit > 1 ? 2 : value < 100 ? 1 : 0)} ${units[unit]}`;
|
|
27
|
+
}
|
|
28
|
+
function formatBinaryStorage(bytes) {
|
|
29
|
+
if (bytes <= 0)
|
|
30
|
+
return '0 B';
|
|
31
|
+
const units = ['B', 'KiB', 'MiB', 'GiB', 'TiB', 'PiB'];
|
|
32
|
+
let value = bytes;
|
|
33
|
+
let unit = 0;
|
|
34
|
+
while (unit < units.length - 1 && value >= 1024) {
|
|
35
|
+
value /= 1024;
|
|
36
|
+
unit += 1;
|
|
37
|
+
}
|
|
38
|
+
return `${value.toFixed(value < 10 && unit > 1 ? 2 : value < 100 ? 1 : 0)} ${units[unit]}`;
|
|
39
|
+
}
|
|
40
|
+
function validateRescanOptions(rescan) {
|
|
41
|
+
for (const value of [rescan.endpoint, rescan.monitor_start_endpoint, rescan.monitor_stop_endpoint, rescan.monitor_stream_endpoint, rescan.monitor_clear_endpoint, rescan.contribution_preview_endpoint, rescan.locale_endpoint]) {
|
|
42
|
+
if (!value.startsWith('/') || value.startsWith('//'))
|
|
43
|
+
throw new Error('INVALID_LOCAL_RESCAN_OPTIONS');
|
|
44
|
+
}
|
|
45
|
+
if (!/^[a-f0-9]{48}$/.test(rescan.session_token))
|
|
46
|
+
throw new Error('INVALID_LOCAL_RESCAN_OPTIONS');
|
|
47
|
+
}
|
|
48
|
+
function runtimeLabel(name) {
|
|
49
|
+
if (name === 'ollama')
|
|
50
|
+
return 'Ollama';
|
|
51
|
+
if (name === 'lmstudio')
|
|
52
|
+
return 'LM Studio';
|
|
53
|
+
if (name === 'openai-compatible')
|
|
54
|
+
return 'OpenAI-compatible';
|
|
55
|
+
return name;
|
|
56
|
+
}
|
|
57
|
+
function sourceLabel(model) {
|
|
58
|
+
if (model.runtime === 'ollama')
|
|
59
|
+
return 'Ollama';
|
|
60
|
+
if (model.runtime === 'lmstudio')
|
|
61
|
+
return 'LM Studio';
|
|
62
|
+
if (model.location_hint === 'huggingface-cache')
|
|
63
|
+
return 'Hugging Face cache';
|
|
64
|
+
return model.source === 'filesystem' ? 'Local model files' : runtimeLabel(model.runtime);
|
|
65
|
+
}
|
|
66
|
+
function iconDataUrl(file) {
|
|
67
|
+
try {
|
|
68
|
+
return `data:image/png;base64,${node_fs_1.default.readFileSync(node_path_1.default.join(__dirname, 'assets', file)).toString('base64')}`;
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
function buildCensusShareSnapshot(report) {
|
|
75
|
+
const decimal = formatDecimalStorage(report.summary.storage_bytes);
|
|
76
|
+
const binary = formatBinaryStorage(report.summary.storage_bytes);
|
|
77
|
+
return {
|
|
78
|
+
generated_date: new Intl.DateTimeFormat('en-US', { year: 'numeric', month: 'short', day: 'numeric', timeZone: 'UTC' }).format(new Date(report.generated_at)),
|
|
79
|
+
architecture_label: report.system.architecture === 'arm64' ? 'Apple Silicon' : report.system.architecture === 'x64' ? 'Intel Mac' : report.system.architecture,
|
|
80
|
+
model_record_count: report.summary.model_count,
|
|
81
|
+
verified_runtime_count: report.summary.available_runtime_count,
|
|
82
|
+
detected_agent_product_count: report.summary.agent_product_count,
|
|
83
|
+
detected_agent_process_count: report.summary.agent_process_count,
|
|
84
|
+
confirmed_running_model_count: report.summary.confirmed_running_model_count,
|
|
85
|
+
model_storage_bytes: report.summary.storage_bytes,
|
|
86
|
+
model_storage_decimal_display: decimal,
|
|
87
|
+
model_storage_binary_display: binary,
|
|
88
|
+
model_storage_display: decimal === binary ? decimal : `${decimal} · ${binary}`,
|
|
89
|
+
model_storage_file_count: report.summary.storage_file_count,
|
|
90
|
+
model_storage_complete: report.summary.storage_complete,
|
|
91
|
+
model_storage_measurement: report.summary.storage_measurement,
|
|
92
|
+
external_request_count: report.privacy.external_requests_made,
|
|
93
|
+
product_version: report.product_version,
|
|
94
|
+
node_major: report.system.node_major,
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
function buildLocalScanView(report) {
|
|
98
|
+
return {
|
|
99
|
+
...buildCensusShareSnapshot(report),
|
|
100
|
+
local_details: {
|
|
101
|
+
agents: report.agents.map((agent) => ({ name: agent.name, kind: agent.kind, process_count: agent.instance_count })),
|
|
102
|
+
runtimes: report.runtimes.filter((runtime) => runtime.name !== 'filesystem' && runtime.status === 'available').map((runtime) => ({
|
|
103
|
+
name: runtimeLabel(runtime.name), model_count: runtime.model_count,
|
|
104
|
+
loaded_model_count: report.models.filter((model) => model.runtime === runtime.name && model.evidence_status === 'confirmed-running').length,
|
|
105
|
+
})),
|
|
106
|
+
models: report.models.map((model) => ({ name: model.name, source: sourceLabel(model), loaded: model.evidence_status === 'confirmed-running' })),
|
|
107
|
+
tools: report.tools.map((tool) => ({ name: tool.name, status: tool.evidence_status })),
|
|
108
|
+
technical: {
|
|
109
|
+
runtime_probes: report.runtimes.filter((runtime) => runtime.name !== 'filesystem').map((runtime) => ({
|
|
110
|
+
name: runtimeLabel(runtime.name), state: runtime.evidence_status, error_code: runtime.error_code,
|
|
111
|
+
})),
|
|
112
|
+
warnings: report.warnings.map((warning) => ({ code: warning.code, message: warning.message })),
|
|
113
|
+
},
|
|
114
|
+
},
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
function renderCensusSharePage(report, options = {}) {
|
|
118
|
+
const snapshot = buildCensusShareSnapshot(report);
|
|
119
|
+
const rescan = options.rescan;
|
|
120
|
+
if (rescan)
|
|
121
|
+
validateRescanOptions(rescan);
|
|
122
|
+
const view = rescan ? buildLocalScanView(report) : null;
|
|
123
|
+
const locale = options.locale ?? 'en';
|
|
124
|
+
const t = (key, values = {}) => escapeHtml((0, localization_1.uiText)(locale, key, values));
|
|
125
|
+
const device = escapeHtml(options.localDeviceLabel ?? (locale === 'de' ? 'Dieses Gerät' : 'This device'));
|
|
126
|
+
const lightIcon = iconDataUrl('forkit-icon-light.png');
|
|
127
|
+
const darkIcon = iconDataUrl('forkit-icon-dark.png');
|
|
128
|
+
const brand = lightIcon ? `<picture><source media="(prefers-color-scheme:dark)" srcset="${darkIcon ?? lightIcon}"><img class="brand-icon" src="${lightIcon}" alt=""></picture>` : '<span class="brand-fallback">F</span>';
|
|
129
|
+
return `<!doctype html>
|
|
130
|
+
<html lang="${locale}"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><meta name="color-scheme" content="light dark"><title>Forkit AI Footprint</title>
|
|
131
|
+
<style>
|
|
132
|
+
:root{--bg:#f3eee5;--paper:rgba(255,253,248,.88);--ink:#282624;--muted:#716c64;--line:rgba(42,38,34,.13);--teal:#007f82;--teal2:#d8ecea;--orange:#df8c27;--green:#247f67;--idle:#d8d1c7;--shadow:0 24px 70px rgba(36,32,28,.08)}
|
|
133
|
+
@media(prefers-color-scheme:dark){:root{--bg:#171817;--paper:rgba(35,36,34,.92);--ink:#f2ecdf;--muted:#aaa49a;--line:rgba(242,236,223,.13);--teal:#67beb8;--teal2:#203b39;--orange:#e2af23;--green:#62b99e;--idle:#45423e;--shadow:0 24px 70px rgba(0,0,0,.25)}}
|
|
134
|
+
*{box-sizing:border-box}html{background:var(--bg)}body{margin:0;color:var(--ink);background:radial-gradient(circle at 0 0,rgba(223,140,39,.15),transparent 32rem),radial-gradient(circle at 100% 0,rgba(0,128,128,.14),transparent 34rem),var(--bg);font-family:Inter,ui-sans-serif,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif;-webkit-font-smoothing:antialiased}button,input{font:inherit}[hidden]{display:none!important}.shell{width:min(1040px,calc(100% - 36px));margin:auto;padding:22px 0 30px}.nav{display:flex;align-items:center;justify-content:space-between;margin-bottom:26px}.brand{display:flex;align-items:center;gap:10px;font-weight:830;letter-spacing:-.03em}.brand-icon,.brand-fallback{width:42px;height:42px;border-radius:11px;object-fit:contain}.brand-fallback{display:grid;place-items:center;color:#fff;background:linear-gradient(145deg,var(--teal),var(--orange))}.private{font-size:12px;color:var(--muted)}.private::before{content:'';display:inline-block;width:8px;height:8px;margin-right:8px;border-radius:50%;background:var(--green)}
|
|
135
|
+
.card{border:1px solid var(--line);border-radius:24px;background:var(--paper);box-shadow:var(--shadow);backdrop-filter:blur(18px)}.activity{padding:28px}.topline{display:flex;justify-content:space-between;gap:16px;align-items:start}.eyebrow{margin:0 0 9px;color:var(--teal);font-size:10px;font-weight:850;letter-spacing:.16em;text-transform:uppercase}h1,h2,h3,p{margin-top:0}.state-title{margin:0;font-size:clamp(33px,5vw,58px);line-height:.98;letter-spacing:-.055em}.state-copy{max-width:710px;margin:13px 0 0;color:var(--muted);font-size:13px;line-height:1.55}.badge{display:inline-flex;min-height:31px;align-items:center;padding:0 12px;border-radius:999px;background:var(--idle);font-size:10px;font-weight:850;white-space:nowrap}.badge.working{color:#fff;background:var(--green)}.metrics{display:grid;grid-template-columns:repeat(3,1fr);gap:10px;margin-top:23px}.metric{min-height:104px;padding:16px;border:1px solid var(--line);border-radius:17px;background:rgba(255,255,255,.18)}.metric-label{color:var(--muted);font-size:9px;font-weight:800;letter-spacing:.1em;text-transform:uppercase}.metric-value{margin-top:12px;font-size:26px;font-weight:820;letter-spacing:-.04em}.metric-note{margin-top:5px;color:var(--muted);font-size:9px;line-height:1.4}.context{display:flex;gap:20px;margin-top:15px;padding:12px 14px;border-radius:14px;background:var(--teal2);font-size:11px}.timeline{display:flex;height:13px;gap:2px;margin-top:18px;overflow:hidden;border-radius:999px;background:var(--idle)}.segment{min-width:4px;height:100%}.segment.working-now{background:var(--green)}.segment.open-idle{background:var(--orange)}.segment.not-running{background:var(--idle)}.legend{display:flex;gap:15px;margin-top:8px;color:var(--muted);font-size:9px}.legend i{display:inline-block;width:7px;height:7px;margin-right:5px;border-radius:50%}.legend .work{background:var(--green)}.legend .idle{background:var(--orange)}
|
|
136
|
+
.actions{display:flex;flex-wrap:wrap;gap:9px;margin-top:18px}.button{min-height:43px;padding:0 17px;border:1px solid var(--teal);border-radius:12px;color:#fff;background:var(--teal);font-weight:780;cursor:pointer}.button.secondary{border-color:var(--line);color:var(--ink);background:transparent}.button:disabled{cursor:not-allowed;opacity:.48}.grid{display:grid;grid-template-columns:1fr 1fr;gap:14px;margin-top:14px}.panel{padding:23px}.panel h2{margin-bottom:8px;font-size:24px;letter-spacing:-.04em}.panel-copy{color:var(--muted);font-size:11px;line-height:1.5}.insights{margin-top:14px}.insight-list{display:grid;grid-template-columns:repeat(3,1fr);gap:9px;margin:14px 0 0;padding:0;list-style:none}.insight-list li{min-height:86px;padding:15px;border:1px solid var(--line);border-radius:15px;font-size:14px;font-weight:720;line-height:1.4}.guess-row{display:grid;grid-template-columns:1fr auto;gap:8px;margin-top:16px}.guess-row input{min-height:44px;border:1px solid var(--line);border-radius:12px;padding:0 13px;color:var(--ink);background:transparent;font-weight:760}.footprint-metrics{display:grid;grid-template-columns:repeat(3,1fr);gap:9px;margin-top:16px}.footprint-metrics .metric{min-height:92px}.footprint-metrics .metric-value{font-size:22px}.detail-list{display:grid;gap:9px;margin:12px 0 0;padding:0;list-style:none}.detail-list li{font-size:10px;color:var(--muted);line-height:1.45}.detail-list strong{display:block;color:var(--ink);font-size:11px}.privacy{margin-top:14px;padding:18px 20px}.privacy summary{cursor:pointer;font-size:12px;font-weight:800}.detail-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:10px;margin-top:14px}.detail-box{padding:15px;border:1px solid var(--line);border-radius:15px}.detail-box h3{font-size:13px}.payload{max-height:220px;overflow:auto;padding:13px;border:1px solid var(--line);border-radius:12px;background:rgba(0,0,0,.05);font:10px/1.5 ui-monospace,SFMono-Regular,Menlo,monospace;white-space:pre-wrap;word-break:break-word}.footer{display:flex;justify-content:space-between;gap:20px;margin-top:20px;padding:0 4px;color:var(--muted);font-size:9px;line-height:1.5}
|
|
137
|
+
dialog{width:min(760px,calc(100% - 28px));border:0;border-radius:24px;padding:0;color:var(--ink);background:var(--paper);box-shadow:0 40px 100px rgba(0,0,0,.34)}dialog::backdrop{background:rgba(20,20,18,.62)}.dialog-body{padding:22px}.share-canvas{display:block;width:100%;height:auto;border-radius:16px}.share-actions{display:flex;gap:8px;flex-wrap:wrap;margin-top:12px}
|
|
138
|
+
@media(max-width:760px){.grid{grid-template-columns:1fr}.metrics{grid-template-columns:repeat(3,1fr)}.insight-list,.detail-grid{grid-template-columns:1fr}.topline{display:block}.badge{margin-top:14px}.footer{display:block}.footer span{display:block;margin-top:5px}}@media(max-width:440px){.shell{width:calc(100% - 20px)}.activity,.panel{padding:18px}.metrics,.footprint-metrics{grid-template-columns:1fr}.state-title{font-size:38px}.private{max-width:120px;text-align:right}}
|
|
139
|
+
</style></head><body><main class="shell">
|
|
140
|
+
<header class="nav"><div class="brand">${brand}<span>Forkit AI Footprint</span></div><div><button class="button secondary" id="locale-en" type="button" aria-pressed="${locale === 'en'}">EN</button> <button class="button secondary" id="locale-de" type="button" aria-pressed="${locale === 'de'}">DE</button></div><div class="private">${t('localDevice')}</div></header>
|
|
141
|
+
<section class="card activity"><div class="topline"><div><p class="eyebrow">${t('activityNow')}</p><h1 class="state-title" id="activity-title">${t('monitoringOff')}</h1><p class="state-copy" id="activity-copy">${t('startHelp')}</p></div><span class="badge" id="activity-badge">${t('stopped')}</span></div>
|
|
142
|
+
<div class="context" id="context" hidden><span id="chat-context"></span><span id="workspace-context"></span></div>
|
|
143
|
+
<div class="metrics"><div class="metric"><div class="metric-label">${t('observed')}</div><div class="metric-value" id="observed">0s</div><div class="metric-note">${t('validAwake')}</div></div><div class="metric"><div class="metric-label">${t('aiActive')}</div><div class="metric-value" id="active">0s</div><div class="metric-note">${t('supportedWork')}</div></div><div class="metric"><div class="metric-label">${t('activityRatio')}</div><div class="metric-value" id="ratio">—</div><div class="metric-note">${t('ratioNote')}</div></div></div>
|
|
144
|
+
<div class="timeline" id="timeline" aria-label="${t('activityNow')}"></div><div class="legend"><span><i class="work"></i>${t('working')}</span><span><i class="idle"></i>${t('openIdleLegend')}</span></div>
|
|
145
|
+
${rescan ? `<div class="actions"><button class="button" id="monitor-button" type="button">${t('startMonitoring')}</button><button class="button secondary" id="clear-button" type="button">${t('clearHistory')}</button></div>` : ''}</section>
|
|
146
|
+
<section class="card panel insights" id="insights"><p class="eyebrow" id="insight-eyebrow">${t('earlyObservation')}</p><h2 id="insight-heading">${t('earlyObservationCopy')}</h2><ul class="insight-list" id="insight-list"></ul></section>
|
|
147
|
+
<section class="card panel insights" id="compare-panel"><p class="eyebrow">${t('optionalComparison')}</p><h2 id="compare-title">${t('comparisonQuestion')}</h2><p class="panel-copy" id="compare-copy">${t('comparisonCopy')}</p><p class="panel-copy" id="compare-progress"></p><button class="button secondary" id="review-payload" type="button" disabled>${t('seeGlobal')}</button><div id="consent" hidden><p class="panel-copy"><strong>${t('reviewSharing')}</strong> ${t('payloadIntro')}</p><pre class="payload" id="payload"></pre><div class="actions"><button class="button" id="global-consent" type="button" disabled>${t('shareCompare')}</button><button class="button secondary" id="keep-local" type="button">${t('keepLocal')}</button></div><p class="panel-copy">${t('noIdentity')}</p></div><p class="panel-copy" id="global-result" hidden></p></section>
|
|
148
|
+
<section class="card panel insights"><p class="eyebrow">${t('footprint')}</p><div class="footprint-metrics"><div class="metric"><div class="metric-label">${t('modelRecordsLabel')}</div><div class="metric-value" id="models">${snapshot.model_record_count}</div><div class="metric-note" id="loaded">${snapshot.confirmed_running_model_count ? t('loaded', { count: snapshot.confirmed_running_model_count }) : ''}</div></div><div class="metric"><div class="metric-label">${t('modelStorage')}</div><div class="metric-value" id="storage">${escapeHtml(snapshot.model_storage_decimal_display)}</div><div class="metric-note" id="storage-note">${escapeHtml(snapshot.model_storage_binary_display)} · ${t('recognizedBytes')}</div></div><div class="metric"><div class="metric-label">${t('localEngines')}</div><div class="metric-value" id="engines">${snapshot.verified_runtime_count}</div><div class="metric-note">${t('verifiedAvailable')}</div></div></div><div class="actions"><button class="button" id="share-button" type="button">${t('createShare')}</button>${rescan ? `<button class="button secondary" id="scan-button" type="button">${t('scanAgain')}</button>` : ''}</div><p class="panel-copy" id="scan-status"></p></section>
|
|
149
|
+
${rescan ? `<details class="card privacy"><summary>${t('technical')}</summary><div class="detail-grid"><section class="detail-box" id="runtime-box"><h3>${t('engines')}</h3><ul class="detail-list" id="runtime-list"></ul></section><section class="detail-box" id="model-box"><h3>${t('modelsDevice')}</h3><ul class="detail-list" id="model-list"></ul></section><section class="detail-box" id="app-box"><h3>${t('appsTools')}</h3><ul class="detail-list" id="app-list"></ul></section><section class="detail-box"><h3>${t('measurementBoundary')}</h3><ul class="detail-list"><li><strong>${t('activityMeasurement')}</strong>${t('workingBoundary')}</li><li><strong>${t('storage')}</strong>${t('storageBoundary')}</li></ul></section><section class="detail-box"><h3>${t('forkitResources')}</h3><ul class="detail-list"><li><strong id="overhead">—</strong><span id="overhead-note">${t('measuredLocally')}</span></li></ul></section></div></details>` : ''}
|
|
150
|
+
<footer class="footer"><span>${device} · ${escapeHtml(snapshot.generated_date)} · ${escapeHtml(snapshot.architecture_label)}</span><span>${t('noPrivateFooter')}</span></footer></main>
|
|
151
|
+
<dialog id="share-dialog"><div class="dialog-body"><p class="eyebrow">${t('shareTitle')}</p><h2 id="share-heading">${t('shareHeading')}</h2><canvas class="share-canvas" id="share-canvas" width="1080" height="1080"></canvas><div class="share-actions"><button class="button" id="native-share">${t('share')}</button><button class="button secondary" id="download-share">${t('savePng')}</button><button class="button secondary" id="copy-image">${t('copyImage')}</button><button class="button secondary" id="copy-share">${t('copyCaption')}</button><button class="button secondary" id="close-share">${t('close')}</button></div><p class="panel-copy" id="share-status">${t('sharePrivacy')}</p></div></dialog>
|
|
152
|
+
<script>
|
|
153
|
+
const initial=${safeScriptJson(view ?? snapshot)},config=${rescan ? safeScriptJson(rescan) : 'null'},copy=${safeScriptJson(localization_1.UI_COPY[locale])},locale=${safeScriptJson(locale)},shareLogo=${safeScriptJson(lightIcon)};let footprint={...initial},monitor={lifecycle:'stopped',observed_seconds:0,active_seconds:0,activity_ratio:null,products:[],timeline:[],insights:[],overhead:{current_cpu_percent:null,current_memory_bytes:0,history_bytes:0,sample_count:0,median_cpu_percent:null,p95_cpu_percent:null,max_memory_bytes:0}};const $=id=>document.getElementById(id),text=(key,values={})=>Object.entries(values).reduce((v,[k,x])=>v.replaceAll('{'+k+'}',String(x)),copy[key]),localeTag=locale==='de'?'de-DE':'en-US',format=new Intl.NumberFormat(localeTag),seconds=n=>{const whole=Math.max(0,Math.floor(n));return whole<60?format.format(whole)+(locale==='de'?' Sek.':'s'):whole<3600?format.format(Math.floor(whole/60))+(locale==='de'?' Min. ':'m ')+format.format(whole%60)+(locale==='de'?' Sek.':'s'):format.format(Math.floor(whole/3600))+(locale==='de'?' Std. ':'h ')+format.format(Math.floor((whole%3600)/60))+(locale==='de'?' Min.':'m')},pct=n=>n===null?'—':format.format(Math.round(n*100))+' %',bytes=n=>n<1000000?format.format(Math.round(n/1000))+' KB':format.format(Number((n/1000000).toFixed(1)))+' MB',storage=(n,binary=false)=>{if(!n)return'0 B';const base=binary?1024:1000,units=binary?['B','KiB','MiB','GiB','TiB','PiB']:['B','KB','MB','GB','TB','PB'];let value=n,unit=0;while(unit<units.length-1&&value>=base){value/=base;unit++}const digits=value<10&&unit>1?2:value<100?1:0;return new Intl.NumberFormat(localeTag,{minimumFractionDigits:digits,maximumFractionDigits:digits}).format(value)+' '+units[unit]};
|
|
154
|
+
function auth(url,options={}){return fetch(url,{...options,method:options.method||'POST',headers:{...(options.headers||{}),'content-type':'application/json','x-forkit-footprints-session':config.session_token}})}function names(items){return items.map(item=>item.name)}function list(items){return new Intl.ListFormat(locale==='de'?'de-DE':'en-US',{style:'long',type:'conjunction'}).format(items)}function add(ul,title,detail){const li=document.createElement('li'),strong=document.createElement('strong');strong.textContent=title;li.append(strong,document.createTextNode(detail));ul.append(li)}
|
|
155
|
+
function renderMonitor(){const working=monitor.products.filter(p=>p.state==='working-now'),open=monitor.products.filter(p=>p.state==='open-idle'),badge=$('activity-badge');badge.className='badge';if(monitor.lifecycle==='stopped'){badge.textContent=text('stopped');$('activity-title').textContent=monitor.observed_seconds?text('monitoringStopped'):text('monitoringOff');$('activity-copy').textContent=monitor.observed_seconds?text('summaryPreserved'):text('startHelp');$('monitor-button')&&($('monitor-button').textContent=text('startMonitoring'))}else if(working.length){badge.textContent=text('workingNow');badge.classList.add('working');$('activity-title').textContent=list(names(working));$('activity-copy').textContent=text('workingEvidence');$('monitor-button')&&($('monitor-button').textContent=text('stopMonitoring'))}else if(open.length){badge.textContent=text('openIdle');$('activity-title').textContent=list(names(open));$('activity-copy').textContent=text('idleEvidence');$('monitor-button')&&($('monitor-button').textContent=text('stopMonitoring'))}else{badge.textContent=text('notRunning');$('activity-title').textContent=text('noApp');$('activity-copy').textContent=text('noAppHelp');$('monitor-button')&&($('monitor-button').textContent=text('stopMonitoring'))}
|
|
156
|
+
$('observed').textContent=seconds(monitor.observed_seconds);$('active').textContent=seconds(monitor.active_seconds);$('ratio').textContent=pct(monitor.activity_ratio);if($('overhead')){$('overhead').textContent=monitor.overhead.current_cpu_percent===null?text('warmingUp'):format.format(Number(monitor.overhead.current_cpu_percent.toFixed(1)))+' % CPU';$('overhead-note').textContent=bytes(monitor.overhead.current_memory_bytes)+' RAM · '+bytes(monitor.overhead.history_bytes)}const ctx=[...working,...open].find(p=>p.context&&(p.context.chat||p.context.workspace))?.context;$('context').hidden=!ctx;if(ctx){$('chat-context').textContent=ctx.chat?'Chat · '+ctx.chat:'';$('workspace-context').textContent=ctx.workspace?'Workspace · '+ctx.workspace:''}
|
|
157
|
+
const timeline=$('timeline');timeline.replaceChildren();const total=Math.max(1,monitor.timeline.reduce((n,s)=>n+Math.max(1,new Date(s.ended_at)-new Date(s.started_at)),0));for(const s of monitor.timeline){const el=document.createElement('span');el.className='segment '+s.state;el.style.flex=String(Math.max(1,new Date(s.ended_at)-new Date(s.started_at))/total);timeline.append(el)}const insightList=$('insight-list');insightList.replaceChildren();for(const value of monitor.insights||[]){const li=document.createElement('li');li.textContent=value;insightList.append(li)}const early=monitor.observed_seconds<60;$('insight-eyebrow').textContent=early?text('earlyObservation'):text('observation');$('insight-heading').textContent=early?text('earlyObservationCopy'):text('observationShows');insightList.hidden=early;$('review-payload').disabled=monitor.observed_seconds<600;const remaining=Math.max(0,600-monitor.observed_seconds);$('compare-progress').textContent=remaining?text('globalProgress',{remaining:seconds(remaining)}):''}
|
|
158
|
+
function renderDetails(){if(!config||!footprint.local_details)return;$('storage').textContent=storage(footprint.model_storage_bytes);$('storage-note').textContent=storage(footprint.model_storage_bytes,true)+' · '+text('recognizedBytes');const d=footprint.local_details,rl=$('runtime-list'),ml=$('model-list'),al=$('app-list'),loaded=d.models.filter(m=>m.loaded),onlineTools=d.tools.filter(t=>t.status==='online');for(const x of [rl,ml,al])x.replaceChildren();for(const r of d.runtimes)add(rl,r.name,r.loaded_model_count?text('modelsLoaded',{count:r.loaded_model_count,models:r.loaded_model_count===1?text('model'):text('models')}):text('verifiedAvailable'));for(const m of loaded)add(ml,m.name,text('loaded',{count:''}).trim());for(const a of d.agents)add(al,a.name,text('processActivity'));const seen=new Set(d.agents.map(a=>a.name));for(const tool of onlineTools.filter(v=>!seen.has(v.name)))add(al,tool.name,text('processActivity'));$('runtime-box').hidden=!d.runtimes.length;$('model-box').hidden=!loaded.length;$('app-box').hidden=!d.agents.length&&!onlineTools.length}
|
|
159
|
+
function activeToolNames(){return [...new Set(monitor.products.filter(p=>p.active_seconds>0).map(p=>p.name))]}function primaryInsight(){if(monitor.insights?.length)return monitor.insights[0];if(monitor.observed_seconds)return text('activeShareFallback',{ratio:pct(monitor.activity_ratio)});return text('footprintFallback',{count:footprint.model_record_count,records:footprint.model_record_count===1?text('modelRecord'):text('modelRecords')})}function shareCaption(){const first=text('captionFirst',{ratio:pct(monitor.activity_ratio)}),tools=activeToolNames(),details=[monitor.observed_seconds?text('shareActivity',{observed:seconds(monitor.observed_seconds),active:seconds(monitor.active_seconds),ratio:pct(monitor.activity_ratio)}):'',tools.length?text('shareTool',{tools:list(tools)}):'',text('shareModels',{count:footprint.model_record_count,models:footprint.model_record_count===1?text('model'):text('models'),storage:storage(footprint.model_storage_bytes)})].filter(Boolean).join(' ');return first+'\\n\\n'+details+'\\n\\n'+text('captionQuestion')+'\\n\\nforkit.dev/ai-footprint'}
|
|
160
|
+
function wrap(x,value,left,top,maxWidth,lineHeight,maxLines){const words=value.split(' '),lines=[];let line='';for(const word of words){const next=line?line+' '+word:word;if(x.measureText(next).width>maxWidth&&line){lines.push(line);line=word}else line=next}if(line)lines.push(line);for(let i=0;i<Math.min(lines.length,maxLines);i++)x.fillText(lines[i],left,top+i*lineHeight)}async function draw(){const c=$('share-canvas'),x=c.getContext('2d'),g=x.createLinearGradient(0,0,1080,1080);g.addColorStop(0,'#f6e7d6');g.addColorStop(.56,'#f3eee5');g.addColorStop(1,'#cce9e6');x.fillStyle=g;x.fillRect(0,0,1080,1080);x.fillStyle='rgba(255,253,248,.76)';x.beginPath();x.roundRect(42,42,996,996,38);x.fill();if(shareLogo){const image=await new Promise(resolve=>{const v=new Image();v.onload=()=>resolve(v);v.onerror=()=>resolve(null);v.src=shareLogo});if(image)x.drawImage(image,78,72,82,82)}x.fillStyle='#007f82';x.font='800 25px Inter,sans-serif';x.fillText(text('myFootprint'),78,205);const activity=monitor.observed_seconds?pct(monitor.activity_ratio):format.format(footprint.model_record_count);x.fillStyle='#282624';x.font='900 168px Inter,sans-serif';x.fillText(activity,72,405);x.fillStyle='#007f82';x.font='850 30px Inter,sans-serif';x.fillText(monitor.observed_seconds?text('shareActive'):text('localModels'),82,454);x.fillStyle='rgba(0,127,130,.11)';x.beginPath();x.roundRect(76,520,928,212,28);x.fill();const tools=activeToolNames(),toolValue=tools.length===1?tools[0]:tools.length?format.format(tools.length)+' '+text('activeTools').toLowerCase():'—';x.fillStyle='#716c64';x.font='800 18px Inter,sans-serif';x.fillText(tools.length===1?text('activeTool'):text('activeTools'),108,574);x.fillStyle='#282624';x.font='850 51px Inter,sans-serif';wrap(x,toolValue,108,643,400,54,1);x.fillStyle='#716c64';x.font='800 18px Inter,sans-serif';x.fillText(text('localModels'),570,574);x.fillStyle='#282624';x.font='850 51px Inter,sans-serif';x.fillText(format.format(footprint.model_record_count),570,643);x.strokeStyle='rgba(40,38,36,.12)';x.lineWidth=2;x.beginPath();x.moveTo(530,552);x.lineTo(530,700);x.stroke();x.fillStyle='#282624';x.font='750 29px Inter,sans-serif';wrap(x,text('deviceQuestion'),78,830,880,38,2);x.fillStyle='#716c64';x.font='600 20px Inter,sans-serif';x.fillText('forkit.dev/ai-footprint',78,946);x.textAlign='right';x.fillText(text('observedLocally'),1000,946);x.textAlign='left'}
|
|
161
|
+
for(const next of ['en','de'])$('locale-'+next).addEventListener('click',()=>{localStorage.setItem('forkit-footprints-locale',next);const url=new URL(location.href);url.searchParams.set('lang',next);location.href=url.href});const preferred=localStorage.getItem('forkit-footprints-locale');if(preferred&&preferred!==locale){const url=new URL(location.href);url.searchParams.set('lang',preferred);location.replace(url.href)}
|
|
162
|
+
const dialog=$('share-dialog');$('share-button').addEventListener('click',async()=>{$('share-heading').textContent=primaryInsight();await draw();dialog.showModal()});$('close-share').addEventListener('click',()=>dialog.close());async function blob(){await draw();return new Promise(resolve=>$('share-canvas').toBlob(resolve,'image/png'))}$('download-share').addEventListener('click',async()=>{const b=await blob();if(!b)return;const u=URL.createObjectURL(b),a=document.createElement('a');a.href=u;a.download='my-forkit-ai-footprint.png';a.click();setTimeout(()=>URL.revokeObjectURL(u),1000)});$('copy-share').addEventListener('click',async()=>{await navigator.clipboard.writeText(shareCaption());$('copy-share').textContent=text('copied')});$('copy-image').addEventListener('click',async()=>{const b=await blob();try{await navigator.clipboard.write([new ClipboardItem({'image/png':b})]);$('copy-image').textContent=text('copied')}catch{$('share-status').textContent=text('copyUnavailable')}});$('native-share').addEventListener('click',async()=>{const b=await blob();if(!b)return;const f=new File([b],'my-forkit-ai-footprint.png',{type:'image/png'});if(navigator.share&&(!navigator.canShare||navigator.canShare({files:[f]})))await navigator.share({title:text('shareTitle'),text:shareCaption(),files:[f]});else await navigator.clipboard.writeText(shareCaption())});
|
|
163
|
+
if(config){void auth(config.locale_endpoint,{body:JSON.stringify({locale})});$('monitor-button').addEventListener('click',async()=>{const endpoint=monitor.lifecycle==='monitoring'?config.monitor_stop_endpoint:config.monitor_start_endpoint;const r=await auth(endpoint);if(r.ok){monitor=await r.json();renderMonitor()}});$('clear-button').addEventListener('click',async()=>{if(!confirm(text('clearConfirm')))return;const r=await auth(config.monitor_clear_endpoint);if(r.ok){monitor=await r.json();renderMonitor()}});$('scan-button').addEventListener('click',async()=>{const b=$('scan-button');b.disabled=true;$('scan-status').textContent=text('scanning');try{const r=await auth(config.endpoint);if(!r.ok)throw 0;footprint=await r.json();renderDetails();$('scan-status').textContent=text('refreshed')}catch{$('scan-status').textContent=text('scanFailed')}finally{b.disabled=false}});$('review-payload').addEventListener('click',async()=>{const r=await auth(config.contribution_preview_endpoint);if(!r.ok)return;$('payload').textContent=JSON.stringify(await r.json(),null,2);$('consent').hidden=false});$('keep-local').addEventListener('click',()=>{$('consent').hidden=true});(async()=>{try{const r=await auth(config.monitor_stream_endpoint);if(!r.ok||!r.body)return;const reader=r.body.getReader(),decoder=new TextDecoder();let buf='';while(true){const part=await reader.read();if(part.done)break;buf+=decoder.decode(part.value,{stream:true});const lines=buf.split('\\n');buf=lines.pop()||'';for(const line of lines)if(line){monitor=JSON.parse(line);renderMonitor()}}}catch{}})();renderDetails()}
|
|
164
|
+
renderMonitor();
|
|
165
|
+
</script></body></html>`;
|
|
166
|
+
}
|
|
167
|
+
//# sourceMappingURL=share-page.js.map
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { MonitorSnapshot } from './monitor';
|
|
2
|
+
import type { CensusReport } from './types';
|
|
3
|
+
export declare const MINIMUM_COMPARISON_SECONDS = 600;
|
|
4
|
+
export interface AnonymousAiFootprintContribution {
|
|
5
|
+
schema_version: '2.0';
|
|
6
|
+
observation: {
|
|
7
|
+
valid_seconds: number;
|
|
8
|
+
ai_active_seconds: number;
|
|
9
|
+
activity_ratio: number;
|
|
10
|
+
};
|
|
11
|
+
counts: {
|
|
12
|
+
supported_apps_observed_working: number;
|
|
13
|
+
supported_app_categories: string[];
|
|
14
|
+
local_models_discovered: number;
|
|
15
|
+
local_models_loaded: number;
|
|
16
|
+
verified_local_runtimes_available: number;
|
|
17
|
+
};
|
|
18
|
+
model_storage_bytes: number;
|
|
19
|
+
system: {
|
|
20
|
+
platform: 'darwin';
|
|
21
|
+
architecture: string;
|
|
22
|
+
os_major: number;
|
|
23
|
+
};
|
|
24
|
+
versions: {
|
|
25
|
+
scanner: string;
|
|
26
|
+
node_major: number;
|
|
27
|
+
monitor_schema: '1.0';
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
export declare function buildAnonymousAiFootprintPreview(report: CensusReport, monitor: MonitorSnapshot, options?: {
|
|
31
|
+
osMajor?: number;
|
|
32
|
+
}): AnonymousAiFootprintContribution;
|
|
33
|
+
/** Consent is separate from local preview construction. This never uploads. */
|
|
34
|
+
export declare function authorizeAnonymousAiFootprintContribution(payload: AnonymousAiFootprintContribution, consent: boolean): AnonymousAiFootprintContribution;
|
|
35
|
+
//# sourceMappingURL=sharing.d.ts.map
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MINIMUM_COMPARISON_SECONDS = void 0;
|
|
4
|
+
exports.buildAnonymousAiFootprintPreview = buildAnonymousAiFootprintPreview;
|
|
5
|
+
exports.authorizeAnonymousAiFootprintContribution = authorizeAnonymousAiFootprintContribution;
|
|
6
|
+
const node_child_process_1 = require("node:child_process");
|
|
7
|
+
exports.MINIMUM_COMPARISON_SECONDS = 600;
|
|
8
|
+
function macosMajorVersion() {
|
|
9
|
+
try {
|
|
10
|
+
const productVersion = (0, node_child_process_1.execFileSync)('/usr/bin/sw_vers', ['-productVersion'], {
|
|
11
|
+
encoding: 'utf8',
|
|
12
|
+
timeout: 2_000,
|
|
13
|
+
stdio: ['ignore', 'pipe', 'ignore'],
|
|
14
|
+
}).trim();
|
|
15
|
+
const major = Number(productVersion.split('.')[0]);
|
|
16
|
+
return Number.isInteger(major) && major > 0 ? major : 0;
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
return 0;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
function buildAnonymousAiFootprintPreview(report, monitor, options = {}) {
|
|
23
|
+
if (report.system.platform !== 'darwin')
|
|
24
|
+
throw new Error('ANONYMOUS_FOOTPRINT_MACOS_REQUIRED');
|
|
25
|
+
if (!report.summary.storage_complete)
|
|
26
|
+
throw new Error('ANONYMOUS_FOOTPRINT_STORAGE_INCOMPLETE');
|
|
27
|
+
if (monitor.observed_seconds < exports.MINIMUM_COMPARISON_SECONDS)
|
|
28
|
+
throw new Error('ANONYMOUS_FOOTPRINT_MINIMUM_OBSERVATION_REQUIRED');
|
|
29
|
+
if (monitor.active_seconds < 0 || monitor.active_seconds > monitor.observed_seconds)
|
|
30
|
+
throw new Error('ANONYMOUS_FOOTPRINT_INVALID_ACTIVITY_DURATION');
|
|
31
|
+
const validSeconds = Math.floor(monitor.observed_seconds);
|
|
32
|
+
const activeSeconds = Math.min(validSeconds, Math.floor(monitor.active_seconds));
|
|
33
|
+
const workingProducts = monitor.products.filter((product) => product.active_seconds > 0);
|
|
34
|
+
return {
|
|
35
|
+
schema_version: '2.0',
|
|
36
|
+
observation: {
|
|
37
|
+
valid_seconds: validSeconds,
|
|
38
|
+
ai_active_seconds: activeSeconds,
|
|
39
|
+
activity_ratio: validSeconds === 0 ? 0 : Math.round((activeSeconds / validSeconds) * 1000) / 1000,
|
|
40
|
+
},
|
|
41
|
+
counts: {
|
|
42
|
+
supported_apps_observed_working: workingProducts.length,
|
|
43
|
+
supported_app_categories: [...new Set(workingProducts.map((product) => product.kind))].sort(),
|
|
44
|
+
local_models_discovered: report.summary.model_count,
|
|
45
|
+
local_models_loaded: report.summary.confirmed_running_model_count,
|
|
46
|
+
verified_local_runtimes_available: report.summary.available_runtime_count,
|
|
47
|
+
},
|
|
48
|
+
model_storage_bytes: report.summary.storage_bytes,
|
|
49
|
+
system: {
|
|
50
|
+
platform: 'darwin',
|
|
51
|
+
architecture: report.system.architecture,
|
|
52
|
+
os_major: options.osMajor ?? macosMajorVersion(),
|
|
53
|
+
},
|
|
54
|
+
versions: {
|
|
55
|
+
scanner: report.product_version,
|
|
56
|
+
node_major: report.system.node_major,
|
|
57
|
+
monitor_schema: monitor.schema_version,
|
|
58
|
+
},
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
/** Consent is separate from local preview construction. This never uploads. */
|
|
62
|
+
function authorizeAnonymousAiFootprintContribution(payload, consent) {
|
|
63
|
+
if (!consent)
|
|
64
|
+
throw new Error('ANONYMOUS_FOOTPRINT_CONSENT_REQUIRED');
|
|
65
|
+
return payload;
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=sharing.js.map
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { CensusAgent, CensusTool } from './types';
|
|
2
|
+
export interface ToolDetectionOptions {
|
|
3
|
+
homeDir: string;
|
|
4
|
+
env: NodeJS.ProcessEnv;
|
|
5
|
+
platform: NodeJS.Platform;
|
|
6
|
+
agents: CensusAgent[];
|
|
7
|
+
}
|
|
8
|
+
export declare function detectAiTools(options: ToolDetectionOptions): Promise<CensusTool[]>;
|
|
9
|
+
//# sourceMappingURL=tools.d.ts.map
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.detectAiTools = detectAiTools;
|
|
7
|
+
const promises_1 = __importDefault(require("node:fs/promises"));
|
|
8
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
9
|
+
const hash_1 = require("./hash");
|
|
10
|
+
async function exists(targetPath) {
|
|
11
|
+
try {
|
|
12
|
+
await promises_1.default.access(targetPath);
|
|
13
|
+
return true;
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
return false;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
function executableCandidates(command, platform, env) {
|
|
20
|
+
if (platform !== 'win32')
|
|
21
|
+
return [command];
|
|
22
|
+
const extensions = String(env.PATHEXT || '.EXE;.CMD;.BAT')
|
|
23
|
+
.split(';')
|
|
24
|
+
.map((entry) => entry.trim().toLowerCase())
|
|
25
|
+
.filter(Boolean);
|
|
26
|
+
return [command, ...extensions.map((extension) => `${command}${extension}`)];
|
|
27
|
+
}
|
|
28
|
+
async function commandExists(command, platform, env) {
|
|
29
|
+
const directories = String(env.PATH || env.Path || env.path || '')
|
|
30
|
+
.split(node_path_1.default.delimiter)
|
|
31
|
+
.filter(Boolean)
|
|
32
|
+
.slice(0, 256);
|
|
33
|
+
const candidates = executableCandidates(command, platform, env);
|
|
34
|
+
for (const directory of directories) {
|
|
35
|
+
for (const candidate of candidates) {
|
|
36
|
+
if (await exists(node_path_1.default.join(directory, candidate)))
|
|
37
|
+
return true;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
function definitions(homeDir) {
|
|
43
|
+
return [
|
|
44
|
+
{ name: 'Claude Code', signatures: ['claude'], commands: ['claude'], configPaths: [node_path_1.default.join(homeDir, '.claude')] },
|
|
45
|
+
{ name: 'Codex', signatures: ['codex'], commands: ['codex'], configPaths: [node_path_1.default.join(homeDir, '.codex')], appPaths: ['/Applications/Codex.app', node_path_1.default.join(homeDir, 'Applications', 'Codex.app')] },
|
|
46
|
+
{ name: 'Cursor', signatures: ['cursor'], commands: ['cursor'], configPaths: [node_path_1.default.join(homeDir, '.cursor')], appPaths: ['/Applications/Cursor.app', node_path_1.default.join(homeDir, 'Applications', 'Cursor.app')] },
|
|
47
|
+
{ name: 'Windsurf', signatures: ['windsurf'], commands: ['windsurf'], configPaths: [node_path_1.default.join(homeDir, '.codeium', 'windsurf')], appPaths: ['/Applications/Windsurf.app', node_path_1.default.join(homeDir, 'Applications', 'Windsurf.app')] },
|
|
48
|
+
{ name: 'Gemini CLI', signatures: ['gemini-cli'], commands: ['gemini'], configPaths: [node_path_1.default.join(homeDir, '.gemini')] },
|
|
49
|
+
{ name: 'GitHub Copilot', signatures: ['github-copilot'], commands: [], configPaths: [] },
|
|
50
|
+
{ name: 'OpenCode', signatures: ['opencode'], commands: ['opencode'], configPaths: [node_path_1.default.join(homeDir, '.config', 'opencode')] },
|
|
51
|
+
{ name: 'OpenClaw', signatures: ['openclaw'], commands: ['openclaw'], configPaths: [node_path_1.default.join(homeDir, '.openclaw')] },
|
|
52
|
+
{ name: 'Jan', signatures: [], commands: ['jan'], configPaths: [node_path_1.default.join(homeDir, 'Library', 'Application Support', 'Jan')], appPaths: ['/Applications/Jan.app', node_path_1.default.join(homeDir, 'Applications', 'Jan.app')] },
|
|
53
|
+
{ name: 'LM Studio', signatures: [], commands: ['lms'], configPaths: [node_path_1.default.join(homeDir, '.lmstudio')], appPaths: ['/Applications/LM Studio.app', node_path_1.default.join(homeDir, 'Applications', 'LM Studio.app')] },
|
|
54
|
+
{ name: 'Zed', signatures: [], commands: ['zed'], configPaths: [node_path_1.default.join(homeDir, '.zed')], appPaths: ['/Applications/Zed.app', node_path_1.default.join(homeDir, 'Applications', 'Zed.app')] },
|
|
55
|
+
];
|
|
56
|
+
}
|
|
57
|
+
async function hasCopilotExtension(homeDir) {
|
|
58
|
+
const roots = [
|
|
59
|
+
node_path_1.default.join(homeDir, '.vscode', 'extensions'),
|
|
60
|
+
node_path_1.default.join(homeDir, '.vscode-insiders', 'extensions'),
|
|
61
|
+
];
|
|
62
|
+
for (const root of roots) {
|
|
63
|
+
try {
|
|
64
|
+
const names = await promises_1.default.readdir(root);
|
|
65
|
+
if (names.some((name) => /^github\.copilot(?:-chat)?(?:-|$)/i.test(name)))
|
|
66
|
+
return true;
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
// Missing or unreadable extension roots are normal.
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return false;
|
|
73
|
+
}
|
|
74
|
+
async function detectAiTools(options) {
|
|
75
|
+
const tools = [];
|
|
76
|
+
for (const definition of definitions(options.homeDir)) {
|
|
77
|
+
const detectorTypes = new Set();
|
|
78
|
+
const matchingAgents = options.agents.filter((agent) => definition.signatures.includes(agent.signature));
|
|
79
|
+
if (matchingAgents.length > 0)
|
|
80
|
+
detectorTypes.add('process');
|
|
81
|
+
const commandInstalled = (await Promise.all(definition.commands.map((command) => commandExists(command, options.platform, options.env)))).some(Boolean);
|
|
82
|
+
const appInstalled = options.platform === 'darwin'
|
|
83
|
+
&& (await Promise.all((definition.appPaths ?? []).map((targetPath) => exists(targetPath)))).some(Boolean);
|
|
84
|
+
if (commandInstalled || appInstalled) {
|
|
85
|
+
detectorTypes.add('executable');
|
|
86
|
+
}
|
|
87
|
+
const configured = definition.name === 'GitHub Copilot'
|
|
88
|
+
? await hasCopilotExtension(options.homeDir)
|
|
89
|
+
: (await Promise.all(definition.configPaths.map((targetPath) => exists(targetPath)))).some(Boolean);
|
|
90
|
+
if (configured)
|
|
91
|
+
detectorTypes.add('config');
|
|
92
|
+
if (detectorTypes.size === 0)
|
|
93
|
+
continue;
|
|
94
|
+
const instanceCount = matchingAgents.reduce((total, agent) => total + agent.instance_count, 0);
|
|
95
|
+
tools.push({
|
|
96
|
+
tool_id: (0, hash_1.stableId)('tool', definition.name),
|
|
97
|
+
name: definition.name,
|
|
98
|
+
evidence_status: detectorTypes.has('process') ? 'online' : 'configured',
|
|
99
|
+
confidence: detectorTypes.has('process') || detectorTypes.size >= 2 ? 'high' : 'medium',
|
|
100
|
+
detector_types: [...detectorTypes].sort(),
|
|
101
|
+
instance_count: instanceCount,
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
return tools.sort((left, right) => left.name.localeCompare(right.name));
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=tools.js.map
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
export type Confidence = 'high' | 'medium' | 'low';
|
|
2
|
+
export type EvidenceStatus = 'discovered' | 'configured' | 'online' | 'confirmed-running';
|
|
3
|
+
export type RuntimeKind = 'ollama' | 'lmstudio' | 'openai-compatible' | 'filesystem';
|
|
4
|
+
export type RuntimeStatus = 'available' | 'unavailable' | 'inventory-only';
|
|
5
|
+
export interface CensusRuntime {
|
|
6
|
+
runtime_id: string;
|
|
7
|
+
name: RuntimeKind;
|
|
8
|
+
status: RuntimeStatus;
|
|
9
|
+
endpoint: string | null;
|
|
10
|
+
model_count: number;
|
|
11
|
+
observed_at: string;
|
|
12
|
+
error_code: string | null;
|
|
13
|
+
evidence_status: 'configured' | 'online' | 'unavailable';
|
|
14
|
+
}
|
|
15
|
+
export interface CensusModel {
|
|
16
|
+
model_id: string;
|
|
17
|
+
name: string;
|
|
18
|
+
runtime: RuntimeKind;
|
|
19
|
+
identity_kind: 'content-sha256' | 'provider-id' | 'metadata-sha256';
|
|
20
|
+
identity: string;
|
|
21
|
+
size_bytes: number | null;
|
|
22
|
+
modified_at: string | null;
|
|
23
|
+
quantization: string | null;
|
|
24
|
+
architecture: string | null;
|
|
25
|
+
parameter_size: string | null;
|
|
26
|
+
source: 'runtime-api' | 'filesystem';
|
|
27
|
+
location_hint: string | null;
|
|
28
|
+
confidence: Confidence;
|
|
29
|
+
evidence_status: 'discovered' | 'confirmed-running';
|
|
30
|
+
}
|
|
31
|
+
export type AgentKind = 'coding-agent' | 'ide-agent' | 'agent-framework' | 'mcp-server';
|
|
32
|
+
export interface CensusAgent {
|
|
33
|
+
agent_id: string;
|
|
34
|
+
name: string;
|
|
35
|
+
signature: string;
|
|
36
|
+
kind: AgentKind;
|
|
37
|
+
confidence: Confidence;
|
|
38
|
+
instance_count: number;
|
|
39
|
+
executable_names: string[];
|
|
40
|
+
evidence_hashes: string[];
|
|
41
|
+
detection_reason: string;
|
|
42
|
+
evidence_status: 'online';
|
|
43
|
+
resource_snapshot: {
|
|
44
|
+
cpu_percent: number | null;
|
|
45
|
+
memory_percent: number | null;
|
|
46
|
+
measurement: 'point-in-time-process-metadata';
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
export interface CensusTool {
|
|
50
|
+
tool_id: string;
|
|
51
|
+
name: string;
|
|
52
|
+
evidence_status: 'configured' | 'online';
|
|
53
|
+
confidence: Confidence;
|
|
54
|
+
detector_types: Array<'config' | 'executable' | 'process'>;
|
|
55
|
+
instance_count: number;
|
|
56
|
+
}
|
|
57
|
+
export interface CensusMcpConfig {
|
|
58
|
+
client: string;
|
|
59
|
+
evidence_status: 'configured';
|
|
60
|
+
confidence: Confidence;
|
|
61
|
+
server_count: number;
|
|
62
|
+
}
|
|
63
|
+
export interface CensusWarning {
|
|
64
|
+
code: string;
|
|
65
|
+
message: string;
|
|
66
|
+
scope: 'runtime' | 'model' | 'agent' | 'privacy' | 'system';
|
|
67
|
+
}
|
|
68
|
+
export interface CensusSummary {
|
|
69
|
+
runtime_count: number;
|
|
70
|
+
available_runtime_count: number;
|
|
71
|
+
model_count: number;
|
|
72
|
+
agent_product_count: number;
|
|
73
|
+
agent_process_count: number;
|
|
74
|
+
agent_cpu_percent: number | null;
|
|
75
|
+
agent_memory_percent: number | null;
|
|
76
|
+
tool_count: number;
|
|
77
|
+
mcp_config_count: number;
|
|
78
|
+
confirmed_running_model_count: number;
|
|
79
|
+
storage_bytes: number;
|
|
80
|
+
storage_file_count: number;
|
|
81
|
+
storage_complete: boolean;
|
|
82
|
+
storage_measurement: 'recognized-logical-file-bytes';
|
|
83
|
+
warning_count: number;
|
|
84
|
+
}
|
|
85
|
+
export interface CensusReport {
|
|
86
|
+
schema_version: '1.3';
|
|
87
|
+
product: 'forkit-ai-footprints';
|
|
88
|
+
product_version: string;
|
|
89
|
+
census_id: string;
|
|
90
|
+
generated_at: string;
|
|
91
|
+
system: {
|
|
92
|
+
platform: NodeJS.Platform;
|
|
93
|
+
architecture: string;
|
|
94
|
+
node_major: number;
|
|
95
|
+
};
|
|
96
|
+
privacy: {
|
|
97
|
+
mode: 'metadata-only';
|
|
98
|
+
raw_commands_retained: false;
|
|
99
|
+
model_file_contents_read: false;
|
|
100
|
+
config_values_emitted: false;
|
|
101
|
+
sensitive_content_retained: false;
|
|
102
|
+
remote_endpoints_allowed: false;
|
|
103
|
+
external_requests_made: 0;
|
|
104
|
+
backend_contacted: false;
|
|
105
|
+
account_read: false;
|
|
106
|
+
local_state_written: boolean;
|
|
107
|
+
local_state_scope: 'none' | 'device-journal-only';
|
|
108
|
+
};
|
|
109
|
+
summary: CensusSummary;
|
|
110
|
+
runtimes: CensusRuntime[];
|
|
111
|
+
models: CensusModel[];
|
|
112
|
+
agents: CensusAgent[];
|
|
113
|
+
tools: CensusTool[];
|
|
114
|
+
mcp_configs: CensusMcpConfig[];
|
|
115
|
+
guess: {
|
|
116
|
+
provided: number | null;
|
|
117
|
+
discovered: number;
|
|
118
|
+
difference: number | null;
|
|
119
|
+
};
|
|
120
|
+
warnings: CensusWarning[];
|
|
121
|
+
}
|
|
122
|
+
export interface RuntimeScanResult {
|
|
123
|
+
runtime: CensusRuntime;
|
|
124
|
+
models: CensusModel[];
|
|
125
|
+
warnings: CensusWarning[];
|
|
126
|
+
storage?: {
|
|
127
|
+
logical_bytes: number;
|
|
128
|
+
recognized_file_count: number;
|
|
129
|
+
complete: boolean;
|
|
130
|
+
measurement: 'recognized-logical-file-bytes';
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
export interface RuntimeProvider {
|
|
134
|
+
readonly name: RuntimeKind;
|
|
135
|
+
scan(observedAt: string): Promise<RuntimeScanResult>;
|
|
136
|
+
}
|
|
137
|
+
export interface ProcessEntry {
|
|
138
|
+
pid: number;
|
|
139
|
+
ppid?: number;
|
|
140
|
+
name?: string;
|
|
141
|
+
cmd?: string;
|
|
142
|
+
cpu_percent?: number;
|
|
143
|
+
memory_percent?: number;
|
|
144
|
+
/** Internal resident memory from the operating system. Never emitted in a Census report. */
|
|
145
|
+
rss_bytes?: number;
|
|
146
|
+
/** Internal cumulative process CPU time. Never emitted in a Census report. */
|
|
147
|
+
cpu_time_ms?: number;
|
|
148
|
+
}
|
|
149
|
+
export interface CensusOptions {
|
|
150
|
+
includeRuntimes?: boolean;
|
|
151
|
+
includeFilesystem?: boolean;
|
|
152
|
+
includeAgents?: boolean;
|
|
153
|
+
includeTools?: boolean;
|
|
154
|
+
includeMcp?: boolean;
|
|
155
|
+
filesystemRoots?: string[];
|
|
156
|
+
processEntries?: ProcessEntry[];
|
|
157
|
+
providers?: RuntimeProvider[];
|
|
158
|
+
now?: () => Date;
|
|
159
|
+
guess?: number | null;
|
|
160
|
+
homeDir?: string;
|
|
161
|
+
cwd?: string;
|
|
162
|
+
env?: NodeJS.ProcessEnv;
|
|
163
|
+
platform?: NodeJS.Platform;
|
|
164
|
+
architecture?: string;
|
|
165
|
+
}
|
|
166
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.SCHEMA_VERSION = exports.PRODUCT_VERSION = exports.PRODUCT_NAME = void 0;
|
|
7
|
+
exports.PRODUCT_NAME = 'forkit-ai-footprints';
|
|
8
|
+
const package_json_1 = __importDefault(require("../package.json"));
|
|
9
|
+
// package.json is the only product-version source. npm, the CLI, native
|
|
10
|
+
// bundles, GitHub release tags, and package-manager metadata must derive from it.
|
|
11
|
+
exports.PRODUCT_VERSION = package_json_1.default.version;
|
|
12
|
+
exports.SCHEMA_VERSION = '1.3';
|
|
13
|
+
//# sourceMappingURL=version.js.map
|