@google/adk 0.2.5 → 0.4.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/dist/cjs/a2a/part_converter_utils.js +210 -0
- package/dist/cjs/agents/active_streaming_tool.js +1 -1
- package/dist/cjs/agents/base_agent.js +46 -24
- package/dist/cjs/agents/base_llm_processor.js +1 -1
- package/dist/cjs/agents/callback_context.js +5 -2
- package/dist/cjs/agents/content_processor_utils.js +16 -8
- package/dist/cjs/agents/functions.js +81 -30
- package/dist/cjs/agents/instructions.js +1 -1
- package/dist/cjs/agents/invocation_context.js +1 -1
- package/dist/cjs/agents/live_request_queue.js +1 -1
- package/dist/cjs/agents/llm_agent.js +106 -62
- package/dist/cjs/agents/loop_agent.js +3 -2
- package/dist/cjs/agents/parallel_agent.js +4 -5
- package/dist/cjs/agents/readonly_context.js +13 -1
- package/dist/cjs/agents/run_config.js +2 -1
- package/dist/cjs/agents/sequential_agent.js +1 -1
- package/dist/cjs/agents/transcription_entry.js +1 -1
- package/dist/cjs/artifacts/base_artifact_service.js +1 -1
- package/dist/cjs/artifacts/file_artifact_service.js +491 -0
- package/dist/cjs/artifacts/gcs_artifact_service.js +145 -58
- package/dist/cjs/artifacts/in_memory_artifact_service.js +72 -10
- package/dist/cjs/artifacts/registry.js +55 -0
- package/dist/cjs/auth/auth_credential.js +1 -1
- package/dist/cjs/auth/auth_handler.js +4 -2
- package/dist/cjs/auth/auth_schemes.js +1 -1
- package/dist/cjs/auth/auth_tool.js +1 -1
- package/dist/cjs/auth/credential_service/base_credential_service.js +1 -1
- package/dist/cjs/auth/credential_service/in_memory_credential_service.js +1 -1
- package/dist/cjs/auth/exchanger/base_credential_exchanger.js +1 -1
- package/dist/cjs/auth/exchanger/credential_exchanger_registry.js +1 -1
- package/dist/cjs/code_executors/base_code_executor.js +4 -2
- package/dist/cjs/code_executors/built_in_code_executor.js +8 -4
- package/dist/cjs/code_executors/code_execution_utils.js +1 -1
- package/dist/cjs/code_executors/code_executor_context.js +6 -6
- package/dist/cjs/common.js +18 -1
- package/dist/cjs/events/event.js +34 -7
- package/dist/cjs/events/event_actions.js +2 -2
- package/dist/cjs/events/structured_events.js +105 -0
- package/dist/cjs/examples/base_example_provider.js +1 -1
- package/dist/cjs/examples/example.js +1 -1
- package/dist/cjs/examples/example_util.js +1 -1
- package/dist/cjs/index.js +54 -83
- package/dist/cjs/index_web.js +1 -1
- package/dist/cjs/memory/base_memory_service.js +1 -1
- package/dist/cjs/memory/in_memory_memory_service.js +4 -2
- package/dist/cjs/memory/memory_entry.js +1 -1
- package/dist/cjs/models/apigee_llm.js +182 -0
- package/dist/cjs/models/base_llm.js +9 -5
- package/dist/cjs/models/base_llm_connection.js +1 -1
- package/dist/cjs/models/gemini_llm_connection.js +2 -1
- package/dist/cjs/models/google_llm.js +73 -54
- package/dist/cjs/models/llm_request.js +1 -1
- package/dist/cjs/models/llm_response.js +1 -1
- package/dist/cjs/models/registry.js +3 -1
- package/dist/cjs/plugins/base_plugin.js +13 -1
- package/dist/cjs/plugins/logging_plugin.js +51 -14
- package/dist/cjs/plugins/plugin_manager.js +57 -25
- package/dist/cjs/plugins/security_plugin.js +2 -2
- package/dist/cjs/runner/in_memory_runner.js +1 -1
- package/dist/cjs/runner/runner.js +142 -96
- package/dist/cjs/sessions/base_session_service.js +53 -3
- package/dist/cjs/sessions/database_session_service.js +364 -0
- package/dist/cjs/sessions/db/operations.js +114 -0
- package/dist/cjs/sessions/db/schema.js +204 -0
- package/dist/cjs/sessions/in_memory_session_service.js +60 -34
- package/dist/cjs/sessions/registry.js +49 -0
- package/dist/cjs/sessions/session.js +1 -1
- package/dist/cjs/sessions/state.js +1 -1
- package/dist/cjs/telemetry/google_cloud.js +8 -10
- package/dist/cjs/telemetry/setup.js +16 -8
- package/dist/cjs/telemetry/tracing.js +38 -16
- package/dist/cjs/tools/agent_tool.js +9 -5
- package/dist/cjs/tools/base_tool.js +5 -3
- package/dist/cjs/tools/base_toolset.js +1 -1
- package/dist/cjs/tools/forwarding_artifact_service.js +18 -2
- package/dist/cjs/tools/function_tool.js +2 -3
- package/dist/cjs/tools/google_search_tool.js +2 -3
- package/dist/cjs/tools/long_running_tool.js +1 -1
- package/dist/cjs/tools/mcp/mcp_session_manager.js +17 -11
- package/dist/cjs/tools/mcp/mcp_tool.js +2 -4
- package/dist/cjs/tools/mcp/mcp_toolset.js +2 -2
- package/dist/cjs/tools/tool_confirmation.js +1 -1
- package/dist/cjs/tools/tool_context.js +1 -1
- package/dist/cjs/utils/client_labels.js +1 -1
- package/dist/cjs/utils/env_aware_utils.js +11 -2
- package/dist/cjs/utils/gemini_schema_util.js +10 -5
- package/dist/cjs/utils/logger.js +48 -4
- package/dist/cjs/utils/model_name.js +1 -1
- package/dist/cjs/utils/object_notation_utils.js +78 -0
- package/dist/cjs/utils/simple_zod_to_json.js +101 -142
- package/dist/cjs/utils/variant_utils.js +3 -9
- package/dist/cjs/version.js +2 -2
- package/dist/esm/a2a/part_converter_utils.js +171 -0
- package/dist/esm/agents/base_agent.js +50 -24
- package/dist/esm/agents/callback_context.js +4 -1
- package/dist/esm/agents/content_processor_utils.js +25 -9
- package/dist/esm/agents/functions.js +84 -29
- package/dist/esm/agents/llm_agent.js +110 -62
- package/dist/esm/agents/loop_agent.js +2 -1
- package/dist/esm/agents/parallel_agent.js +3 -4
- package/dist/esm/agents/readonly_context.js +12 -0
- package/dist/esm/agents/run_config.js +1 -0
- package/dist/esm/artifacts/file_artifact_service.js +451 -0
- package/dist/esm/artifacts/gcs_artifact_service.js +144 -57
- package/dist/esm/artifacts/in_memory_artifact_service.js +69 -8
- package/dist/esm/artifacts/registry.js +28 -0
- package/dist/esm/auth/auth_handler.js +3 -1
- package/dist/esm/code_executors/base_code_executor.js +3 -1
- package/dist/esm/code_executors/built_in_code_executor.js +7 -3
- package/dist/esm/code_executors/code_executor_context.js +5 -5
- package/dist/esm/common.js +12 -2
- package/dist/esm/events/event.js +30 -5
- package/dist/esm/events/event_actions.js +1 -1
- package/dist/esm/events/structured_events.js +74 -0
- package/dist/esm/index.js +18 -88
- package/dist/esm/memory/in_memory_memory_service.js +3 -1
- package/dist/esm/models/apigee_llm.js +152 -0
- package/dist/esm/models/base_llm.js +8 -4
- package/dist/esm/models/gemini_llm_connection.js +1 -0
- package/dist/esm/models/google_llm.js +75 -53
- package/dist/esm/models/registry.js +2 -0
- package/dist/esm/plugins/base_plugin.js +12 -0
- package/dist/esm/plugins/logging_plugin.js +55 -14
- package/dist/esm/plugins/plugin_manager.js +56 -24
- package/dist/esm/plugins/security_plugin.js +1 -1
- package/dist/esm/runner/runner.js +145 -96
- package/dist/esm/sessions/base_session_service.js +49 -1
- package/dist/esm/sessions/database_session_service.js +350 -0
- package/dist/esm/sessions/db/operations.js +87 -0
- package/dist/esm/sessions/db/schema.js +172 -0
- package/dist/esm/sessions/in_memory_session_service.js +61 -33
- package/dist/esm/sessions/registry.js +25 -0
- package/dist/esm/telemetry/google_cloud.js +7 -9
- package/dist/esm/telemetry/setup.js +23 -9
- package/dist/esm/telemetry/tracing.js +37 -15
- package/dist/esm/tools/agent_tool.js +8 -4
- package/dist/esm/tools/base_tool.js +4 -2
- package/dist/esm/tools/forwarding_artifact_service.js +17 -1
- package/dist/esm/tools/function_tool.js +1 -2
- package/dist/esm/tools/google_search_tool.js +2 -5
- package/dist/esm/tools/long_running_tool.js +3 -1
- package/dist/esm/tools/mcp/mcp_session_manager.js +22 -12
- package/dist/esm/tools/mcp/mcp_tool.js +1 -3
- package/dist/esm/tools/mcp/mcp_toolset.js +1 -1
- package/dist/esm/utils/env_aware_utils.js +9 -1
- package/dist/esm/utils/gemini_schema_util.js +9 -4
- package/dist/esm/utils/logger.js +43 -2
- package/dist/esm/utils/object_notation_utils.js +47 -0
- package/dist/esm/utils/simple_zod_to_json.js +102 -141
- package/dist/esm/utils/variant_utils.js +1 -7
- package/dist/esm/version.js +1 -1
- package/dist/types/a2a/part_converter_utils.d.ts +47 -0
- package/dist/types/agents/base_agent.d.ts +2 -1
- package/dist/types/agents/callback_context.d.ts +1 -1
- package/dist/types/agents/llm_agent.d.ts +12 -12
- package/dist/types/agents/loop_agent.d.ts +1 -1
- package/dist/types/agents/parallel_agent.d.ts +1 -1
- package/dist/types/agents/readonly_context.d.ts +8 -0
- package/dist/types/agents/run_config.d.ts +6 -0
- package/dist/types/artifacts/base_artifact_service.d.ts +31 -0
- package/dist/types/artifacts/file_artifact_service.d.ts +43 -0
- package/dist/types/artifacts/gcs_artifact_service.d.ts +3 -1
- package/dist/types/artifacts/in_memory_artifact_service.d.ts +8 -5
- package/dist/types/artifacts/registry.d.ts +7 -0
- package/dist/types/code_executors/built_in_code_executor.d.ts +1 -1
- package/dist/types/code_executors/code_executor_context.d.ts +2 -4
- package/dist/types/common.d.ts +13 -3
- package/dist/types/events/event.d.ts +15 -1
- package/dist/types/events/event_actions.d.ts +1 -1
- package/dist/types/events/structured_events.d.ts +106 -0
- package/dist/types/index.d.ts +7 -3
- package/dist/types/models/apigee_llm.d.ts +59 -0
- package/dist/types/models/base_llm_connection.d.ts +1 -1
- package/dist/types/models/google_llm.d.ts +5 -2
- package/dist/types/models/llm_response.d.ts +1 -1
- package/dist/types/plugins/logging_plugin.d.ts +12 -12
- package/dist/types/plugins/plugin_manager.d.ts +12 -12
- package/dist/types/plugins/security_plugin.d.ts +1 -1
- package/dist/types/runner/runner.d.ts +16 -1
- package/dist/types/sessions/base_session_service.d.ts +20 -0
- package/dist/types/sessions/database_session_service.d.ts +31 -0
- package/dist/types/sessions/db/operations.d.ts +29 -0
- package/dist/types/sessions/db/schema.d.ts +45 -0
- package/dist/types/sessions/in_memory_session_service.d.ts +9 -6
- package/dist/types/sessions/registry.d.ts +7 -0
- package/dist/types/telemetry/setup.d.ts +1 -1
- package/dist/types/telemetry/tracing.d.ts +7 -6
- package/dist/types/tools/agent_tool.d.ts +1 -1
- package/dist/types/tools/base_tool.d.ts +1 -1
- package/dist/types/tools/base_toolset.d.ts +2 -1
- package/dist/types/tools/forwarding_artifact_service.d.ts +4 -2
- package/dist/types/tools/function_tool.d.ts +4 -3
- package/dist/types/tools/google_search_tool.d.ts +3 -3
- package/dist/types/tools/mcp/mcp_session_manager.d.ts +10 -3
- package/dist/types/tools/mcp/mcp_toolset.d.ts +1 -2
- package/dist/types/utils/env_aware_utils.d.ts +7 -0
- package/dist/types/utils/gemini_schema_util.d.ts +4 -12
- package/dist/types/utils/logger.d.ts +11 -10
- package/dist/types/utils/object_notation_utils.d.ts +21 -0
- package/dist/types/utils/simple_zod_to_json.d.ts +5 -4
- package/dist/types/version.d.ts +1 -1
- package/dist/web/a2a/part_converter_utils.js +171 -0
- package/dist/web/agents/base_agent.js +96 -35
- package/dist/web/agents/callback_context.js +4 -1
- package/dist/web/agents/content_processor_utils.js +25 -9
- package/dist/web/agents/functions.js +84 -29
- package/dist/web/agents/llm_agent.js +166 -83
- package/dist/web/agents/loop_agent.js +2 -1
- package/dist/web/agents/parallel_agent.js +3 -4
- package/dist/web/agents/readonly_context.js +12 -0
- package/dist/web/agents/run_config.js +2 -1
- package/dist/web/artifacts/file_artifact_service.js +506 -0
- package/dist/web/artifacts/gcs_artifact_service.js +139 -54
- package/dist/web/artifacts/in_memory_artifact_service.js +69 -8
- package/dist/web/artifacts/registry.js +28 -0
- package/dist/web/auth/auth_handler.js +3 -1
- package/dist/web/code_executors/base_code_executor.js +3 -1
- package/dist/web/code_executors/built_in_code_executor.js +7 -3
- package/dist/web/code_executors/code_executor_context.js +5 -5
- package/dist/web/common.js +12 -2
- package/dist/web/events/event.js +30 -5
- package/dist/web/events/event_actions.js +1 -1
- package/dist/web/events/structured_events.js +74 -0
- package/dist/web/index.js +18 -8
- package/dist/web/memory/in_memory_memory_service.js +3 -1
- package/dist/web/models/apigee_llm.js +219 -0
- package/dist/web/models/base_llm.js +8 -4
- package/dist/web/models/gemini_llm_connection.js +1 -0
- package/dist/web/models/google_llm.js +75 -50
- package/dist/web/models/registry.js +2 -0
- package/dist/web/plugins/base_plugin.js +12 -0
- package/dist/web/plugins/logging_plugin.js +55 -14
- package/dist/web/plugins/plugin_manager.js +56 -24
- package/dist/web/plugins/security_plugin.js +1 -1
- package/dist/web/runner/runner.js +192 -108
- package/dist/web/sessions/base_session_service.js +49 -1
- package/dist/web/sessions/database_session_service.js +368 -0
- package/dist/web/sessions/db/operations.js +87 -0
- package/dist/web/sessions/db/schema.js +172 -0
- package/dist/web/sessions/in_memory_session_service.js +61 -33
- package/dist/web/sessions/registry.js +25 -0
- package/dist/web/telemetry/google_cloud.js +7 -9
- package/dist/web/telemetry/setup.js +23 -9
- package/dist/web/telemetry/tracing.js +37 -15
- package/dist/web/tools/agent_tool.js +8 -4
- package/dist/web/tools/base_tool.js +4 -2
- package/dist/web/tools/forwarding_artifact_service.js +17 -1
- package/dist/web/tools/function_tool.js +1 -2
- package/dist/web/tools/google_search_tool.js +2 -5
- package/dist/web/tools/long_running_tool.js +3 -1
- package/dist/web/tools/mcp/mcp_session_manager.js +22 -12
- package/dist/web/tools/mcp/mcp_tool.js +1 -3
- package/dist/web/tools/mcp/mcp_toolset.js +1 -1
- package/dist/web/utils/env_aware_utils.js +9 -1
- package/dist/web/utils/gemini_schema_util.js +9 -4
- package/dist/web/utils/logger.js +43 -2
- package/dist/web/utils/object_notation_utils.js +47 -0
- package/dist/web/utils/simple_zod_to_json.js +102 -155
- package/dist/web/utils/variant_utils.js +1 -7
- package/dist/web/version.js +1 -1
- package/package.json +16 -5
- package/dist/cjs/index.js.map +0 -7
- package/dist/esm/index.js.map +0 -7
- package/dist/web/index.js.map +0 -7
|
@@ -0,0 +1,506 @@
|
|
|
1
|
+
var __knownSymbol = (name, symbol) => (symbol = Symbol[name]) ? symbol : Symbol.for("Symbol." + name);
|
|
2
|
+
var __await = function(promise, isYieldStar) {
|
|
3
|
+
this[0] = promise;
|
|
4
|
+
this[1] = isYieldStar;
|
|
5
|
+
};
|
|
6
|
+
var __asyncGenerator = (__this, __arguments, generator) => {
|
|
7
|
+
var resume = (k, v, yes, no) => {
|
|
8
|
+
try {
|
|
9
|
+
var x = generator[k](v), isAwait = (v = x.value) instanceof __await, done = x.done;
|
|
10
|
+
Promise.resolve(isAwait ? v[0] : v).then((y) => isAwait ? resume(k === "return" ? k : "next", v[1] ? { done: y.done, value: y.value } : y, yes, no) : yes({ value: y, done })).catch((e) => resume("throw", e, yes, no));
|
|
11
|
+
} catch (e) {
|
|
12
|
+
no(e);
|
|
13
|
+
}
|
|
14
|
+
}, method = (k) => it[k] = (x) => new Promise((yes, no) => resume(k, x, yes, no)), it = {};
|
|
15
|
+
return generator = generator.apply(__this, __arguments), it[__knownSymbol("asyncIterator")] = () => it, method("next"), method("throw"), method("return"), it;
|
|
16
|
+
};
|
|
17
|
+
var __forAwait = (obj, it, method) => (it = obj[__knownSymbol("asyncIterator")]) ? it.call(obj) : (obj = obj[__knownSymbol("iterator")](), it = {}, method = (key, fn) => (fn = obj[key]) && (it[key] = (arg) => new Promise((yes, no, done) => (arg = fn.call(obj, arg), done = arg.done, Promise.resolve(arg.value).then((value) => yes({ value, done }), no)))), method("next"), method("return"), it);
|
|
18
|
+
/**
|
|
19
|
+
* @license
|
|
20
|
+
* Copyright 2026 Google LLC
|
|
21
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
22
|
+
*/
|
|
23
|
+
import * as fs from "fs/promises";
|
|
24
|
+
import * as path from "path";
|
|
25
|
+
import { fileURLToPath, pathToFileURL } from "url";
|
|
26
|
+
import { logger } from "../utils/logger.js";
|
|
27
|
+
const USER_NAMESPACE_PREFIX = "user:";
|
|
28
|
+
class FileArtifactService {
|
|
29
|
+
constructor(rootDirOrUri) {
|
|
30
|
+
try {
|
|
31
|
+
const rootDir = rootDirOrUri.startsWith("file://") ? fileURLToPath(rootDirOrUri) : rootDirOrUri;
|
|
32
|
+
this.rootDir = path.resolve(rootDir);
|
|
33
|
+
} catch (e) {
|
|
34
|
+
throw new Error("Invalid root directory: ".concat(rootDirOrUri), { cause: e });
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
async saveArtifact({
|
|
38
|
+
userId,
|
|
39
|
+
sessionId,
|
|
40
|
+
filename,
|
|
41
|
+
artifact,
|
|
42
|
+
customMetadata
|
|
43
|
+
}) {
|
|
44
|
+
if (!artifact.inlineData && !artifact.text) {
|
|
45
|
+
throw new Error("Artifact must have either inlineData or text content.");
|
|
46
|
+
}
|
|
47
|
+
const artifactDir = getArtifactDir(
|
|
48
|
+
this.rootDir,
|
|
49
|
+
userId,
|
|
50
|
+
sessionId,
|
|
51
|
+
filename
|
|
52
|
+
);
|
|
53
|
+
await fs.mkdir(artifactDir, { recursive: true });
|
|
54
|
+
const versions = await getArtifactVersionsFromDir(artifactDir);
|
|
55
|
+
const nextVersion = versions.length > 0 ? versions[versions.length - 1] + 1 : 0;
|
|
56
|
+
const versionsDir = getVersionsDir(artifactDir);
|
|
57
|
+
const versionDir = path.join(versionsDir, nextVersion.toString());
|
|
58
|
+
await fs.mkdir(versionDir, { recursive: true });
|
|
59
|
+
const storedFilename = path.basename(artifactDir);
|
|
60
|
+
const contentPath = path.join(versionDir, storedFilename);
|
|
61
|
+
let mimeType;
|
|
62
|
+
if (artifact.inlineData) {
|
|
63
|
+
const data = artifact.inlineData.data || "";
|
|
64
|
+
await fs.writeFile(contentPath, Buffer.from(data, "base64"));
|
|
65
|
+
mimeType = artifact.inlineData.mimeType || "application/octet-stream";
|
|
66
|
+
} else if (artifact.text !== void 0) {
|
|
67
|
+
await fs.writeFile(contentPath, artifact.text, "utf-8");
|
|
68
|
+
}
|
|
69
|
+
const canonicalUri = await getCanonicalUri(
|
|
70
|
+
this.rootDir,
|
|
71
|
+
userId,
|
|
72
|
+
sessionId,
|
|
73
|
+
filename,
|
|
74
|
+
nextVersion
|
|
75
|
+
);
|
|
76
|
+
const metadata = {
|
|
77
|
+
fileName: filename,
|
|
78
|
+
mimeType,
|
|
79
|
+
version: nextVersion,
|
|
80
|
+
canonicalUri,
|
|
81
|
+
customMetadata
|
|
82
|
+
};
|
|
83
|
+
await writeMetadata(path.join(versionDir, "metadata.json"), metadata);
|
|
84
|
+
return nextVersion;
|
|
85
|
+
}
|
|
86
|
+
async loadArtifact({
|
|
87
|
+
userId,
|
|
88
|
+
sessionId,
|
|
89
|
+
filename,
|
|
90
|
+
version
|
|
91
|
+
}) {
|
|
92
|
+
try {
|
|
93
|
+
const artifactDir = getArtifactDir(
|
|
94
|
+
this.rootDir,
|
|
95
|
+
userId,
|
|
96
|
+
sessionId,
|
|
97
|
+
filename
|
|
98
|
+
);
|
|
99
|
+
try {
|
|
100
|
+
await fs.access(artifactDir);
|
|
101
|
+
} catch (e) {
|
|
102
|
+
logger.warn(
|
|
103
|
+
"[FileArtifactService] loadArtifact: Artifact ".concat(filename, " not found"),
|
|
104
|
+
e
|
|
105
|
+
);
|
|
106
|
+
return void 0;
|
|
107
|
+
}
|
|
108
|
+
const versions = await getArtifactVersionsFromDir(artifactDir);
|
|
109
|
+
if (versions.length === 0) {
|
|
110
|
+
return void 0;
|
|
111
|
+
}
|
|
112
|
+
let versionToLoad;
|
|
113
|
+
if (version === void 0) {
|
|
114
|
+
versionToLoad = versions[versions.length - 1];
|
|
115
|
+
} else {
|
|
116
|
+
if (!versions.includes(version)) {
|
|
117
|
+
logger.warn(
|
|
118
|
+
"[FileArtifactService] loadArtifact: Artifact ".concat(filename, " version ").concat(version, " not found")
|
|
119
|
+
);
|
|
120
|
+
return void 0;
|
|
121
|
+
}
|
|
122
|
+
versionToLoad = version;
|
|
123
|
+
}
|
|
124
|
+
const versionDir = path.join(
|
|
125
|
+
getVersionsDir(artifactDir),
|
|
126
|
+
versionToLoad.toString()
|
|
127
|
+
);
|
|
128
|
+
const metadataPath = path.join(versionDir, "metadata.json");
|
|
129
|
+
const metadata = await readMetadata(metadataPath);
|
|
130
|
+
const storedFilename = path.basename(artifactDir);
|
|
131
|
+
let contentPath = path.join(versionDir, storedFilename);
|
|
132
|
+
if (metadata.canonicalUri) {
|
|
133
|
+
const uriPath = fileUriToPath(metadata.canonicalUri);
|
|
134
|
+
if (uriPath) {
|
|
135
|
+
try {
|
|
136
|
+
await fs.access(uriPath);
|
|
137
|
+
contentPath = uriPath;
|
|
138
|
+
} catch (e) {
|
|
139
|
+
logger.warn(
|
|
140
|
+
"[FileArtifactService] loadArtifact: Artifact ".concat(filename, " missing at ").concat(uriPath, ", falling back to content path ").concat(contentPath)
|
|
141
|
+
);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
if (metadata.mimeType) {
|
|
146
|
+
try {
|
|
147
|
+
const data = await fs.readFile(contentPath);
|
|
148
|
+
return {
|
|
149
|
+
inlineData: {
|
|
150
|
+
mimeType: metadata.mimeType,
|
|
151
|
+
data: data.toString("base64")
|
|
152
|
+
}
|
|
153
|
+
};
|
|
154
|
+
} catch (e) {
|
|
155
|
+
logger.warn(
|
|
156
|
+
"[FileArtifactService] loadArtifact: Artifact ".concat(filename, " missing at ").concat(contentPath)
|
|
157
|
+
);
|
|
158
|
+
return void 0;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
try {
|
|
162
|
+
const text = await fs.readFile(contentPath, "utf-8");
|
|
163
|
+
return { text };
|
|
164
|
+
} catch (e) {
|
|
165
|
+
logger.warn(
|
|
166
|
+
"[FileArtifactService] loadArtifact: Text artifact ".concat(filename, " missing at ").concat(contentPath)
|
|
167
|
+
);
|
|
168
|
+
return void 0;
|
|
169
|
+
}
|
|
170
|
+
} catch (e) {
|
|
171
|
+
logger.error(
|
|
172
|
+
"[FileArtifactService] loadArtifact: Error loading artifact ".concat(filename),
|
|
173
|
+
e
|
|
174
|
+
);
|
|
175
|
+
return void 0;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
async listArtifactKeys({
|
|
179
|
+
userId,
|
|
180
|
+
sessionId
|
|
181
|
+
}) {
|
|
182
|
+
const filenames = /* @__PURE__ */ new Set();
|
|
183
|
+
const userRoot = getUserRoot(this.rootDir, userId);
|
|
184
|
+
const sessionRoot = getSessionArtifactsDir(userRoot, sessionId);
|
|
185
|
+
try {
|
|
186
|
+
for (var iter = __forAwait(iterateArtifactDirs(sessionRoot)), more, temp, error; more = !(temp = await iter.next()).done; more = false) {
|
|
187
|
+
const artifactDir = temp.value;
|
|
188
|
+
const metadata = await getLatestMetadata(artifactDir);
|
|
189
|
+
if (metadata == null ? void 0 : metadata.fileName) {
|
|
190
|
+
filenames.add(metadata.fileName);
|
|
191
|
+
} else {
|
|
192
|
+
const rel = path.relative(sessionRoot, artifactDir);
|
|
193
|
+
filenames.add(asPosixPath(rel));
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
} catch (temp) {
|
|
197
|
+
error = [temp];
|
|
198
|
+
} finally {
|
|
199
|
+
try {
|
|
200
|
+
more && (temp = iter.return) && await temp.call(iter);
|
|
201
|
+
} finally {
|
|
202
|
+
if (error)
|
|
203
|
+
throw error[0];
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
const artifactsRoot = getUserArtifactsDir(userRoot);
|
|
207
|
+
try {
|
|
208
|
+
for (var iter2 = __forAwait(iterateArtifactDirs(artifactsRoot)), more2, temp2, error2; more2 = !(temp2 = await iter2.next()).done; more2 = false) {
|
|
209
|
+
const artifactDir = temp2.value;
|
|
210
|
+
const metadata = await getLatestMetadata(artifactDir);
|
|
211
|
+
if (metadata == null ? void 0 : metadata.fileName) {
|
|
212
|
+
filenames.add(metadata.fileName);
|
|
213
|
+
} else {
|
|
214
|
+
const rel = path.relative(artifactsRoot, artifactDir);
|
|
215
|
+
filenames.add("".concat(USER_NAMESPACE_PREFIX).concat(asPosixPath(rel)));
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
} catch (temp2) {
|
|
219
|
+
error2 = [temp2];
|
|
220
|
+
} finally {
|
|
221
|
+
try {
|
|
222
|
+
more2 && (temp2 = iter2.return) && await temp2.call(iter2);
|
|
223
|
+
} finally {
|
|
224
|
+
if (error2)
|
|
225
|
+
throw error2[0];
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
return Array.from(filenames).sort();
|
|
229
|
+
}
|
|
230
|
+
async deleteArtifact({
|
|
231
|
+
userId,
|
|
232
|
+
sessionId,
|
|
233
|
+
filename
|
|
234
|
+
}) {
|
|
235
|
+
try {
|
|
236
|
+
const artifactDir = getArtifactDir(
|
|
237
|
+
this.rootDir,
|
|
238
|
+
userId,
|
|
239
|
+
sessionId,
|
|
240
|
+
filename
|
|
241
|
+
);
|
|
242
|
+
await fs.rm(artifactDir, { recursive: true, force: true });
|
|
243
|
+
} catch (e) {
|
|
244
|
+
logger.warn(
|
|
245
|
+
"[FileArtifactService] deleteArtifact: Failed to delete artifact ".concat(filename),
|
|
246
|
+
e
|
|
247
|
+
);
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
async listVersions({
|
|
251
|
+
userId,
|
|
252
|
+
sessionId,
|
|
253
|
+
filename
|
|
254
|
+
}) {
|
|
255
|
+
try {
|
|
256
|
+
const artifactDir = getArtifactDir(
|
|
257
|
+
this.rootDir,
|
|
258
|
+
userId,
|
|
259
|
+
sessionId,
|
|
260
|
+
filename
|
|
261
|
+
);
|
|
262
|
+
return await getArtifactVersionsFromDir(artifactDir);
|
|
263
|
+
} catch (e) {
|
|
264
|
+
logger.warn(
|
|
265
|
+
"[FileArtifactService] listVersions: Failed to list versions for artifact ".concat(filename),
|
|
266
|
+
e
|
|
267
|
+
);
|
|
268
|
+
return [];
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
async listArtifactVersions({
|
|
272
|
+
userId,
|
|
273
|
+
sessionId,
|
|
274
|
+
filename
|
|
275
|
+
}) {
|
|
276
|
+
try {
|
|
277
|
+
const artifactDir = getArtifactDir(
|
|
278
|
+
this.rootDir,
|
|
279
|
+
userId,
|
|
280
|
+
sessionId,
|
|
281
|
+
filename
|
|
282
|
+
);
|
|
283
|
+
const versions = await getArtifactVersionsFromDir(artifactDir);
|
|
284
|
+
const artifactVersions = [];
|
|
285
|
+
for (const version of versions) {
|
|
286
|
+
const metadataPath = path.join(
|
|
287
|
+
getVersionsDir(artifactDir),
|
|
288
|
+
version.toString(),
|
|
289
|
+
"metadata.json"
|
|
290
|
+
);
|
|
291
|
+
try {
|
|
292
|
+
const metadata = await readMetadata(metadataPath);
|
|
293
|
+
artifactVersions.push(metadata);
|
|
294
|
+
} catch (e) {
|
|
295
|
+
logger.warn(
|
|
296
|
+
"[FileArtifactService] listArtifactVersions: Failed to read artifact version ".concat(version, " at ").concat(artifactDir),
|
|
297
|
+
e
|
|
298
|
+
);
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
return artifactVersions;
|
|
302
|
+
} catch (e) {
|
|
303
|
+
logger.warn(
|
|
304
|
+
"[FileArtifactService] listArtifactVersions: Failed to list artifact versions for userId: ".concat(userId, " sessionId: ").concat(sessionId, " filename: ").concat(filename),
|
|
305
|
+
e
|
|
306
|
+
);
|
|
307
|
+
return [];
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
async getArtifactVersion({
|
|
311
|
+
userId,
|
|
312
|
+
sessionId,
|
|
313
|
+
filename,
|
|
314
|
+
version
|
|
315
|
+
}) {
|
|
316
|
+
try {
|
|
317
|
+
const artifactDir = getArtifactDir(
|
|
318
|
+
this.rootDir,
|
|
319
|
+
userId,
|
|
320
|
+
sessionId,
|
|
321
|
+
filename
|
|
322
|
+
);
|
|
323
|
+
const versions = await getArtifactVersionsFromDir(artifactDir);
|
|
324
|
+
if (versions.length === 0) {
|
|
325
|
+
return void 0;
|
|
326
|
+
}
|
|
327
|
+
let versionToRead;
|
|
328
|
+
if (version === void 0) {
|
|
329
|
+
versionToRead = versions[versions.length - 1];
|
|
330
|
+
} else {
|
|
331
|
+
if (!versions.includes(version)) {
|
|
332
|
+
return void 0;
|
|
333
|
+
}
|
|
334
|
+
versionToRead = version;
|
|
335
|
+
}
|
|
336
|
+
const metadataPath = path.join(
|
|
337
|
+
getVersionsDir(artifactDir),
|
|
338
|
+
versionToRead.toString(),
|
|
339
|
+
"metadata.json"
|
|
340
|
+
);
|
|
341
|
+
return await readMetadata(metadataPath);
|
|
342
|
+
} catch (e) {
|
|
343
|
+
logger.warn(
|
|
344
|
+
"[FileArtifactService] getArtifactVersion: Failed to get artifact version for userId: ".concat(userId, " sessionId: ").concat(sessionId, " filename: ").concat(filename, " version: ").concat(version),
|
|
345
|
+
e
|
|
346
|
+
);
|
|
347
|
+
return void 0;
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
function getUserRoot(rootDir, userId) {
|
|
352
|
+
return path.join(rootDir, "users", userId);
|
|
353
|
+
}
|
|
354
|
+
function isUserScoped(sessionId, filename) {
|
|
355
|
+
return !sessionId || filename.startsWith(USER_NAMESPACE_PREFIX);
|
|
356
|
+
}
|
|
357
|
+
function getUserArtifactsDir(userRoot) {
|
|
358
|
+
return path.join(userRoot, "artifacts");
|
|
359
|
+
}
|
|
360
|
+
function getSessionArtifactsDir(baseRoot, sessionId) {
|
|
361
|
+
return path.join(baseRoot, "sessions", sessionId, "artifacts");
|
|
362
|
+
}
|
|
363
|
+
function getVersionsDir(artifactDir) {
|
|
364
|
+
return path.join(artifactDir, "versions");
|
|
365
|
+
}
|
|
366
|
+
function getArtifactDir(rootDir, userId, sessionId, filename) {
|
|
367
|
+
const userRoot = getUserRoot(rootDir, userId);
|
|
368
|
+
let scopeRoot;
|
|
369
|
+
if (isUserScoped(sessionId, filename)) {
|
|
370
|
+
scopeRoot = getUserArtifactsDir(userRoot);
|
|
371
|
+
} else {
|
|
372
|
+
if (!sessionId) {
|
|
373
|
+
throw new Error(
|
|
374
|
+
"Session ID must be provided for session-scoped artifacts."
|
|
375
|
+
);
|
|
376
|
+
}
|
|
377
|
+
scopeRoot = getSessionArtifactsDir(userRoot, sessionId);
|
|
378
|
+
}
|
|
379
|
+
let cleanFilename = filename;
|
|
380
|
+
if (cleanFilename.startsWith(USER_NAMESPACE_PREFIX)) {
|
|
381
|
+
cleanFilename = cleanFilename.substring(USER_NAMESPACE_PREFIX.length);
|
|
382
|
+
}
|
|
383
|
+
cleanFilename = cleanFilename.trim();
|
|
384
|
+
if (path.isAbsolute(cleanFilename)) {
|
|
385
|
+
throw new Error("Absolute artifact filename ".concat(filename, " is not permitted."));
|
|
386
|
+
}
|
|
387
|
+
const artifactDir = path.resolve(scopeRoot, cleanFilename);
|
|
388
|
+
const relative = path.relative(scopeRoot, artifactDir);
|
|
389
|
+
if (relative.startsWith("..") || path.isAbsolute(relative)) {
|
|
390
|
+
throw new Error("Artifact filename ".concat(filename, " escapes storage directory."));
|
|
391
|
+
}
|
|
392
|
+
if (relative === "" || relative === ".") {
|
|
393
|
+
return path.join(scopeRoot, "artifact");
|
|
394
|
+
}
|
|
395
|
+
return artifactDir;
|
|
396
|
+
}
|
|
397
|
+
async function getArtifactVersionsFromDir(artifactDir) {
|
|
398
|
+
const versionsDir = getVersionsDir(artifactDir);
|
|
399
|
+
try {
|
|
400
|
+
const files = await fs.readdir(versionsDir, { withFileTypes: true });
|
|
401
|
+
const versions = files.filter((dirent) => dirent.isDirectory()).map((dirent) => parseInt(dirent.name, 10)).filter((v) => !isNaN(v));
|
|
402
|
+
return versions.sort((a, b) => a - b);
|
|
403
|
+
} catch (e) {
|
|
404
|
+
logger.warn(
|
|
405
|
+
"[FileArtifactService] getArtifactVersionsFromDir: Failed to list artifact versions from ".concat(artifactDir),
|
|
406
|
+
e
|
|
407
|
+
);
|
|
408
|
+
return [];
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
async function getCanonicalUri(rootDir, userId, sessionId, filename, version) {
|
|
412
|
+
const artifactDir = await getArtifactDir(
|
|
413
|
+
rootDir,
|
|
414
|
+
userId,
|
|
415
|
+
sessionId,
|
|
416
|
+
filename
|
|
417
|
+
);
|
|
418
|
+
const storedFilename = path.basename(artifactDir);
|
|
419
|
+
const versionsDir = getVersionsDir(artifactDir);
|
|
420
|
+
const payloadPath = path.join(
|
|
421
|
+
versionsDir,
|
|
422
|
+
version.toString(),
|
|
423
|
+
storedFilename
|
|
424
|
+
);
|
|
425
|
+
return pathToFileURL(payloadPath).toString();
|
|
426
|
+
}
|
|
427
|
+
async function writeMetadata(metadataPath, metadata) {
|
|
428
|
+
await fs.writeFile(metadataPath, JSON.stringify(metadata, null, 2), "utf-8");
|
|
429
|
+
}
|
|
430
|
+
async function readMetadata(metadataPath) {
|
|
431
|
+
const content = await fs.readFile(metadataPath, "utf-8");
|
|
432
|
+
return JSON.parse(content);
|
|
433
|
+
}
|
|
434
|
+
async function getLatestMetadata(artifactDir) {
|
|
435
|
+
const versions = await getArtifactVersionsFromDir(artifactDir);
|
|
436
|
+
if (versions.length === 0) {
|
|
437
|
+
return void 0;
|
|
438
|
+
}
|
|
439
|
+
const latestVersion = versions[versions.length - 1];
|
|
440
|
+
const metadataPath = path.join(
|
|
441
|
+
getVersionsDir(artifactDir),
|
|
442
|
+
latestVersion.toString(),
|
|
443
|
+
"metadata.json"
|
|
444
|
+
);
|
|
445
|
+
try {
|
|
446
|
+
return await readMetadata(metadataPath);
|
|
447
|
+
} catch (e) {
|
|
448
|
+
logger.warn(
|
|
449
|
+
"[FileArtifactService] getLatestMetadata: Failed to read metadata from ".concat(metadataPath),
|
|
450
|
+
e
|
|
451
|
+
);
|
|
452
|
+
return void 0;
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
function iterateArtifactDirs(dir) {
|
|
456
|
+
return __asyncGenerator(this, null, function* () {
|
|
457
|
+
try {
|
|
458
|
+
const entries = yield new __await(fs.readdir(dir, { withFileTypes: true }));
|
|
459
|
+
const hasVersions = entries.some(
|
|
460
|
+
(e) => e.isDirectory() && e.name === "versions"
|
|
461
|
+
);
|
|
462
|
+
if (hasVersions) {
|
|
463
|
+
yield dir;
|
|
464
|
+
return;
|
|
465
|
+
}
|
|
466
|
+
for (const entry of entries) {
|
|
467
|
+
if (entry.isDirectory()) {
|
|
468
|
+
const subdir = path.join(dir, entry.name);
|
|
469
|
+
try {
|
|
470
|
+
for (var iter = __forAwait(iterateArtifactDirs(subdir)), more, temp, error; more = !(temp = yield new __await(iter.next())).done; more = false) {
|
|
471
|
+
const foundDir = temp.value;
|
|
472
|
+
yield foundDir;
|
|
473
|
+
}
|
|
474
|
+
} catch (temp) {
|
|
475
|
+
error = [temp];
|
|
476
|
+
} finally {
|
|
477
|
+
try {
|
|
478
|
+
more && (temp = iter.return) && (yield new __await(temp.call(iter)));
|
|
479
|
+
} finally {
|
|
480
|
+
if (error)
|
|
481
|
+
throw error[0];
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
} catch (_e) {
|
|
487
|
+
}
|
|
488
|
+
});
|
|
489
|
+
}
|
|
490
|
+
function fileUriToPath(uri) {
|
|
491
|
+
try {
|
|
492
|
+
return fileURLToPath(uri);
|
|
493
|
+
} catch (e) {
|
|
494
|
+
logger.warn(
|
|
495
|
+
"[FileArtifactService] fileUriToPath: Failed to convert file URI to path: ".concat(uri),
|
|
496
|
+
e
|
|
497
|
+
);
|
|
498
|
+
return void 0;
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
function asPosixPath(p) {
|
|
502
|
+
return p.split(path.sep).join("/");
|
|
503
|
+
}
|
|
504
|
+
export {
|
|
505
|
+
FileArtifactService
|
|
506
|
+
};
|