@agentconnect.md/cli 1.15.0-rc.5 → 1.16.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/index.js CHANGED
@@ -7885,6 +7885,27 @@ const MemoryRecallPolicy = object({
7885
7885
  timeoutMs: number().int().positive().max(MEMORY_RECALL_HARD_LIMITS.timeoutMs).default(MEMORY_RECALL_DEFAULTS.timeoutMs)
7886
7886
  }).strict();
7887
7887
  const MemoryCapturePolicy = object({ mode: _enum(["turn", "manual"]).default("manual") }).strict();
7888
+ /**
7889
+ * Dreaming — periodic offline consolidation of the MANAGED store
7890
+ * (design: docs/designs/memory-dreaming.md). Valid only with
7891
+ * `provider: 'managed'`; the daemon stages a rebuilt store per dream and the
7892
+ * user (or the gated auto-adopt path) reviews and adopts it. Bounds mirror the
7893
+ * design: sessionWindow ≤ 100 mined transcripts, instructions ≤ 4096 chars.
7894
+ */
7895
+ const MemoryDreamingPolicy = object({
7896
+ enabled: boolean(),
7897
+ /** How many recent sessions to mine (default 20). */
7898
+ sessionWindow: number().int().min(1).max(100).optional(),
7899
+ /** Cron expression for scheduled dreams (same syntax as agent crons). */
7900
+ schedule: string().min(1).max(128).optional(),
7901
+ /** Operator steering text applied through the whole dream pipeline. */
7902
+ instructions: string().max(4096).optional(),
7903
+ /** Also mine reusable procedures into candidate skills (never auto-installed). */
7904
+ mineSkills: boolean().optional(),
7905
+ /** Adopt the staged store automatically on completion. Admissible only on
7906
+ * runtimes with a trusted extraction channel; the daemon enforces that. */
7907
+ autoAdopt: boolean().optional()
7908
+ }).strict();
7888
7909
  /** Agent-facing provider selection. External bindings carry policy, never endpoints or secrets. */
