@formigio/fazemos-cli 0.10.64 → 0.10.66
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/dist/approvals.js +1 -2
- package/dist/approvals.js.map +1 -1
- package/dist/commands/asset/get.d.ts +16 -0
- package/dist/commands/asset/get.js +151 -0
- package/dist/commands/asset/get.js.map +1 -0
- package/dist/commands/asset/index.d.ts +17 -0
- package/dist/commands/asset/index.js +33 -0
- package/dist/commands/asset/index.js.map +1 -0
- package/dist/commands/asset/put.d.ts +23 -0
- package/dist/commands/asset/put.js +283 -0
- package/dist/commands/asset/put.js.map +1 -0
- package/dist/commands/asset/show.d.ts +24 -0
- package/dist/commands/asset/show.js +141 -0
- package/dist/commands/asset/show.js.map +1 -0
- package/dist/commands/ingest.js +3 -2
- package/dist/commands/ingest.js.map +1 -1
- package/dist/commands/secrets.js +1 -1
- package/dist/commands/secrets.js.map +1 -1
- package/dist/index.js +23 -9
- package/dist/index.js.map +1 -1
- package/dist/lib/assetHash.d.ts +39 -0
- package/dist/lib/assetHash.js +57 -0
- package/dist/lib/assetHash.js.map +1 -0
- package/dist/lib/assetUri.d.ts +29 -0
- package/dist/lib/assetUri.js +34 -0
- package/dist/lib/assetUri.js.map +1 -0
- package/dist/lib/contentTypeInfer.d.ts +14 -0
- package/dist/lib/contentTypeInfer.js +87 -0
- package/dist/lib/contentTypeInfer.js.map +1 -0
- package/dist/lib/pointerFile.d.ts +62 -0
- package/dist/lib/pointerFile.js +171 -0
- package/dist/lib/pointerFile.js.map +1 -0
- package/package.json +1 -1
package/dist/approvals.js
CHANGED
|
@@ -210,8 +210,7 @@ export function registerApprovalsCommands(program) {
|
|
|
210
210
|
'This is the CLI equivalent of the typed-token ceremony (OBD #1).\n\n' +
|
|
211
211
|
'Exit codes:\n' +
|
|
212
212
|
' 0 — resolved successfully\n' +
|
|
213
|
-
' 1 — API error (see error message)
|
|
214
|
-
' 2 — validation error (missing/invalid flag)')
|
|
213
|
+
' 1 — validation error (missing/invalid flag) or API error (see error message)')
|
|
215
214
|
.argument('<id>', 'Approval gate ID (UUID)')
|
|
216
215
|
.requiredOption('--decision <approve|reject>', 'Decision: approve or reject')
|
|
217
216
|
.requiredOption('--reason <text>', 'Reason for the decision (min 4 chars; recorded in audit trail)')
|
package/dist/approvals.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"approvals.js","sourceRoot":"","sources":["../src/approvals.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"approvals.js","sourceRoot":"","sources":["../src/approvals.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* F54 — fazemos asset get <pointer-path-or-uri>
|
|
3
|
+
*
|
|
4
|
+
* Resolves a .asset.yaml pointer file or raw fazemos-asset:// URI, obtains a
|
|
5
|
+
* presigned S3 GET URL from POST /api/assets/get-url, downloads the file,
|
|
6
|
+
* verifies its SHA-256 hash matches the declared content_hash (AC-F54-3), and
|
|
7
|
+
* writes the bytes to the requested output path.
|
|
8
|
+
*
|
|
9
|
+
* Flags:
|
|
10
|
+
* --out <path>|- Write to this path; `-` writes to stdout (default: use
|
|
11
|
+
* original_filename from asset metadata, or error)
|
|
12
|
+
* --project <slug> Override active project for this call
|
|
13
|
+
* --json Output raw JSON from get-url response (no download)
|
|
14
|
+
*/
|
|
15
|
+
import type { Command } from 'commander';
|
|
16
|
+
export declare function registerAssetGetCommand(asset: Command): void;
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* F54 — fazemos asset get <pointer-path-or-uri>
|
|
3
|
+
*
|
|
4
|
+
* Resolves a .asset.yaml pointer file or raw fazemos-asset:// URI, obtains a
|
|
5
|
+
* presigned S3 GET URL from POST /api/assets/get-url, downloads the file,
|
|
6
|
+
* verifies its SHA-256 hash matches the declared content_hash (AC-F54-3), and
|
|
7
|
+
* writes the bytes to the requested output path.
|
|
8
|
+
*
|
|
9
|
+
* Flags:
|
|
10
|
+
* --out <path>|- Write to this path; `-` writes to stdout (default: use
|
|
11
|
+
* original_filename from asset metadata, or error)
|
|
12
|
+
* --project <slug> Override active project for this call
|
|
13
|
+
* --json Output raw JSON from get-url response (no download)
|
|
14
|
+
*/
|
|
15
|
+
import { basename } from 'path';
|
|
16
|
+
import chalk from 'chalk';
|
|
17
|
+
import { writeFileSync } from 'fs';
|
|
18
|
+
import { api } from '../../api.js';
|
|
19
|
+
import { isAssetUri, parseAssetUri } from '../../lib/assetUri.js';
|
|
20
|
+
import { readPointerFile, stripHashPrefix } from '../../lib/pointerFile.js';
|
|
21
|
+
import { hashBuffer } from '../../lib/assetHash.js';
|
|
22
|
+
import { handleAssetApiError } from './put.js';
|
|
23
|
+
// ── Helpers ───────────────────────────────────────────────────────────────────
|
|
24
|
+
/**
|
|
25
|
+
* Resolve the input to a fazemos-asset:// URI.
|
|
26
|
+
* Input may be a raw URI string or a path to a .asset.yaml pointer file.
|
|
27
|
+
*/
|
|
28
|
+
function resolveUriFromInput(input) {
|
|
29
|
+
if (isAssetUri(input)) {
|
|
30
|
+
// Raw URI — extract hash from URI (no pointer file to cross-check)
|
|
31
|
+
const { hash } = parseAssetUri(input);
|
|
32
|
+
return { uri: input, contentHashHex: hash };
|
|
33
|
+
}
|
|
34
|
+
// Treat as pointer file path
|
|
35
|
+
const pointer = readPointerFile(input);
|
|
36
|
+
const contentHashHex = stripHashPrefix(pointer.content_hash);
|
|
37
|
+
return { uri: pointer.uri, contentHashHex };
|
|
38
|
+
}
|
|
39
|
+
// ── Command registration ──────────────────────────────────────────────────────
|
|
40
|
+
export function registerAssetGetCommand(asset) {
|
|
41
|
+
asset
|
|
42
|
+
.command('get')
|
|
43
|
+
.description('Download a file from the Fazemos asset store.\n' +
|
|
44
|
+
'Accepts a .asset.yaml pointer file path or a raw fazemos-asset:// URI.\n' +
|
|
45
|
+
'SHA-256-verifies the downloaded bytes against the declared content hash (AC-F54-3).')
|
|
46
|
+
.argument('<pointer-path-or-uri>', '.asset.yaml pointer file path or fazemos-asset:// URI')
|
|
47
|
+
.option('--out <path>', "Output path; use `-` to write to stdout (default: original_filename from asset metadata)")
|
|
48
|
+
.option('--project <slug>', 'Override active project for this call')
|
|
49
|
+
.option('--json', 'Output raw JSON from get-url response without downloading')
|
|
50
|
+
.action(async (input, opts) => {
|
|
51
|
+
try {
|
|
52
|
+
// ── Resolve URI ──────────────────────────────────────────────────────
|
|
53
|
+
let uri;
|
|
54
|
+
let localContentHashHex;
|
|
55
|
+
try {
|
|
56
|
+
const resolved = resolveUriFromInput(input);
|
|
57
|
+
uri = resolved.uri;
|
|
58
|
+
localContentHashHex = resolved.contentHashHex;
|
|
59
|
+
}
|
|
60
|
+
catch (err) {
|
|
61
|
+
console.error(chalk.red((err instanceof Error ? err.message : String(err))));
|
|
62
|
+
process.exit(1);
|
|
63
|
+
}
|
|
64
|
+
// ── Request presigned GET URL ─────────────────────────────────────────
|
|
65
|
+
const projectSlug = opts['project'];
|
|
66
|
+
const apiOpts = projectSlug ? { projectSlug } : {};
|
|
67
|
+
const getUrlResp = (await api('POST', '/api/assets/get-url', { uri }, apiOpts));
|
|
68
|
+
if (opts['json']) {
|
|
69
|
+
console.log(JSON.stringify(getUrlResp, null, 2));
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
const presignedUrl = getUrlResp['presigned_url'];
|
|
73
|
+
const asset = getUrlResp['asset'];
|
|
74
|
+
const serverHashHex = asset?.['content_hash'];
|
|
75
|
+
const originalFilename = asset?.['original_filename'];
|
|
76
|
+
const contentType = asset?.['content_type'];
|
|
77
|
+
const sizeBytes = asset?.['size_bytes'];
|
|
78
|
+
// ── Determine output path ─────────────────────────────────────────────
|
|
79
|
+
const outFlag = opts['out'];
|
|
80
|
+
const toStdout = outFlag === '-';
|
|
81
|
+
let outPath = null;
|
|
82
|
+
if (!toStdout) {
|
|
83
|
+
if (outFlag) {
|
|
84
|
+
outPath = outFlag;
|
|
85
|
+
}
|
|
86
|
+
else if (originalFilename) {
|
|
87
|
+
outPath = basename(originalFilename);
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
// Fall back to the hash portion of the URI
|
|
91
|
+
const { hash } = parseAssetUri(uri);
|
|
92
|
+
outPath = hash;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
// ── Download ──────────────────────────────────────────────────────────
|
|
96
|
+
process.stderr.write(chalk.gray(` Downloading${sizeBytes ? ` (${formatBytes(sizeBytes)})` : ''}…\n`));
|
|
97
|
+
const downloadResp = await fetch(presignedUrl);
|
|
98
|
+
if (!downloadResp.ok) {
|
|
99
|
+
const s3Body = await downloadResp.text().catch(() => '');
|
|
100
|
+
if (downloadResp.status === 403 || downloadResp.status === 404) {
|
|
101
|
+
console.error(chalk.red(`Error: S3 download failed (${downloadResp.status}) — presigned URL may have expired.`));
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
console.error(chalk.red(`Error: S3 download failed (${downloadResp.status})`));
|
|
105
|
+
}
|
|
106
|
+
if (s3Body)
|
|
107
|
+
console.error(chalk.gray(s3Body.slice(0, 500)));
|
|
108
|
+
process.exit(1);
|
|
109
|
+
}
|
|
110
|
+
const arrayBuf = await downloadResp.arrayBuffer();
|
|
111
|
+
const fileBuffer = Buffer.from(arrayBuf);
|
|
112
|
+
// ── SHA-256 verify (AC-F54-3) ─────────────────────────────────────────
|
|
113
|
+
const { hex: downloadedHashHex } = hashBuffer(fileBuffer);
|
|
114
|
+
const authorityHash = serverHashHex ?? localContentHashHex;
|
|
115
|
+
if (authorityHash && downloadedHashHex !== authorityHash) {
|
|
116
|
+
console.error(chalk.red('Error: SHA-256 verification failed — downloaded bytes are corrupt or tampered.'));
|
|
117
|
+
console.error(chalk.gray(` Expected: ${authorityHash}`));
|
|
118
|
+
console.error(chalk.gray(` Got: ${downloadedHashHex}`));
|
|
119
|
+
process.exit(1);
|
|
120
|
+
}
|
|
121
|
+
// ── Write output ──────────────────────────────────────────────────────
|
|
122
|
+
if (toStdout) {
|
|
123
|
+
process.stdout.write(fileBuffer);
|
|
124
|
+
}
|
|
125
|
+
else if (outPath) {
|
|
126
|
+
writeFileSync(outPath, fileBuffer);
|
|
127
|
+
console.log(chalk.green(`✓ downloaded`) + ` ${outPath}`);
|
|
128
|
+
if (authorityHash) {
|
|
129
|
+
console.log(chalk.gray(` SHA-256 verified ✓`));
|
|
130
|
+
}
|
|
131
|
+
if (contentType) {
|
|
132
|
+
console.log(chalk.gray(` Content-type: ${contentType}`));
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
catch (err) {
|
|
137
|
+
handleAssetApiError(err);
|
|
138
|
+
}
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
// ── Shared helpers ────────────────────────────────────────────────────────────
|
|
142
|
+
function formatBytes(bytes) {
|
|
143
|
+
if (bytes < 1024)
|
|
144
|
+
return `${bytes} B`;
|
|
145
|
+
if (bytes < 1024 * 1024)
|
|
146
|
+
return `${(bytes / 1024).toFixed(1)} KB`;
|
|
147
|
+
if (bytes < 1024 * 1024 * 1024)
|
|
148
|
+
return `${(bytes / 1024 / 1024).toFixed(1)} MB`;
|
|
149
|
+
return `${(bytes / 1024 / 1024 / 1024).toFixed(2)} GB`;
|
|
150
|
+
}
|
|
151
|
+
//# sourceMappingURL=get.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get.js","sourceRoot":"","sources":["../../../src/commands/asset/get.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* F54 — fazemos asset command group.
|
|
3
|
+
*
|
|
4
|
+
* Registers the `asset` subcommand and its three verbs:
|
|
5
|
+
* fazemos asset put <path> [--consumer <tag>] [--content-type <mime>] [--emit <pointer-path>]
|
|
6
|
+
* fazemos asset get <pointer-path-or-uri> [--out <path>|-]
|
|
7
|
+
* fazemos asset show <pointer-path-or-uri>
|
|
8
|
+
*
|
|
9
|
+
* All commands:
|
|
10
|
+
* - Require active project context (via X-Fazemos-Project-Id header or --project override)
|
|
11
|
+
* - Support --json for machine-readable output
|
|
12
|
+
* - Support --project <slug> to override the active project
|
|
13
|
+
*
|
|
14
|
+
* Spec: F54-agent-asset-store-manifest.yaml §frontend.cli_changes
|
|
15
|
+
*/
|
|
16
|
+
import type { Command } from 'commander';
|
|
17
|
+
export declare function registerAssetCommands(program: Command): void;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* F54 — fazemos asset command group.
|
|
3
|
+
*
|
|
4
|
+
* Registers the `asset` subcommand and its three verbs:
|
|
5
|
+
* fazemos asset put <path> [--consumer <tag>] [--content-type <mime>] [--emit <pointer-path>]
|
|
6
|
+
* fazemos asset get <pointer-path-or-uri> [--out <path>|-]
|
|
7
|
+
* fazemos asset show <pointer-path-or-uri>
|
|
8
|
+
*
|
|
9
|
+
* All commands:
|
|
10
|
+
* - Require active project context (via X-Fazemos-Project-Id header or --project override)
|
|
11
|
+
* - Support --json for machine-readable output
|
|
12
|
+
* - Support --project <slug> to override the active project
|
|
13
|
+
*
|
|
14
|
+
* Spec: F54-agent-asset-store-manifest.yaml §frontend.cli_changes
|
|
15
|
+
*/
|
|
16
|
+
import { registerAssetPutCommand } from './put.js';
|
|
17
|
+
import { registerAssetGetCommand } from './get.js';
|
|
18
|
+
import { registerAssetShowCommand } from './show.js';
|
|
19
|
+
export function registerAssetCommands(program) {
|
|
20
|
+
const asset = program
|
|
21
|
+
.command('asset')
|
|
22
|
+
.description('Fazemos asset store — upload, download, and inspect agent-produced assets.\n' +
|
|
23
|
+
'Assets are stored in S3; .asset.yaml pointer files replace the binary in git.\n' +
|
|
24
|
+
'\n' +
|
|
25
|
+
'Commands:\n' +
|
|
26
|
+
' put <path> Upload a file and emit a .asset.yaml pointer\n' +
|
|
27
|
+
' get <pointer-or-uri> Download and SHA-256-verify an asset\n' +
|
|
28
|
+
' show <pointer-or-uri> Display live metadata without downloading');
|
|
29
|
+
registerAssetPutCommand(asset);
|
|
30
|
+
registerAssetGetCommand(asset);
|
|
31
|
+
registerAssetShowCommand(asset);
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/asset/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,EAAE,uBAAuB,EAAE,MAAM,UAAU,CAAC;AACnD,OAAO,EAAE,uBAAuB,EAAE,MAAM,UAAU,CAAC;AACnD,OAAO,EAAE,wBAAwB,EAAE,MAAM,WAAW,CAAC;AAErD,MAAM,UAAU,qBAAqB,CAAC,OAAgB;IACpD,MAAM,KAAK,GAAG,OAAO;SAClB,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CACV,8EAA8E;QAC5E,iFAAiF;QACjF,IAAI;QACJ,aAAa;QACb,0EAA0E;QAC1E,kEAAkE;QAClE,qEAAqE,CACxE,CAAC;IAEJ,uBAAuB,CAAC,KAAK,CAAC,CAAC;IAC/B,uBAAuB,CAAC,KAAK,CAAC,CAAC;IAC/B,wBAAwB,CAAC,KAAK,CAAC,CAAC;AAClC,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* F54 — fazemos asset put <path>
|
|
3
|
+
*
|
|
4
|
+
* Computes SHA-256 of a file client-side (AC-F54-13), calls POST /api/assets/put-url
|
|
5
|
+
* to obtain a presigned S3 PUT URL, uploads the file to S3 with all required
|
|
6
|
+
* Niko F-2 headers (x-amz-checksum-sha256, x-amz-tagging, content-length,
|
|
7
|
+
* content-type), and writes (or prints to stdout) a .asset.yaml pointer (BD-1).
|
|
8
|
+
*
|
|
9
|
+
* Idempotent by content hash (AC-F54-2): if the asset is already committed the
|
|
10
|
+
* same pointer is returned without re-uploading.
|
|
11
|
+
*
|
|
12
|
+
* Flags:
|
|
13
|
+
* --consumer <tag> Retention class (default: raw-scan-90d). Pre-flight
|
|
14
|
+
* rejected if not in enum (rul_asset_store_retention_class_enum).
|
|
15
|
+
* --content-type <mime> Override MIME inference (inferContentType()).
|
|
16
|
+
* --emit <pointer-path> Write pointer to this .asset.yaml path (must end .asset.yaml).
|
|
17
|
+
* Without --emit: YAML printed to stdout.
|
|
18
|
+
* --project <slug> Override active project for this call.
|
|
19
|
+
* --json Output raw JSON pointer object (machine-readable).
|
|
20
|
+
*/
|
|
21
|
+
import type { Command } from 'commander';
|
|
22
|
+
export declare function handleAssetApiError(err: unknown): never;
|
|
23
|
+
export declare function registerAssetPutCommand(asset: Command): void;
|
|
@@ -0,0 +1,283 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* F54 — fazemos asset put <path>
|
|
3
|
+
*
|
|
4
|
+
* Computes SHA-256 of a file client-side (AC-F54-13), calls POST /api/assets/put-url
|
|
5
|
+
* to obtain a presigned S3 PUT URL, uploads the file to S3 with all required
|
|
6
|
+
* Niko F-2 headers (x-amz-checksum-sha256, x-amz-tagging, content-length,
|
|
7
|
+
* content-type), and writes (or prints to stdout) a .asset.yaml pointer (BD-1).
|
|
8
|
+
*
|
|
9
|
+
* Idempotent by content hash (AC-F54-2): if the asset is already committed the
|
|
10
|
+
* same pointer is returned without re-uploading.
|
|
11
|
+
*
|
|
12
|
+
* Flags:
|
|
13
|
+
* --consumer <tag> Retention class (default: raw-scan-90d). Pre-flight
|
|
14
|
+
* rejected if not in enum (rul_asset_store_retention_class_enum).
|
|
15
|
+
* --content-type <mime> Override MIME inference (inferContentType()).
|
|
16
|
+
* --emit <pointer-path> Write pointer to this .asset.yaml path (must end .asset.yaml).
|
|
17
|
+
* Without --emit: YAML printed to stdout.
|
|
18
|
+
* --project <slug> Override active project for this call.
|
|
19
|
+
* --json Output raw JSON pointer object (machine-readable).
|
|
20
|
+
*/
|
|
21
|
+
import { basename } from 'path';
|
|
22
|
+
import chalk from 'chalk';
|
|
23
|
+
import { readFileSync, existsSync } from 'fs';
|
|
24
|
+
import { api, ApiError } from '../../api.js';
|
|
25
|
+
import { hashFile } from '../../lib/assetHash.js';
|
|
26
|
+
import { inferContentType } from '../../lib/contentTypeInfer.js';
|
|
27
|
+
import { writePointerFile, buildPointerContent, pointerFromApiResponse, } from '../../lib/pointerFile.js';
|
|
28
|
+
// ── Constants ─────────────────────────────────────────────────────────────────
|
|
29
|
+
const VALID_CONSUMER_TAGS = [
|
|
30
|
+
'raw-scan-90d',
|
|
31
|
+
'rendered-permanent',
|
|
32
|
+
'design-permanent',
|
|
33
|
+
];
|
|
34
|
+
// ── Helpers ───────────────────────────────────────────────────────────────────
|
|
35
|
+
function formatBytes(bytes) {
|
|
36
|
+
if (bytes < 1024)
|
|
37
|
+
return `${bytes} B`;
|
|
38
|
+
if (bytes < 1024 * 1024)
|
|
39
|
+
return `${(bytes / 1024).toFixed(1)} KB`;
|
|
40
|
+
if (bytes < 1024 * 1024 * 1024)
|
|
41
|
+
return `${(bytes / 1024 / 1024).toFixed(1)} MB`;
|
|
42
|
+
return `${(bytes / 1024 / 1024 / 1024).toFixed(2)} GB`;
|
|
43
|
+
}
|
|
44
|
+
/** Read agent execution context from env (works for both human and agent CLI use). */
|
|
45
|
+
function resolveProducedBy() {
|
|
46
|
+
return {
|
|
47
|
+
agent: process.env['FAZEMOS_AGENT_ID'] ??
|
|
48
|
+
process.env['FAZEMOS_AGENT_NAME'] ??
|
|
49
|
+
'fazemos-cli',
|
|
50
|
+
execution_id: process.env['FAZEMOS_EXECUTION_ID'] ?? null,
|
|
51
|
+
step_id: process.env['FAZEMOS_STEP_ID'] ?? null,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* PUT file bytes to a presigned S3 URL with all required Niko F-2 headers.
|
|
56
|
+
* Missing/altered headers → S3 returns 403 SignatureDoesNotMatch.
|
|
57
|
+
* Wrong bytes (SHA-256 mismatch) → S3 returns 400 BadDigest.
|
|
58
|
+
*/
|
|
59
|
+
async function putToS3(presignedUrl, filePath, sizeBytes, contentType, checksumBase64, consumerTag) {
|
|
60
|
+
// Read file into buffer. For v1 CLI single-PUT flow this is sufficient;
|
|
61
|
+
// streaming optimisation for multi-GB files is a follow-up.
|
|
62
|
+
const fileBuffer = readFileSync(filePath);
|
|
63
|
+
return fetch(presignedUrl, {
|
|
64
|
+
method: 'PUT',
|
|
65
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
66
|
+
body: fileBuffer,
|
|
67
|
+
headers: {
|
|
68
|
+
// Niko F-2: all four headers must be present and match the signed policy.
|
|
69
|
+
'x-amz-checksum-sha256': checksumBase64,
|
|
70
|
+
'x-amz-tagging': `retention=${consumerTag}`,
|
|
71
|
+
'content-length': String(sizeBytes),
|
|
72
|
+
'content-type': contentType,
|
|
73
|
+
},
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
// ── Error handler (shared by all asset commands) ──────────────────────────────
|
|
77
|
+
export function handleAssetApiError(err) {
|
|
78
|
+
if (err instanceof ApiError) {
|
|
79
|
+
switch (err.code) {
|
|
80
|
+
case 'invalid_content_hash':
|
|
81
|
+
console.error(chalk.red('Error: Content hash is not valid 64-char lowercase hex.'));
|
|
82
|
+
break;
|
|
83
|
+
case 'invalid_retention_class':
|
|
84
|
+
console.error(chalk.red('Error: Invalid retention class. Valid: raw-scan-90d, rendered-permanent, design-permanent'));
|
|
85
|
+
break;
|
|
86
|
+
case 'size_too_large':
|
|
87
|
+
console.error(chalk.red('Error: File is too large (S3 maximum is 5 TB).'));
|
|
88
|
+
break;
|
|
89
|
+
case 'no_project_scope':
|
|
90
|
+
console.error(chalk.red('Error: No project in scope.'));
|
|
91
|
+
console.error('');
|
|
92
|
+
console.error(chalk.gray('Set one with: fazemos projects switch <slug>'));
|
|
93
|
+
console.error(chalk.gray('Or pass: --project <slug>'));
|
|
94
|
+
break;
|
|
95
|
+
case 'broker_unavailable':
|
|
96
|
+
console.error(chalk.red('Error: Asset store broker is unavailable (ASSET_STORE_BUCKET not configured on server).'));
|
|
97
|
+
break;
|
|
98
|
+
case 'malformed_uri':
|
|
99
|
+
console.error(chalk.red('Error: Malformed fazemos-asset URI.'));
|
|
100
|
+
console.error(chalk.gray('Expected: fazemos-asset://<org>/<project>/<64-char-sha256-hex>'));
|
|
101
|
+
break;
|
|
102
|
+
case 'not_found':
|
|
103
|
+
console.error(chalk.red('Error: Asset not found.'));
|
|
104
|
+
break;
|
|
105
|
+
case 'not_yet_committed':
|
|
106
|
+
console.error(chalk.red('Error: Asset upload is not yet committed — the upload may still be in progress.'));
|
|
107
|
+
console.error(chalk.gray('Try again in a moment, or re-upload with `fazemos asset put`.'));
|
|
108
|
+
break;
|
|
109
|
+
case 'wrong_project_scope': {
|
|
110
|
+
const body = err.body;
|
|
111
|
+
const assetProject = body?.['asset_scope']?.['project_slug'];
|
|
112
|
+
const callerProject = body?.['caller_scope']?.['project_slug'];
|
|
113
|
+
console.error(chalk.red('Error: Asset belongs to a different project.'));
|
|
114
|
+
if (assetProject && callerProject) {
|
|
115
|
+
console.error(chalk.gray(` Asset project: ${String(assetProject)}`));
|
|
116
|
+
console.error(chalk.gray(` Caller project: ${String(callerProject)}`));
|
|
117
|
+
}
|
|
118
|
+
break;
|
|
119
|
+
}
|
|
120
|
+
default:
|
|
121
|
+
console.error(chalk.red(err.message));
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
else if (err instanceof Error) {
|
|
125
|
+
console.error(chalk.red(err.message));
|
|
126
|
+
}
|
|
127
|
+
else {
|
|
128
|
+
console.error(chalk.red(String(err)));
|
|
129
|
+
}
|
|
130
|
+
process.exit(1);
|
|
131
|
+
}
|
|
132
|
+
// ── Command registration ──────────────────────────────────────────────────────
|
|
133
|
+
export function registerAssetPutCommand(asset) {
|
|
134
|
+
asset
|
|
135
|
+
.command('put')
|
|
136
|
+
.description('Upload a file to the Fazemos asset store via presigned S3 PUT URL.\n' +
|
|
137
|
+
'Computes SHA-256 client-side, registers the asset, uploads to S3,\n' +
|
|
138
|
+
'and emits a .asset.yaml pointer file. Idempotent by content hash.')
|
|
139
|
+
.argument('<path>', 'Path to the file to upload')
|
|
140
|
+
.option('--consumer <tag>', 'Retention class: raw-scan-90d | rendered-permanent | design-permanent', 'raw-scan-90d')
|
|
141
|
+
.option('--content-type <mime>', 'Override MIME type (inferred from extension by default)')
|
|
142
|
+
.option('--emit <pointer-path>', 'Write pointer to this .asset.yaml path (prints to stdout if omitted)')
|
|
143
|
+
.option('--project <slug>', 'Override active project for this call')
|
|
144
|
+
.option('--json', 'Output raw JSON pointer object')
|
|
145
|
+
.action(async (filePath, opts) => {
|
|
146
|
+
try {
|
|
147
|
+
// ── Pre-flight validations ─────────────────────────────────────────────
|
|
148
|
+
if (!existsSync(filePath)) {
|
|
149
|
+
console.error(chalk.red(`Error: file not found: ${filePath}`));
|
|
150
|
+
process.exit(1);
|
|
151
|
+
}
|
|
152
|
+
if (!VALID_CONSUMER_TAGS.includes(opts['consumer'])) {
|
|
153
|
+
console.error(chalk.red(`Error: Unknown retention class '${String(opts['consumer'])}'. ` +
|
|
154
|
+
`Valid values: ${VALID_CONSUMER_TAGS.join(', ')}`));
|
|
155
|
+
process.exit(1);
|
|
156
|
+
}
|
|
157
|
+
const emitPath = opts['emit'];
|
|
158
|
+
if (emitPath && !emitPath.endsWith('.asset.yaml')) {
|
|
159
|
+
console.error(chalk.red(`Error: --emit path must end in .asset.yaml (got: ${emitPath})\n` +
|
|
160
|
+
`Hint: rename to ${emitPath}.asset.yaml`));
|
|
161
|
+
process.exit(1);
|
|
162
|
+
}
|
|
163
|
+
const isJson = Boolean(opts['json']);
|
|
164
|
+
const consumerTag = opts['consumer'];
|
|
165
|
+
const projectSlug = opts['project'];
|
|
166
|
+
// ── Hash and size ──────────────────────────────────────────────────────
|
|
167
|
+
if (!isJson) {
|
|
168
|
+
process.stderr.write(chalk.gray(` Hashing ${filePath}…\n`));
|
|
169
|
+
}
|
|
170
|
+
const { hex: contentHashHex, base64: contentHashBase64, sizeBytes, } = await hashFile(filePath);
|
|
171
|
+
const contentType = opts['contentType'] ?? inferContentType(filePath);
|
|
172
|
+
const originalFilename = basename(filePath);
|
|
173
|
+
const producedBy = resolveProducedBy();
|
|
174
|
+
// ── Request put-url from broker ────────────────────────────────────────
|
|
175
|
+
const putUrlBody = {
|
|
176
|
+
content_hash: contentHashHex, // raw hex, no sha256: prefix
|
|
177
|
+
size_bytes: sizeBytes,
|
|
178
|
+
content_type: contentType,
|
|
179
|
+
consumer_tag: consumerTag,
|
|
180
|
+
produced_by_agent: producedBy.agent,
|
|
181
|
+
produced_by_execution_id: producedBy.execution_id,
|
|
182
|
+
produced_by_step_id: producedBy.step_id,
|
|
183
|
+
original_filename: originalFilename,
|
|
184
|
+
};
|
|
185
|
+
const apiOpts = projectSlug ? { projectSlug } : {};
|
|
186
|
+
const putUrlResp = (await api('POST', '/api/assets/put-url', putUrlBody, apiOpts));
|
|
187
|
+
// ── Idempotent path: asset already committed ───────────────────────────
|
|
188
|
+
if (!putUrlResp['is_new']) {
|
|
189
|
+
const pointerObj = putUrlResp['pointer'];
|
|
190
|
+
const pointer = pointerFromApiResponse(pointerObj);
|
|
191
|
+
if (isJson) {
|
|
192
|
+
console.log(JSON.stringify(pointerObj, null, 2));
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
195
|
+
if (emitPath) {
|
|
196
|
+
const existed = existsSync(emitPath);
|
|
197
|
+
writePointerFile(emitPath, pointer);
|
|
198
|
+
const tag = existed
|
|
199
|
+
? chalk.yellow('! overwrote existing pointer')
|
|
200
|
+
: chalk.green('✓ wrote pointer');
|
|
201
|
+
console.log(`${tag} ${emitPath}`);
|
|
202
|
+
}
|
|
203
|
+
else {
|
|
204
|
+
console.log(buildPointerContent(pointer));
|
|
205
|
+
}
|
|
206
|
+
console.error(chalk.gray(` Asset already committed (idempotent) — ${String(pointerObj['uri'] ?? '')}`));
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
// ── Upload to S3 ───────────────────────────────────────────────────────
|
|
210
|
+
const presignedUrl = putUrlResp['presigned_url'];
|
|
211
|
+
if (!presignedUrl) {
|
|
212
|
+
console.error(chalk.red('Error: broker returned is_new=true but no presigned_url'));
|
|
213
|
+
process.exit(1);
|
|
214
|
+
}
|
|
215
|
+
if (!isJson) {
|
|
216
|
+
process.stderr.write(chalk.gray(` Uploading ${formatBytes(sizeBytes)} to S3…\n`));
|
|
217
|
+
}
|
|
218
|
+
let uploadResponse = await putToS3(presignedUrl, filePath, sizeBytes, contentType, contentHashBase64, consumerTag);
|
|
219
|
+
// ── Retry once on 403 (expired presigned URL) ──────────────────────────
|
|
220
|
+
// ec_presigned_url_expired_mid_upload
|
|
221
|
+
if (uploadResponse.status === 403) {
|
|
222
|
+
if (!isJson) {
|
|
223
|
+
process.stderr.write(chalk.gray(` Upload returned 403 — refreshing URL and retrying once…\n`));
|
|
224
|
+
}
|
|
225
|
+
const retryResp = (await api('POST', '/api/assets/put-url', putUrlBody, apiOpts));
|
|
226
|
+
const retryUrl = retryResp['presigned_url'];
|
|
227
|
+
if (retryUrl) {
|
|
228
|
+
uploadResponse = await putToS3(retryUrl, filePath, sizeBytes, contentType, contentHashBase64, consumerTag);
|
|
229
|
+
}
|
|
230
|
+
if (!uploadResponse.ok) {
|
|
231
|
+
const s3Body = await uploadResponse.text().catch(() => '');
|
|
232
|
+
console.error(chalk.red(`Error: Upload failed after 2 attempts (S3 ${uploadResponse.status})`));
|
|
233
|
+
if (s3Body)
|
|
234
|
+
console.error(chalk.gray(s3Body.slice(0, 500)));
|
|
235
|
+
process.exit(1);
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
else if (!uploadResponse.ok) {
|
|
239
|
+
const s3Body = await uploadResponse.text().catch(() => '');
|
|
240
|
+
let hint = '';
|
|
241
|
+
if (uploadResponse.status === 400) {
|
|
242
|
+
hint =
|
|
243
|
+
'\n Hint: SHA-256 of uploaded bytes did not match declared content_hash (S3 BadDigest)';
|
|
244
|
+
}
|
|
245
|
+
else if (uploadResponse.status === 403) {
|
|
246
|
+
hint =
|
|
247
|
+
'\n Hint: required headers may be missing or altered (x-amz-checksum-sha256, x-amz-tagging, content-length, content-type)';
|
|
248
|
+
}
|
|
249
|
+
console.error(chalk.red(`Error: S3 upload failed (${uploadResponse.status})${hint}`));
|
|
250
|
+
if (s3Body)
|
|
251
|
+
console.error(chalk.gray(s3Body.slice(0, 500)));
|
|
252
|
+
process.exit(1);
|
|
253
|
+
}
|
|
254
|
+
// ── Emit pointer ───────────────────────────────────────────────────────
|
|
255
|
+
const pointerObj = putUrlResp['pointer'];
|
|
256
|
+
const pointer = pointerFromApiResponse(pointerObj);
|
|
257
|
+
if (isJson) {
|
|
258
|
+
console.log(JSON.stringify(pointerObj, null, 2));
|
|
259
|
+
return;
|
|
260
|
+
}
|
|
261
|
+
if (emitPath) {
|
|
262
|
+
const existed = existsSync(emitPath);
|
|
263
|
+
writePointerFile(emitPath, pointer);
|
|
264
|
+
const tag = existed
|
|
265
|
+
? chalk.yellow('! overwrote existing pointer')
|
|
266
|
+
: chalk.green('✓ wrote pointer');
|
|
267
|
+
console.log(`${tag} ${emitPath}`);
|
|
268
|
+
console.log(` URI: ${String(pointerObj['uri'] ?? '')}`);
|
|
269
|
+
console.log(` Hash: ${String(pointerObj['content_hash'] ?? '')}`);
|
|
270
|
+
console.log(` Size: ${formatBytes(sizeBytes)}`);
|
|
271
|
+
console.log(` Consumer: ${consumerTag}`);
|
|
272
|
+
}
|
|
273
|
+
else {
|
|
274
|
+
// No --emit: print YAML to stdout
|
|
275
|
+
console.log(buildPointerContent(pointer));
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
catch (err) {
|
|
279
|
+
handleAssetApiError(err);
|
|
280
|
+
}
|
|
281
|
+
});
|
|
282
|
+
}
|
|
283
|
+
//# sourceMappingURL=put.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"put.js","sourceRoot":"","sources":["../../../src/commands/asset/put.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* F54 — fazemos asset show <pointer-path-or-uri>
|
|
3
|
+
*
|
|
4
|
+
* Resolves a .asset.yaml pointer file or raw fazemos-asset:// URI, calls
|
|
5
|
+
* GET /api/assets/metadata?uri=<url-encoded URI> to fetch live metadata, and
|
|
6
|
+
* prints it. Performs a live S3 HeadObject on the server side; lazy-commits
|
|
7
|
+
* any pending rows.
|
|
8
|
+
*
|
|
9
|
+
* The URI rides the `uri` query parameter (not the path) because the API
|
|
10
|
+
* Gateway HTTP API normalizes request paths — collapsing the `//` in
|
|
11
|
+
* fazemos-asset:// and percent-decoding — which corrupts the URI before the
|
|
12
|
+
* handler sees it. The rawQueryString is delivered untouched.
|
|
13
|
+
*
|
|
14
|
+
* Silent-canary surface (ec_rendered_permanent_asset_missing_in_s3):
|
|
15
|
+
* If s3_object_exists=false AND state=committed AND retention_class is a
|
|
16
|
+
* permanent class, the CLI prints a yellow warning so the operator can ping
|
|
17
|
+
* platform ops.
|
|
18
|
+
*
|
|
19
|
+
* Flags:
|
|
20
|
+
* --project <slug> Override active project for this call
|
|
21
|
+
* --json Output raw JSON metadata response
|
|
22
|
+
*/
|
|
23
|
+
import type { Command } from 'commander';
|
|
24
|
+
export declare function registerAssetShowCommand(asset: Command): void;
|