@deksden-com/dd-flow-cli 0.9.0-beta.93 → 0.9.0-beta.94

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/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # @deksden-com/dd-flow-cli
2
2
 
3
+ ## 0.9.0-beta.94
4
+
5
+ ### Patch Changes
6
+
7
+ - Admit public ZCode lifecycle commands through their native receipt without exposing runtime-owned invocation IDs.
8
+
3
9
  ## 0.9.0-beta.93
4
10
 
5
11
  ### Patch Changes
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "cli_package": "@deksden-com/dd-flow-cli",
3
- "cli_version": "0.9.0-beta.93",
4
- "cli_commit": "4af4acb64cbb4a27697a9de92a74ab6848745b17",
5
- "built_at": "2026-09-22T05:53:32.684Z",
3
+ "cli_version": "0.9.0-beta.94",
4
+ "cli_commit": "852591e0c29473e4bc7bef90aa2f83d66b8792de",
5
+ "built_at": "2026-09-22T06:20:13.963Z",
6
6
  "built_with_canon": {
7
7
  "version": "4.1.1",
8
8
  "commit": "d1a6081ab15ab92ac917ff5d037121a40c709db1",
@@ -33,9 +33,12 @@ The adapter consumes `zcode/session/resolve`, `read`, `subagents`, `usage`,
33
33
  operations. Resolution must preserve the session's trusted workspace.
34
34
  Residency and retained-tree reads after close must not implicitly resume it.
35
35
  Cancellation must target owned sessions and verify resulting tree state.
36
- Profile facts must come from native readback. Session updates supply tool events;
37
- the adapter forwards them to `dd-flow zcode event handle`, where trusted
38
- invocation/lifecycle receipts are enforced.
36
+ Profile facts must come from native readback. Session updates supply tool events.
37
+ The adapter forwards a standalone public lifecycle command to `dd-flow zcode
38
+ event handle`; native Session/tool identity binds it to the one exact issued
39
+ assignment in that daemon scope. The command never exposes the runtime-owned
40
+ invocation ID. Its shell inherits `DD_FLOW_DAEMON_ID`, finds the assignment and
41
+ waits for the committed receipt before any lifecycle mutation can execute.
39
42
 
40
43
  The execution-scoped daemon preserves the live native handles needed for
41
44
  background children. Inspection remains available during productive operations;
@@ -602,7 +602,7 @@ export async function serveDaemon(stateDir) {
602
602
  const paths = locations(stateDir);
603
603
  const state = await readState(paths.dir);
604
604
  if (!state || state.schema_id !== STATE_SCHEMA) throw new DaemonError("daemon_state_missing", "daemon state is missing or incompatible");
605
- const bridge = new AcpBridge(state.config);
605
+ const bridge = new AcpBridge({ ...state.config, env: { ...state.config.env, DD_FLOW_DAEMON_ID: state.daemon_id } });
606
606
  const initialized = await bridge.start();
607
607
  const runtime = new DaemonRuntime(paths, state, bridge, initialized);
608
608
  await removeSocket(paths.socket, paths.dir);
@@ -710,7 +710,7 @@ export async function zcodeInvocationObserver(options, rootProviderSessionId, se
710
710
  const { update, native, session } = facts;
711
711
  const command = update.rawInput?.command ?? update.rawInput?.cmd;
712
712
  const toolName = update._meta?.claudeCode?.toolName;
713
- if (!["Bash", "bash", "execute"].includes(toolName) || typeof command !== "string" || !/(?:^|\s)--invocation-id\s/.test(command)) return;
713
+ if (!["Bash", "bash", "execute"].includes(toolName) || typeof command !== "string") return;
714
714
  const parent = session === rootProviderSessionId ? null : owners.get(native.parentToolCallId);
715
715
  if (session !== rootProviderSessionId && !parent) throw Object.assign(new Error("Native child has no confirmed immediate parent tool owner"), { code: "zcode_parent_identity_missing" });
716
716
  await send({ bin: options.ddFlowBin, home: options.ddFlowHome,
@@ -493,7 +493,7 @@ export function handleZcodeEvent(context, input) {
493
493
  return { ok: true, observed: false, reason: "non_bash_tool" };
494
494
  const command = stringValue(rawInput.command) ?? stringValue(rawInput.cmd);
495
495
  const parsed = command ? parseLifecycleCommand(command) : { kind: "none" };
496
- if (parsed.kind === "none" || !commandOption(parsed.invocation, "invocation-id"))
496
+ if (parsed.kind === "none")
497
497
  return { ok: true, observed: false, reason: "acp_evidence_only" };
498
498
  const controlled = objectRecord(objectRecord(notification._meta).ddZcode);
499
499
  const providerSessionId = stringValue(native.childSessionId) ?? stringValue(controlled.rootProviderSessionId);
@@ -920,7 +920,9 @@ export function observedLifecycleInvocation(context, command, daemonId) {
920
920
  const analysis = parseLifecycleCommand(command);
921
921
  if (analysis.kind !== "standalone" || analysis.invocation.wrapped)
922
922
  return null;
923
- const matches = context.db.all("SELECT * FROM lifecycle_invocations WHERE status IN ('observed','executing') ORDER BY rowid DESC")
923
+ // `issued` is a rendezvous, not authority: the CLI still blocks in
924
+ // awaitLifecycleInvocation until the native observer commits the receipt.
925
+ const matches = context.db.all("SELECT * FROM lifecycle_invocations WHERE status IN ('issued','observed','executing') ORDER BY rowid DESC")
924
926
  .filter(row => {
925
927
  try {
926
928
  const scope = JSON.parse(row.scope_json);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@deksden-com/dd-flow-cli",
3
- "version": "0.9.0-beta.93",
3
+ "version": "0.9.0-beta.94",
4
4
  "description": "Mechanical runtime CLI for dd-flow workflows.",
5
5
  "type": "module",
6
6
  "bin": {