7889
7910
  const AgentMemoryBinding = union([object({
7890
7911
  provider: _enum([
@@ -7892,8 +7913,15 @@ const AgentMemoryBinding = union([object({
7892
7913
  "native",
7893
7914
  "managed"
7894
7915
  ]),
7895
- autoDistill: boolean().optional()
7896
- }).strict(), object({
7916
+ autoDistill: boolean().optional(),
7917
+ dreaming: MemoryDreamingPolicy.optional()
7918
+ }).strict().superRefine((binding, ctx) => {
7919
+ if (binding.dreaming && binding.provider !== "managed") ctx.addIssue({
7920
+ code: "custom",
7921
+ path: ["dreaming"],
7922
+ message: "dreaming is only supported with the managed memory provider"
7923
+ });
7924
+ }), object({
7897
7925
  provider: literal("external"),
7898
7926
  connectionId: string().uuid(),
7899
7927
  recall: MemoryRecallPolicy.default({
@@ -8152,9 +8180,9 @@ const IntegrationChannels = object({
8152
8180
  * Agent lifecycle (protocol §4.4, §7.4, §8).
8153
8181
  *
8154
8182
  * There is no CP→daemon prompt-delivery frame: the daemon prompts an agent from
8155
- * its own ingress (platform adapters, and webchat over its own `webchat/*`
8156
- * frames), never the CP. The old `agent/prompt` + per-agent `seq` machinery was
8157
- * reserved infrastructure with no live caller and has been removed.
8183
+ * its own ingress (platform adapters or relay `rd/*` delivery), never the CP.
8184
+ * The old `agent/prompt` + per-agent `seq` machinery was reserved infrastructure
8185
+ * with no live caller and has been removed.
8158
8186
  */
8159
8187
  /**
8160
8188
  * Where the agent runs. Two modes; the **path is always daemon-generated** —
@@ -8214,7 +8242,7 @@ discriminatedUnion("kind", [
8214
8242
  ]);
8215
8243
  /**
8216
8244
  * The editable agent definition the CP owns and the daemon needs to run it:
8217
- * prompt + runtime selection. Raft ships this in the launch config and the
8245
+ * prompt + runtime selection. The launch protocol carries this config and the
8218
8246
  * daemon synthesizes the system prompt locally; `description` IS the prompt.
8219
8247
  */
8220
8248
  const AgentSpec = object({
@@ -8233,8 +8261,10 @@ const AgentSpec = object({
8233
8261
  "medium",
8234
8262
  "high"
8235
8263
  ]).optional(),
8264
+ showFooter: boolean().optional(),
8236
8265
  fastMode: boolean().optional(),
8237
8266
  permissionMode: string().nullable().optional(),
8267
+ allowRuntimeChangesInChat: boolean().optional(),
8238
8268
  pause: boolean().optional(),
8239
8269
  workspace: AgentWorkspace.optional(),
8240
8270
  env: record(string(), string()).optional(),
@@ -8243,6 +8273,8 @@ const AgentSpec = object({
8243
8273
  mcpServers: array(string()).default([]),
8244
8274
  callPolicy: _enum(["all", "selected"]).optional(),
8245
8275
  allowedCallerAgentIds: array(string()).default([]),
8276
+ outboundPolicy: _enum(["all", "selected"]).optional(),
8277
+ allowedTargetAgentIds: array(string()).optional(),
8246
8278
  introduceOnJoin: boolean().optional(),
8247
8279
  restrictFileAccess: boolean().optional()
8248
8280
  });
@@ -8325,6 +8357,36 @@ const AgentScopeDenied = object({
8325
8357
  launchId: string().uuid(),
8326
8358
  capability: string()
8327
8359
  });
8360
+ /** Editor approval queue. The daemon owns the live resolver and durable local
8361
+ * history; the Control Plane only proxies this bounded, secret-masked summary. */
8362
+ const AgentPermissionRequestRecord = object({
8363
+ id: string().uuid(),
8364
+ agentId: string().uuid(),
8365
+ createdAt: string().datetime(),
8366
+ requesterId: string().nullable(),
8367
+ requesterName: string().nullable(),
8368
+ command: string().max(240),
8369
+ status: _enum([
8370
+ "pending",
8371
+ "allowed",
8372
+ "denied",
8373
+ "expired"
8374
+ ]),
8375
+ resolvedAt: string().datetime().nullable()
8376
+ });
8377
+ const AgentPermissionRequestList = object({
8378
+ agentId: string().uuid(),
8379
+ limit: number().int().min(1).max(100).default(50)
8380
+ });
8381
+ const AgentPermissionRequestPage = object({
8382
+ agentId: string().uuid(),
8383
+ requests: array(AgentPermissionRequestRecord)
8384
+ });
8385
+ const AgentPermissionDecision = object({
8386
+ agentId: string().uuid(),
8387
+ requestId: string().uuid(),
8388
+ decision: _enum(["allow", "deny"])
8389
+ });
8328
8390
  //#endregion
8329
8391
  //#region ../protocol/dist/frames/mcpserver.js
8330
8392
  /**
@@ -8422,6 +8484,10 @@ const CollabAgentPlacement = object({
8422
8484
  botAppId: string().optional(),
8423
8485
  callPolicy: _enum(["all", "selected"]).default("all"),
8424
8486
  allowedCallerAgentIds: array(string()).default([]),
8487
+ /** Caller-side authorization. Effective A→B access requires A's outbound
8488
+ * policy to admit B and B's inbound call policy to admit A. */
8489
+ outboundPolicy: _enum(["all", "selected"]).default("all"),
8490
+ allowedTargetAgentIds: array(string()).default([]),
8425
8491
  name: string().optional(),
8426
8492
  displayName: string().optional()
8427
8493
  });
@@ -8474,7 +8540,7 @@ const GitCommitIdentity = object({
8474
8540
  * `INTERNAL`.
8475
8541
  */
8476
8542
  /**
8477
- * Token capability classes (webhook-triggers-and-github-events.md P2.5 回写).
8543
+ * Token capability classes (webhook-triggers-and-github-events.md P2.5 write-back).
8478
8544
  * `contents` is the git data plane (the pre-capabilities behavior); `issues` /
8479
8545
  * `pull_requests` buy the agent `gh` write-back (issue/PR comments), and
8480
8546
  * `actions` buys GitHub Actions inspection/execution. Every
@@ -8653,6 +8719,7 @@ const GithubHookMetadata = object({
8653
8719
  mergeCommitSha: string().min(1).optional(),
8654
8720
  isDraft: boolean().optional(),
8655
8721
  baseChanged: boolean().optional(),
8722
+ explicitReviewRequest: boolean().optional(),
8656
8723
  reviewCommentId: HookBigIntString.optional(),
8657
8724
  reviewThreadRootCommentId: HookBigIntString.optional()
8658
8725
  }).superRefine((value, ctx) => {
@@ -9253,6 +9320,143 @@ const MemoryRecordHistoryPage = object({
9253
9320
  events: array(MemoryPluginHistoryEvent).max(20),
9254
9321
  nextCursor: OptionalRecordCursor
9255
9322
  }).strict();
9323
+ /**
9324
+ * Memory dreaming (C→D REQ → REP) — offline consolidation jobs over the
9325
+ * MANAGED store (design: docs/designs/memory-dreaming.md).
9326
+ *
9327
+ * A dream reads a snapshot of `<agent-root>/memory/` plus recent session
9328
+ * transcripts and stages a rebuilt store under
9329
+ * `<agent-root>/memory-dreams/<dreamId>/`; the live store is never modified by
9330
+ * a running dream. The CP relays these frames and persists at most the
9331
+ * metadata (`DreamInfo`) — staged bodies transit only as correlated
9332
+ * request/reply payloads, exactly like `memory/read` (body-locality).
9333
+ *
9334
+ * - `memory/dream/start|cancel|adopt|discard`: lifecycle commands; each REP is
9335
+ * the updated `DreamInfo` so the console can refresh without a second read.
9336
+ * - `memory/dream/list|get`: job metadata for the history view.
9337
+ * - `memory/dream/files` + `memory/dream/file/read`: browse the STAGED output
9338
+ * tree (byte-sliced like `memory/read`; same UTF-8-boundary semantics).
9339
+ * - `memory/dream/skill/accept|dismiss`: review actions on mined skill
9340
+ * candidates (skills are never auto-adopted; see the design §7).
9341
+ */
9342
+ const DreamStatus = _enum([
9343
+ "pending",
9344
+ "running",
9345
+ "completed",
9346
+ "failed",
9347
+ "canceled",
9348
+ "adopted",
9349
+ "discarded"
9350
+ ]);
9351
+ const DreamTrigger = _enum([
9352
+ "manual",
9353
+ "schedule",
9354
+ "auto"
9355
+ ]);
9356
+ /** Review state of one mined skill candidate (design §7). */
9357
+ const DreamSkillInfo = object({
9358
+ name: string().regex(/^[a-z0-9][a-z0-9-]{0,62}$/, "skill name must be lowercase kebab-case"),
9359
+ description: string().max(1024),
9360
+ state: _enum([
9361
+ "proposed",
9362
+ "accepted",
9363
+ "dismissed"
9364
+ ])
9365
+ }).strict();
9366
+ /** Dream job metadata (never staged bodies). The only dream shape the CP may persist. */
9367
+ const DreamInfo = object({
9368
+ dreamId: string().min(1).max(128),
9369
+ agentId: string().min(1),
9370
+ status: DreamStatus,
9371
+ trigger: DreamTrigger,
9372
+ sessionIds: array(string().min(1)).max(100),
9373
+ snapshotDigest: string().min(1).max(128),
9374
+ instructions: string().max(4096).optional(),
9375
+ skills: array(DreamSkillInfo).max(16).optional(),
9376
+ usage: object({
9377
+ inputBytes: number().int().nonnegative(),
9378
+ outputBytes: number().int().nonnegative()
9379
+ }).strict().optional(),
9380
+ error: object({
9381
+ type: string().min(1).max(128),
9382
+ message: string().max(2048)
9383
+ }).strict().optional(),
9384
+ createdAt: string(),
9385
+ endedAt: string().optional()
9386
+ }).strict();
9387
+ /** C→D REQ: start a dream for one agent (managed provider only). */
9388
+ const DreamStartReq = object({
9389
+ agentId: string().min(1),
9390
+ trigger: DreamTrigger.default("manual"),
9391
+ /** Per-run overrides of the agent's configured dreaming policy. */
9392
+ sessionWindow: number().int().min(1).max(100).optional(),
9393
+ instructions: string().max(4096).optional()
9394
+ }).strict();
9395
+ /** D→C REP (corr = the req id): the created/updated dream job. Shared by every
9396
+ * lifecycle command so the console always renders from one shape. */
9397
+ const DreamState = object({ dream: DreamInfo }).strict();
9398
+ /** C→D REQ: cancel a pending|running dream. */
9399
+ const DreamCancelReq = object({
9400
+ agentId: string().min(1),
9401
+ dreamId: string().min(1)
9402
+ }).strict();
9403
+ /** C→D REQ: list dream jobs for one agent (newest first; bounded). */
9404
+ const DreamListReq = object({
9405
+ agentId: string().min(1),
9406
+ limit: number().int().positive().max(50).default(20)
9407
+ }).strict();
9408
+ /** D→C REP (corr = the req id). */
9409
+ const DreamListPage = object({
9410
+ agentId: string().min(1),
9411
+ dreams: array(DreamInfo).max(50)
9412
+ }).strict();
9413
+ /** C→D REQ: fetch one dream job's metadata. */
9414
+ const DreamGetReq = DreamCancelReq;
9415
+ /** C→D REQ: adopt a completed dream's staged store (atomic swap + backup). */
9416
+ const DreamAdoptReq = object({
9417
+ agentId: string().min(1),
9418
+ dreamId: string().min(1),
9419
+ /** Adopt even when the live store changed since the snapshot (fence override). */
9420
+ force: boolean().default(false)
9421
+ }).strict();
9422
+ /** C→D REQ: discard a terminal dream's staged output. */
9423
+ const DreamDiscardReq = DreamCancelReq;
9424
+ /** C→D REQ: list the STAGED output files of one dream (review surface). */
9425
+ const DreamFilesReq = DreamCancelReq;
9426
+ /** D→C REP (corr = the req id): staged store listing (or `exists:false`). */
9427
+ const DreamFilesPage = object({
9428
+ agentId: string(),
9429
+ dreamId: string(),
9430
+ exists: boolean(),
9431
+ entries: array(MemoryEntry)
9432
+ }).strict();
9433
+ /** C→D REQ: read one byte slice of a STAGED dream file (semantics of `memory/read`). */
9434
+ const DreamFileReadReq = object({
9435
+ agentId: string().min(1),
9436
+ dreamId: string().min(1),
9437
+ path: string().default(MEMORY_INDEX),
9438
+ offset: number().int().nonnegative().default(0),
9439
+ limit: number().int().positive().max(65536).default(65536)
9440
+ }).strict();
9441
+ /** D→C REP (corr = the req id): the staged file slice (fields as `memory/read/content`). */
9442
+ const DreamFileReadContent = object({
9443
+ agentId: string(),
9444
+ dreamId: string(),
9445
+ path: string(),
9446
+ exists: boolean(),
9447
+ size: number().int().nonnegative().optional(),
9448
+ mtime: string().optional(),
9449
+ content: string().optional(),
9450
+ offset: number().int().nonnegative().optional(),
9451
+ nextOffset: number().int().nonnegative().optional(),
9452
+ truncated: boolean().optional()
9453
+ }).strict();
9454
+ /** C→D REQ: accept or dismiss one mined skill candidate (design §7). */
9455
+ const DreamSkillReviewReq = object({
9456
+ agentId: string().min(1),
9457
+ dreamId: string().min(1),
9458
+ name: string().regex(/^[a-z0-9][a-z0-9-]{0,62}$/)
9459
+ }).strict();
9256
9460
  //#endregion
9257
9461
  //#region ../protocol/dist/frames/telemetry.js
9258
9462
  /**
@@ -9345,6 +9549,13 @@ const EffortOption = object({
9345
9549
  name: string().optional(),
9346
9550
  description: string().optional()
9347
9551
  });
9552
+ /** One runtime permission-mode choice. The display metadata is forwarded
9553
+ * verbatim from the runtime's ACP `category: "mode"` select option. */
9554
+ const PermissionModeOption = object({
9555
+ value: string(),
9556
+ name: string().optional(),
9557
+ description: string().optional()
9558
+ });
9348
9559
  /**
9349
9560
  * A runtime's discovered model × config capability matrix. One shape shared by
9350
9561
  * the wire, the CP's `runtime_profile.modelCatalog` JSONB column, and the DTO —
@@ -9359,10 +9570,7 @@ const RuntimeModelCatalog = object({
9359
9570
  fastMode: boolean().optional()
9360
9571
  })).max(128),
9361
9572
  defaultModel: string().optional(),
9362
- permissionModes: array(object({
9363
- value: string(),
9364
- name: string().optional()
9365
- })).optional(),
9573
+ permissionModes: array(PermissionModeOption).optional(),
9366
9574
  defaultPermissionMode: string().optional(),
9367
9575
  source: _enum(["native", "acp"]),
9368
9576
  observedAt: string().datetime()
@@ -9428,6 +9636,9 @@ const FRAME_SCHEMAS = {
9428
9636
  "agent/activate": AgentActivate,
9429
9637
  "agent/activity": AgentActivity,
9430
9638
  "agent/scope-denied": AgentScopeDenied,
9639
+ "agent/permission-requests": AgentPermissionRequestList,
9640
+ "agent/permission-requests/page": AgentPermissionRequestPage,
9641
+ "agent/permission-decision": AgentPermissionDecision,
9431
9642
  "route/assign": RouteAssign,
9432
9643
  "route/assign/ack": RouteAssignAck,
9433
9644
  "route/update": RouteUpdate,
@@ -9506,6 +9717,26 @@ const FRAME_SCHEMAS = {
9506
9717
  "memory/record/delete/result": MemoryRecordDeleteResult,
9507
9718
  "memory/record/history": MemoryRecordHistoryReq,
9508
9719
  "memory/record/history/page": MemoryRecordHistoryPage,
9720
+ "memory/dream/start": DreamStartReq,
9721
+ "memory/dream/start/ok": DreamState,
9722
+ "memory/dream/cancel": DreamCancelReq,
9723
+ "memory/dream/cancel/ok": DreamState,
9724
+ "memory/dream/list": DreamListReq,
9725
+ "memory/dream/list/page": DreamListPage,
9726
+ "memory/dream/get": DreamGetReq,
9727
+ "memory/dream/get/result": DreamState,
9728
+ "memory/dream/adopt": DreamAdoptReq,
9729
+ "memory/dream/adopt/ok": DreamState,
9730
+ "memory/dream/discard": DreamDiscardReq,
9731
+ "memory/dream/discard/ok": DreamState,
9732
+ "memory/dream/files": DreamFilesReq,
9733
+ "memory/dream/files/page": DreamFilesPage,
9734
+ "memory/dream/file/read": DreamFileReadReq,
9735
+ "memory/dream/file/read/content": DreamFileReadContent,
9736
+ "memory/dream/skill/accept": DreamSkillReviewReq,
9737
+ "memory/dream/skill/accept/ok": DreamState,
9738
+ "memory/dream/skill/dismiss": DreamSkillReviewReq,
9739
+ "memory/dream/skill/dismiss/ok": DreamState,
9509
9740
  "config/push": object({ keys: record(string(), unknown()) }),
9510
9741
  "daemon/restart": object({
9511
9742
  reason: string(),
@@ -9588,6 +9819,9 @@ discriminatedUnion("type", [
9588
9819
  frame("agent/activate", FRAME_SCHEMAS["agent/activate"]),
9589
9820
  frame("agent/activity", FRAME_SCHEMAS["agent/activity"]),
9590
9821
  frame("agent/scope-denied", FRAME_SCHEMAS["agent/scope-denied"]),
9822
+ frame("agent/permission-requests", FRAME_SCHEMAS["agent/permission-requests"]),
9823
+ frame("agent/permission-requests/page", FRAME_SCHEMAS["agent/permission-requests/page"]),
9824
+ frame("agent/permission-decision", FRAME_SCHEMAS["agent/permission-decision"]),
9591
9825
  frame("route/assign", FRAME_SCHEMAS["route/assign"]),
9592
9826
  frame("route/assign/ack", FRAME_SCHEMAS["route/assign/ack"]),
9593
9827
  frame("route/update", FRAME_SCHEMAS["route/update"]),
@@ -9662,6 +9896,26 @@ discriminatedUnion("type", [
9662
9896
  frame("memory/record/delete/result", FRAME_SCHEMAS["memory/record/delete/result"]),
9663
9897
  frame("memory/record/history", FRAME_SCHEMAS["memory/record/history"]),
9664
9898
  frame("memory/record/history/page", FRAME_SCHEMAS["memory/record/history/page"]),
9899
+ frame("memory/dream/start", FRAME_SCHEMAS["memory/dream/start"]),
9900
+ frame("memory/dream/start/ok", FRAME_SCHEMAS["memory/dream/start/ok"]),
9901
+ frame("memory/dream/cancel", FRAME_SCHEMAS["memory/dream/cancel"]),
9902
+ frame("memory/dream/cancel/ok", FRAME_SCHEMAS["memory/dream/cancel/ok"]),
9903
+ frame("memory/dream/list", FRAME_SCHEMAS["memory/dream/list"]),
9904
+ frame("memory/dream/list/page", FRAME_SCHEMAS["memory/dream/list/page"]),
9905
+ frame("memory/dream/get", FRAME_SCHEMAS["memory/dream/get"]),
9906
+ frame("memory/dream/get/result", FRAME_SCHEMAS["memory/dream/get/result"]),
9907
+ frame("memory/dream/adopt", FRAME_SCHEMAS["memory/dream/adopt"]),
9908
+ frame("memory/dream/adopt/ok", FRAME_SCHEMAS["memory/dream/adopt/ok"]),
9909
+ frame("memory/dream/discard", FRAME_SCHEMAS["memory/dream/discard"]),
9910
+ frame("memory/dream/discard/ok", FRAME_SCHEMAS["memory/dream/discard/ok"]),
9911
+ frame("memory/dream/files", FRAME_SCHEMAS["memory/dream/files"]),
9912
+ frame("memory/dream/files/page", FRAME_SCHEMAS["memory/dream/files/page"]),
9913
+ frame("memory/dream/file/read", FRAME_SCHEMAS["memory/dream/file/read"]),
9914
+ frame("memory/dream/file/read/content", FRAME_SCHEMAS["memory/dream/file/read/content"]),
9915
+ frame("memory/dream/skill/accept", FRAME_SCHEMAS["memory/dream/skill/accept"]),
9916
+ frame("memory/dream/skill/accept/ok", FRAME_SCHEMAS["memory/dream/skill/accept/ok"]),
9917
+ frame("memory/dream/skill/dismiss", FRAME_SCHEMAS["memory/dream/skill/dismiss"]),
9918
+ frame("memory/dream/skill/dismiss/ok", FRAME_SCHEMAS["memory/dream/skill/dismiss/ok"]),
9665
9919
  frame("config/push", FRAME_SCHEMAS["config/push"]),
9666
9920
  frame("daemon/restart", FRAME_SCHEMAS["daemon/restart"]),
9667
9921
  frame("daemon/upgrade", FRAME_SCHEMAS["daemon/upgrade"]),
@@ -9678,7 +9932,7 @@ discriminatedUnion("type", [
9678
9932
  * (`frames/relay-cp.ts` / `frames/relay-daemon.ts` over their OWN maps) all
9679
9933
  * decode the same envelope shape but accept disjoint frame families — a relay
9680
9934
  * socket must answer a daemon↔CP frame with `UNKNOWN_FRAME`, and vice versa
9681
- * (shared-bot-relay.md §8 "独立帧 union,不混入 daemon 协议").
9935
+ * (shared-bot-relay.md §8 "standalone frame union, not mixed into the daemon protocol").
9682
9936
  */
9683
9937
  /** Soft cap per frame — 256 KiB (protocol §1). Over this → FRAME_TOO_LARGE. */
9684
9938
  const MAX_FRAME_BYTES = 256 * 1024;