@kanyun-ai-infra/agenthub 0.3.0 → 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/README.md CHANGED
@@ -54,6 +54,16 @@ await agenthub.agents.create({
54
54
  defaults: {
55
55
  model: "claude-opus-4-7",
56
56
  systemPrompt: "You are the Acme support agent.",
57
+ agentPackage: {
58
+ format: "claude_code",
59
+ source: {
60
+ kind: "oss",
61
+ url: "https://bucket.oss-cn-beijing.aliyuncs.com/pilot/agent-packages/support-bot.tar.gz",
62
+ sha256: "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
63
+ sizeBytes: 4096,
64
+ },
65
+ entryCommand: "报告",
66
+ },
57
67
  },
58
68
  });
59
69
 
@@ -126,6 +136,7 @@ Agents 和 runtime templates 都是 **project-scoped**。Version 必须在同一
126
136
  | `create({ slug, displayName, description?, defaultRuntimeTemplateRefName? })` | 创建 Project。slug 重复时返回 `409 PROJECT_SLUG_CONFLICT`。 |
127
137
  | `list()` | 列出 token 有效 scope 内的 Project。 |
128
138
  | `get(projectId)` | 查询单个 Project。 |
139
+ | `delete(projectId)` | 软删(停用)Project:清空 owner / members、关闭集成。**owner-only**(需 `project:settings`)。系统项目不可删。返回 `{ action: "deactivated", projectId }`。 |
129
140
 
130
141
  ### `agenthub.agents`(别名 `agenthub.workloads`)
131
142
 
@@ -137,8 +148,8 @@ Agents 和 runtime templates 都是 **project-scoped**。Version 必须在同一
137
148
  | `applyRevisionManifest({ projectId, agentSlug \| workloadSlug, manifest, dryRun? })` | 高级 / GitOps:apply raw version manifest。两个 slug 拼写都接受(互斥)。 |
138
149
 
139
150
  `create` / `publishVersion` 的 `req` 结构和 managed-agent 全部配置项(`model` /
140
- `systemPrompt` / `enabledSkills` / `enabledMcpServers` / `agentOptions` 安全约束 /
141
- `runtime` / `startup` 等),见
151
+ `systemPrompt` / `enabledSkills` / `enabledMcpServers` / `agentPackage` /
152
+ `agentOptions` 安全约束 / `runtime` / `startup` 等),见
142
153
  [`specs/features/agenthub-sdk.md`](../../specs/features/agenthub-sdk.md)
143
154
  的 "Managed-Agent Configuration"、"Workload API Contract"、"Revision Publish Contract" 章节。
144
155
 
@@ -157,6 +168,7 @@ Agents 和 runtime templates 都是 **project-scoped**。Version 必须在同一
157
168
  | `create({ projectId, agentId, versionId?, configValues?, metadata?, idempotencyKey?, resources?, ... })` | 启动 Session。省略 `versionId` 时使用 Agent 默认 Version。`agentId`/`versionId` 也可写成 `workloadId`/`revisionId`(互斥)。`resources` 注入 Model A 只读输入文件(见下)。返回 `{ sessionId, status }`。 |
158
169
  | `get(sessionId)` | 读取 Session 快照(`{ session: { id, status, ... } }`,字段为服务端原样返回)。 |
159
170
  | `wait(sessionId, { intervalMs?, timeoutMs?, signal? })` | 轮询到 `status === "ready"`;遇到 `failed` 或超时会抛错。 |
171
+ | `releaseSandbox(sessionId)` | 释放 Session 当前 sandbox(保留 session,下一轮 turn 自动 revive 到新 sandbox)。需 `runs:create`。返回 `{ released, sandboxId, sandboxDestroyed, destroyError? }`;`sandboxDestroyed:false` 不代表失败(watcher 会兜底销毁)。 |
160
172
 
161
173
  Session `status` 取值为 `created`、`provisioning`、`starting`、`ready`、`failed`。
162
174
 
package/dist/index.cjs CHANGED
@@ -28,11 +28,13 @@ var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "
28
28
  var index_exports = {};
