agent-tempo 1.6.0 → 1.6.2

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.
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Shared secret-classification — the single source of truth for "does this config
3
+ * key / env-var name hold a credential?" Used by:
4
+ * - `cli/config-command.ts` — masks secret VALUES in the config display (#684).
5
+ * - `spawn.ts` — partitions terminal-launch env so secret VALUES go to a 0600
6
+ * file instead of being inlined into the echoed command (#689).
7
+ *
8
+ * Lives in `utils/` (not `cli/`) so `spawn.ts` can import it without a layering
9
+ * violation (spawn must not depend on the CLI surface). Extracted from
10
+ * config-command.ts in #689 so the two consumers share ONE classifier and can't
11
+ * drift — a secret added to the pattern is masked AND kept off the command line
12
+ * everywhere at once.
13
+ */
14
+ /**
15
+ * Config/env keys that hold a credential value and must never be displayed raw or
16
+ * inlined into a command. Extend this (or {@link SECRET_KEY_PATTERN}) when a new
17
+ * secret config field / env var is introduced — both consumers pick it up.
18
+ */
19
+ export declare const SECRET_KEYS: Set<string>;
20
+ /**
21
+ * Matches credential-bearing key/env names: `*_API_KEY` / `*ApiKey` / `*Token` /
22
+ * `*Secret` / `*Password`. NOT `*Path` fields (those are file LOCATIONS, not the
23
+ * secret material — e.g. `temporalTlsKeyPath` must stay visible); the `path$`
24
+ * guard in {@link isSecretKey} excludes them.
25
+ */
26
+ export declare const SECRET_KEY_PATTERN: RegExp;
27
+ /**
28
+ * True when a config key or environment-variable name holds a credential value
29
+ * that must be masked on display and kept out of an echoed command line.
30
+ *
31
+ * Keys on the NAME, not the value. `*Path` fields are file locations (not secret
32
+ * material) and are explicitly excluded so they stay visible/inline.
33
+ */
34
+ export declare function isSecretKey(key: string): boolean;
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+ /**
3
+ * Shared secret-classification — the single source of truth for "does this config
4
+ * key / env-var name hold a credential?" Used by:
5
+ * - `cli/config-command.ts` — masks secret VALUES in the config display (#684).
6
+ * - `spawn.ts` — partitions terminal-launch env so secret VALUES go to a 0600
7
+ * file instead of being inlined into the echoed command (#689).
8
+ *
9
+ * Lives in `utils/` (not `cli/`) so `spawn.ts` can import it without a layering
10
+ * violation (spawn must not depend on the CLI surface). Extracted from
11
+ * config-command.ts in #689 so the two consumers share ONE classifier and can't
12
+ * drift — a secret added to the pattern is masked AND kept off the command line
13
+ * everywhere at once.
14
+ */
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ exports.SECRET_KEY_PATTERN = exports.SECRET_KEYS = void 0;
17
+ exports.isSecretKey = isSecretKey;
18
+ /**
19
+ * Config/env keys that hold a credential value and must never be displayed raw or
20
+ * inlined into a command. Extend this (or {@link SECRET_KEY_PATTERN}) when a new
21
+ * secret config field / env var is introduced — both consumers pick it up.
22
+ */
23
+ exports.SECRET_KEYS = new Set([
24
+ 'temporalApiKey',
25
+ 'httpToken',
26
+ 'readToken',
27
+ 'adminToken',
28
+ ]);
29
+ /**
30
+ * Matches credential-bearing key/env names: `*_API_KEY` / `*ApiKey` / `*Token` /
31
+ * `*Secret` / `*Password`. NOT `*Path` fields (those are file LOCATIONS, not the
32
+ * secret material — e.g. `temporalTlsKeyPath` must stay visible); the `path$`
33
+ * guard in {@link isSecretKey} excludes them.
34
+ */
35
+ exports.SECRET_KEY_PATTERN = /(api[_-]?key|token|secret|password)/i;
36
+ /**
37
+ * True when a config key or environment-variable name holds a credential value
38
+ * that must be masked on display and kept out of an echoed command line.
39
+ *
40
+ * Keys on the NAME, not the value. `*Path` fields are file locations (not secret
41
+ * material) and are explicitly excluded so they stay visible/inline.
42
+ */
43
+ function isSecretKey(key) {
44
+ if (/path$/i.test(key))
45
+ return false;
46
+ return exports.SECRET_KEYS.has(key) || exports.SECRET_KEY_PATTERN.test(key);
47
+ }
@@ -57,6 +57,18 @@ You are a combination of Product Manager, Task Decomposition Expert, and Context
57
57
  - **Wrap-up**: Collect final reports, synthesize results, `detach` players who may be needed again (or `destroy` those who are truly done), report completion.
58
58
  - **Autonomous work session**: Pre-flight (check ensemble state — skip if active work is in progress) → review backlog → close completed items → identify tasks your ensemble can handle autonomously (flag those needing human design input) → kick off, track to completion, summarize results.
59
59
 
60
+ ## Message Delivery Model
61
+
62
+ Understanding how cues are delivered prevents the most common conductor anti-pattern — busy-waiting for replies.
63
+
64
+ **Cues wake you; you don't need to poll.** After cueing a player and expecting a reply, end your turn. When the reply arrives, the runtime wakes you automatically at the next turn boundary. There is nothing to poll.
65
+
66
+ **`listen` is a one-shot inbox drain, not a wait primitive.** `listen` reads whatever messages are already queued at call time — it cannot block or wait for future messages. A `sleep`+`listen` loop does not work as a wait: it burns tokens across every player in the ensemble without advancing any work. If you're waiting for a reply, end your turn.
67
+
68
+ **Don't reply to ack/FYI cues.** If a player sends a status update or acknowledgment without asking a question or requesting action, do not respond. Responding starts a ping-pong — your reply wakes them, they acknowledge, you're awake again — that wastes turns on both sides for zero information transfer.
69
+
70
+ **Cues queue, they don't interrupt.** A cue sent to you while you're processing arrives at your next turn boundary, not mid-turn. A burst from multiple players arrives together; process the batch in one turn rather than starting a separate turn for each.
71
+
60
72
  ## Worktree Coordination
61
73
 
62
74
  Use the `worktree` tool to give players isolated git checkouts when two or more engineers need to work in the same repo on different branches simultaneously. Each worktree is an independent checkout — players can build, test, and commit without interfering with each other.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agent-tempo",
3
- "version": "1.6.0",
3
+ "version": "1.6.2",
4
4
  "description": "Many agents, one tempo. Durable coordination for multi-agent work via Temporal.",
5
5
  "keywords": [
6
6
  "mcp",