29
29
  __export(index_exports, {
30
30
  AGENTHUB_SDK_USER_AGENT: () => AGENTHUB_SDK_USER_AGENT,
31
+ AgentPackageSchema: () => AgentPackageSchema,
31
32
  AgentsResource: () => WorkloadsResource,
32
33
  CreatePlatformProjectRequestSchema: () => CreatePlatformProjectRequestSchema,
33
34
  CreatePlatformSessionRequestSchema: () => CreatePlatformSessionRequestSchema,
34
35
  CreatePlatformSessionResponseSchema: () => CreatePlatformSessionResponseSchema,
35
36
  CreatePlatformWorkloadRequestSchema: () => CreatePlatformWorkloadRequestSchema,
37
+ DeletePlatformProjectResponseSchema: () => DeletePlatformProjectResponseSchema,
36
38
  FilesResource: () => FilesResource,
37
39
  ListPlatformProjectsResponseSchema: () => ListPlatformProjectsResponseSchema,
38
40
  PILOT_WORKLOAD_MANIFEST_API_VERSION: () => PILOT_WORKLOAD_MANIFEST_API_VERSION,
@@ -49,6 +51,7 @@ __export(index_exports, {
49
51
  PlatformWorkloadSchema: () => PlatformWorkloadSchema,
50
52
  ProjectsResource: () => ProjectsResource,
51
53
  PublishPlatformRevisionRequestSchema: () => PublishPlatformRevisionRequestSchema,
54
+ ReleaseSandboxResponseSchema: () => ReleaseSandboxResponseSchema,
52
55
  SessionFileResourceSchema: () => SessionFileResourceSchema,
53
56
  SessionResourcesSchema: () => SessionResourcesSchema,
54
57
  SessionsResource: () => SessionsResource,
@@ -767,6 +770,13 @@ var CreateSessionRequestSchema = import_zod6.z.object({
767
770
  idempotencyKey: import_zod6.z.string().min(1).optional(),
768
771
  configValues: SessionConfigValuesSchema.optional(),
769
772
  metadata: import_zod6.z.record(import_zod6.z.unknown()).optional(),
773
+ /**
774
+ * UI/BFF hint for managed-agent launchers: when true, an AgentHub route may
775
+ * try to lease a ready session from the session prewarming pool before
776
+ * falling back to normal session creation. Core create-session semantics
777
+ * remain unchanged; services that do not implement prewarming MUST ignore it.
778
+ */
779
+ preferPrewarmed: import_zod6.z.boolean().optional(),
770
780
  /**
771
781
  * GAP1-B (rush-app v2 migration) — optional caller-supplied stable runtime
772
782
  * claim name. Forwarded to the runtime provider's `create()` as the sandbox
@@ -957,6 +967,59 @@ var WORKLOAD_MANIFEST_MODEL_MAX_LENGTH = 255;
957
967
  var WorkloadManifestModelSchema = import_zod4.z.string().min(1).max(WORKLOAD_MANIFEST_MODEL_MAX_LENGTH);
958
968
  var WORKLOAD_MANIFEST_SYSTEM_PROMPT_MAX_LENGTH = 32768;
959
969
  var WorkloadManifestSystemPromptSchema = import_zod4.z.string().min(1).max(WORKLOAD_MANIFEST_SYSTEM_PROMPT_MAX_LENGTH);
970
+ var AGENT_PACKAGE_MAX_SIZE_BYTES = 50 * 1024 * 1024;
971
+ var AGENT_PACKAGE_SOURCE_URL_MAX_LENGTH = 2048;
972
+ var SHA256_DIGEST_PATTERN = /^sha256:[0-9a-fA-F]{64}$/;
973
+ var OSS_AGENT_PACKAGE_HOST_PATTERN = /^[a-z0-9][a-z0-9-]*\.oss-[a-z0-9-]+(?:-internal)?\.aliyuncs\.com$/i;
974
+ function hasAsciiControlCharacter(value) {
975
+ for (let i = 0; i < value.length; i += 1) {
976
+ const code = value.charCodeAt(i);
977
+ if (code <= 31 || code === 127) return true;
978
+ }
979
+ return false;
980
+ }
981
+ function isApprovedAgentPackageUrl(value) {
982
+ let parsed;
983
+ try {
984
+ parsed = new URL(value);
985
+ } catch (e) {
986
+ return false;
987
+ }
988
+ if (parsed.protocol !== "https:") return false;
989
+ if (!OSS_AGENT_PACKAGE_HOST_PATTERN.test(parsed.hostname)) return false;
990
+ let key;
991
+ try {
992
+ key = decodeURIComponent(parsed.pathname.replace(/^\/+/, ""));
993
+ } catch (e) {
994
+ return false;
995
+ }
996
+ const segments = key.split("/");
997
+ if (segments.includes(".") || segments.includes("..")) return false;
998
+ if (!key.startsWith("pilot/agent-packages/")) return false;
999
+ return key.endsWith(".tar.gz") || key.endsWith(".tgz");
1000
+ }
1001
+ var ClaudeCodeAgentPackageEntryCommandSchema = import_zod4.z.string().min(1).max(100).refine((value) => value.trim() === value, {
1002
+ message: "entryCommand must not have leading or trailing whitespace"
1003
+ }).refine((value) => !hasAsciiControlCharacter(value), {
1004
+ message: "entryCommand must not contain control characters"
1005
+ }).refine((value) => value !== "." && value !== "..", {
1006
+ message: "entryCommand must be a command name, not a path segment"
1007
+ }).refine((value) => !value.includes("/") && !value.includes("\\"), {
1008
+ message: "entryCommand must not contain path separators"
1009
+ });
1010
+ var AgentPackageSourceSchema = import_zod4.z.object({
1011
+ kind: import_zod4.z.literal("oss"),
1012
+ url: import_zod4.z.string().url().max(AGENT_PACKAGE_SOURCE_URL_MAX_LENGTH).refine(isApprovedAgentPackageUrl, {
1013
+ message: "url must be an approved HTTPS OSS agent package URL"
1014
+ }),
1015
+ sha256: import_zod4.z.string().regex(SHA256_DIGEST_PATTERN, "sha256 must be sha256:<64 hex chars>"),
1016
+ sizeBytes: import_zod4.z.number().int().positive().max(AGENT_PACKAGE_MAX_SIZE_BYTES).optional()
1017
+ }).strict();
1018
+ var AgentPackageSchema = import_zod4.z.object({
1019
+ format: import_zod4.z.literal("claude_code"),
1020
+ source: AgentPackageSourceSchema,
1021
+ entryCommand: ClaudeCodeAgentPackageEntryCommandSchema.optional()
1022
+ }).strict();
960
1023
  var AGENT_OPTIONS_MAX_TURNS = 200;
961
1024
  var AGENT_OPTIONS_MAX_THINKING_TOKENS = 6e4;
962
1025
  var AGENT_OPTIONS_MAX_BUDGET_USD = 50;
@@ -992,7 +1055,8 @@ var ManagedAgentProfileSnapshotSchema = import_zod4.z.object({
992
1055
  enabledMcpServers: EnabledMcpEntryListSchema.optional(),
993
1056
  configValues: SessionConfigValuesSchema.optional(),
994
1057
  resources: SessionResourcesSchema.optional(),
995
- agentOptions: AgentOptionsSchema.optional()
1058
+ agentOptions: AgentOptionsSchema.optional(),
1059
+ agentPackage: AgentPackageSchema.optional()
996
1060
  }).strict();
997
1061
  var ManagedAgentOverridesSchema = import_zod4.z.object({
998
1062
  model: WorkloadManifestModelSchema.nullable().optional(),
@@ -1075,7 +1139,14 @@ var WorkloadManifestDefaultsSchema = import_zod4.z.object({
1075
1139
  * `createClaudeCode({ defaultSettings })` by the agent-runtime
1076
1140
  * claude-code provider. See `AgentOptionsSchema` above and issue #840.
1077
1141
  */
1078
- agentOptions: AgentOptionsSchema.optional()
1142
+ agentOptions: AgentOptionsSchema.optional(),
1143
+ /**
1144
+ * Workload-level **default agent package**. The Revision snapshot freezes
1145
+ * this reference and the dispatch payload forwards it to the sandbox
1146
+ * agent-worker, which downloads, verifies, and materializes the Claude Code
1147
+ * package before the provider starts.
1148
+ */
1149
+ agentPackage: AgentPackageSchema.optional()
1079
1150
  }).strict();
1080
1151
  var WORKLOAD_MANIFEST_UI_DISPLAY_NAME_MAX_LENGTH = 255;
1081
1152
  var WORKLOAD_MANIFEST_UI_PROMPT_PLACEHOLDER_MAX_LENGTH = 500;
@@ -1826,6 +1897,8 @@ var OssCredentialSchema = import_zod22.z.object({
1826
1897
  * client can compose multi-key flows by requesting fresh URLs).
1827
1898
  */
1828
1899
  prefix: import_zod22.z.string().min(1),
1900
+ /** The object key this URL is scoped to. Omitted by legacy issuers. */
1901
+ key: import_zod22.z.string().min(1).optional(),
1829
1902
  /**
1830
1903
  * Pre-signed PUT URL for the Session's default artifact object key
1831
1904
  * (`${prefix}artifact.bin` by convention). Phase 1 fallback in place
@@ -1840,6 +1913,15 @@ var OssCredentialSchema = import_zod22.z.object({
1840
1913
  stsSecretAccessKey: import_zod22.z.string().optional(),
1841
1914
  stsSessionToken: import_zod22.z.string().optional()
1842
1915
  });
1916
+ var OssUploadRequestSchema = import_zod22.z.object({
1917
+ /**
1918
+ * Optional OSS object key to presign for upload. When omitted, the
1919
+ * broker preserves the legacy `${sessionPrefix}artifact.bin` behavior.
1920
+ * Callers may pass either a session-relative path or a fully-qualified
1921
+ * key under `pilot/sessions/<sessionId>/`.
1922
+ */
1923
+ key: import_zod22.z.string().min(1).optional()
1924
+ }).strict();
1843
1925
  var OssDownloadRequestSchema = import_zod22.z.object({
1844
1926
  /** OSS object key the Worker wants to read (an input file's key). */
1845
1927
  key: import_zod22.z.string().min(1)
@@ -1864,7 +1946,8 @@ var CredentialsBrokerErrorCodeSchema = import_zod22.z.enum([
1864
1946
  "SESSION_TOKEN_REVOKED",
1865
1947
  "SESSION_TOKEN_EXPIRED",
1866
1948
  "POD_AGENT_TOKEN_INVALID",
1867
- // 400 — request body invalid (oss-download `key` missing/malformed)
1949
+ // 400 — request body invalid (oss upload/download `key` missing/malformed)
1950
+ "OSS_UPLOAD_KEY_INVALID",
1868
1951
  "OSS_DOWNLOAD_KEY_INVALID",
1869
1952
  // 403 — authorization failures
1870
1953
  "SESSION_TOKEN_SESSION_MISMATCH",
@@ -3924,7 +4007,8 @@ var ManagedAgentProfileSpecSchema = import_zod41.z.object({
3924
4007
  // Agent-level default runtime files. The envelope is exactly the session
3925
4008
  // resources contract so the same mount/download path handles both default
3926
4009
  // files and caller-supplied per-session files.
3927
- resources: SessionResourcesSchema.optional()
4010
+ resources: SessionResourcesSchema.optional(),
4011
+ agentPackage: AgentPackageSchema.optional()
3928
4012
  }).strict();
3929
4013
  var ManagedAgentProfileSchema = import_zod41.z.object({
3930
4014
  apiVersion: PilotWorkloadManifestApiVersionSchema,
@@ -3950,6 +4034,10 @@ var CreatePlatformProjectRequestSchema = import_zod42.z.object({
3950
4034
  var ListPlatformProjectsResponseSchema = import_zod42.z.object({
3951
4035
  projects: import_zod42.z.array(PlatformProjectSchema)
3952
4036
  }).strict();
4037
+ var DeletePlatformProjectResponseSchema = import_zod42.z.object({
4038
+ action: import_zod42.z.literal("deactivated"),
4039
+ projectId: import_zod42.z.string().uuid()
4040
+ }).strict();
3953
4041
  var PlatformWorkloadDefaultsSchema = import_zod42.z.object({
3954
4042
  workerContract: WorkloadManifestWorkerContractDefaultsSchema.optional(),
3955
4043
  configValues: SessionConfigValuesSchema.optional(),
@@ -3957,7 +4045,8 @@ var PlatformWorkloadDefaultsSchema = import_zod42.z.object({
3957
4045
  systemPrompt: import_zod42.z.string().min(1).max(32768).optional(),
3958
4046
  enabledSkills: EnabledSkillEntryListSchema.optional(),
3959
4047
  enabledMcpServers: EnabledMcpEntryListSchema.optional(),
3960
- agentOptions: AgentOptionsSchema.optional()
4048
+ agentOptions: AgentOptionsSchema.optional(),
4049
+ agentPackage: AgentPackageSchema.optional()
3961
4050
  }).strict();
3962
4051
  var CreatePlatformWorkloadRequestSchema = import_zod42.z.object({
3963
4052
  projectId: import_zod42.z.string().uuid(),
@@ -4016,6 +4105,12 @@ var GetPlatformSessionResponseSchema = import_zod42.z.object({
4016
4105
  }).strict();
4017
4106
  var CreatePlatformSessionRequestSchema = CreateSessionRequestSchema;
4018
4107
  var CreatePlatformSessionResponseSchema = CreateSessionResponseSchema;
4108
+ var ReleaseSandboxResponseSchema = import_zod42.z.object({
4109
+ released: import_zod42.z.literal(true),
4110
+ sandboxId: import_zod42.z.string().nullable(),
4111
+ sandboxDestroyed: import_zod42.z.boolean(),
4112
+ destroyError: import_zod42.z.string().optional()
4113
+ }).strict();
4019
4114
  var PlatformFileUploadResponseSchema = AttachmentMetaSchema.extend({
4020
4115
  url: import_zod42.z.string()
4021
4116
  });
@@ -4152,6 +4247,12 @@ var PilotCoderRunConfigV1Schema = import_zod43.z.object({
4152
4247
  * means contracts must ship before control-worker starts populating it.
4153
4248
  */
4154
4249
  agentOptions: AgentOptionsSchema.optional(),
4250
+ /**
4251
+ * Optional Claude Code agent package to install before the provider boots.
4252
+ * The reference is checksum-pinned and originates from the managed_agent
4253
+ * profile Revision snapshot / workload default.
4254
+ */
4255
+ agentPackage: AgentPackageSchema.optional(),
4155
4256
  /**
4156
4257
  * P3 L3.3 — delivery-related fields populated by control-worker from
4157
4258
  * `runs.*` / `agents.*` columns so the worker delivery loop can act
@@ -4625,6 +4726,22 @@ var ProjectsResource = class {
4625
4726
  );
4626
4727
  return PlatformProjectSchema.parse(response);
4627
4728
  }
4729
+ /**
4730
+ * Soft-delete (deactivate) a project: null the owner, clear members, disable
4731
+ * integrations. Owner-only (the calling token must belong to the project
4732
+ * owner). System projects cannot be deleted. The row is kept for audit, so
4733
+ * the response `action` is always `"deactivated"`.
4734
+ */
4735
+ async delete(projectId, options = {}) {
4736
+ const response = await this.client.request(
4737
+ `/api/projects/${encodeURIComponent(projectId)}`,
4738
+ {
4739
+ method: "DELETE",
4740
+ signal: options.signal
4741
+ }
4742
+ );
4743
+ return DeletePlatformProjectResponseSchema.parse(response);
4744
+ }
4628
4745
  };
4629
4746
 
4630
4747
  // src/agent-vocab.ts
@@ -4727,6 +4844,25 @@ var SessionsResource = class {
4727
4844
  await sleep(intervalMs, options.signal);
4728
4845
  }
4729
4846
  }
4847
+ /**
4848
+ * Release the session's current sandbox while keeping the session alive — a
4849
+ * later turn transparently revives it onto a fresh sandbox. Use this to free
4850
+ * runtime resources for an idle-but-not-finished session without terminating
4851
+ * it. Idempotent at the sandbox layer (an already-gone sandbox still succeeds).
4852
+ *
4853
+ * `sandboxDestroyed: false` (with `destroyError`) is NOT a failure — the
4854
+ * session is still correctly reclaimed; see {@link ReleaseSandboxResponse}.
4855
+ */
4856
+ async releaseSandbox(sessionId, options = {}) {
4857
+ const envelope = await this.client.request(
4858
+ `/api/sessions/${encodeURIComponent(sessionId)}/release-sandbox`,
4859
+ {
4860
+ method: "POST",
4861
+ signal: options.signal
4862
+ }
4863
+ );
4864
+ return ReleaseSandboxResponseSchema.parse(envelope?.data);
4865
+ }
4730
4866
  };
4731
4867
  function sleep(ms, signal) {
4732
4868
  if (ms <= 0) return Promise.resolve();
@@ -5058,11 +5194,13 @@ function mergeSignals(...signals) {
5058
5194
  // Annotate the CommonJS export names for ESM import in node:
5059
5195
  0 && (module.exports = {
5060
5196
  AGENTHUB_SDK_USER_AGENT,
5197
+ AgentPackageSchema,
5061
5198
  AgentsResource,
5062
5199
  CreatePlatformProjectRequestSchema,
5063
5200
  CreatePlatformSessionRequestSchema,
5064
5201
  CreatePlatformSessionResponseSchema,
5065
5202
  CreatePlatformWorkloadRequestSchema,
5203
+ DeletePlatformProjectResponseSchema,
5066
5204
  FilesResource,
5067
5205
  ListPlatformProjectsResponseSchema,
5068
5206
  PILOT_WORKLOAD_MANIFEST_API_VERSION,
@@ -5079,6 +5217,7 @@ function mergeSignals(...signals) {
5079
5217
  PlatformWorkloadSchema,
5080
5218
  ProjectsResource,
5081
5219
  PublishPlatformRevisionRequestSchema,
5220
+ ReleaseSandboxResponseSchema,
5082
5221
  SessionFileResourceSchema,
5083
5222
  SessionResourcesSchema,
5084
5223
  SessionsResource,