agent-tempo 1.2.0 → 1.3.1

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.
Files changed (98) hide show
  1. package/CLAUDE.md +219 -219
  2. package/LICENSE +21 -21
  3. package/README.md +289 -289
  4. package/assets/icon-dark.svg +9 -9
  5. package/assets/icon.svg +9 -9
  6. package/assets/logo-dark.svg +11 -11
  7. package/assets/logo-light.svg +11 -11
  8. package/dashboard/README.md +91 -91
  9. package/dashboard/dist/assets/index-D6Xyje_n.js.map +1 -1
  10. package/dashboard/dist/index.html +19 -19
  11. package/dashboard/package.json +47 -47
  12. package/dist/adapters/copilot/adapter.js +12 -1
  13. package/dist/cli/global-wrapper.d.ts +19 -0
  14. package/dist/cli/global-wrapper.js +169 -0
  15. package/dist/cli/help-text.js +97 -97
  16. package/dist/cli/startup.js +11 -0
  17. package/dist/cli/upgrade-command.js +81 -81
  18. package/dist/cli.js +12 -0
  19. package/dist/daemon.js +5 -0
  20. package/dist/scripts/verify-daemon-isolation-guard.js +24 -24
  21. package/dist/server.js +4 -0
  22. package/dist/spawn.js +12 -12
  23. package/dist/tools/coat-check-evict.js +2 -2
  24. package/dist/tools/coat-check-get.js +2 -2
  25. package/dist/tools/coat-check-put.js +4 -4
  26. package/dist/tools/fetch-state.js +2 -2
  27. package/dist/tools/save-state.js +13 -13
  28. package/dist/utils/grpc-shutdown-guard.d.ts +52 -0
  29. package/dist/utils/grpc-shutdown-guard.js +88 -0
  30. package/examples/agents/tempo-composer.md +56 -56
  31. package/examples/agents/tempo-conductor.md +117 -117
  32. package/examples/agents/tempo-critic.md +73 -73
  33. package/examples/agents/tempo-improv.md +74 -74
  34. package/examples/agents/tempo-liner.md +75 -75
  35. package/examples/agents/tempo-roadie.md +61 -61
  36. package/examples/agents/tempo-soloist.md +71 -71
  37. package/examples/agents/tempo-tuner.md +94 -94
  38. package/examples/ensembles/tempo-big-band.yaml +146 -146
  39. package/examples/ensembles/tempo-dev-team.yaml +58 -58
  40. package/examples/ensembles/tempo-headless-jam.yaml +77 -77
  41. package/examples/ensembles/tempo-jam-session.yaml +41 -41
  42. package/examples/ensembles/tempo-mock-jam.yaml +79 -79
  43. package/examples/ensembles/tempo-review-squad.yaml +32 -32
  44. package/package.json +173 -173
  45. package/packaging/launchd/com.agent.tempo.plist +46 -46
  46. package/packaging/systemd/agent-tempo.service +32 -32
  47. package/packaging/windows/install-task.ps1 +71 -71
  48. package/scenarios/conductor-recruit-mock.yaml +33 -33
  49. package/scenarios/echo-roundtrip.yaml +15 -15
  50. package/scenarios/multi-player-handoff.yaml +38 -38
  51. package/scenarios/recruit-cascade.yaml +38 -38
  52. package/scenarios/two-player-conversation.yaml +33 -33
  53. package/workflow-bundle.js +1 -1
  54. package/dist/activities/claude-stop.d.ts +0 -21
  55. package/dist/activities/claude-stop.js +0 -94
  56. package/dist/channel.d.ts +0 -3
  57. package/dist/channel.js +0 -48
  58. package/dist/copilot-bridge.d.ts +0 -22
  59. package/dist/copilot-bridge.js +0 -565
  60. package/dist/scripts/258-spotcheck.js +0 -303
  61. package/dist/tools/detach.d.ts +0 -4
  62. package/dist/tools/detach.js +0 -45
  63. package/dist/tools/encore.d.ts +0 -4
  64. package/dist/tools/encore.js +0 -31
  65. package/dist/tools/pause-ensemble.d.ts +0 -4
  66. package/dist/tools/pause-ensemble.js +0 -58
  67. package/dist/tools/resume-ensemble.d.ts +0 -4
  68. package/dist/tools/resume-ensemble.js +0 -79
  69. package/dist/tools/stop.d.ts +0 -4
  70. package/dist/tools/stop.js +0 -29
  71. package/dist/tui/client.d.ts +0 -6
  72. package/dist/tui/client.js +0 -9
  73. package/dist/tui/components/ActivityLog.d.ts +0 -16
  74. package/dist/tui/components/ActivityLog.js +0 -36
  75. package/dist/tui/components/CommandOverlay.d.ts +0 -15
  76. package/dist/tui/components/CommandOverlay.js +0 -34
  77. package/dist/tui/components/ConductorChat.d.ts +0 -16
  78. package/dist/tui/components/ConductorChat.js +0 -32
  79. package/dist/tui/components/EnsembleListView.d.ts +0 -14
  80. package/dist/tui/components/EnsembleListView.js +0 -32
  81. package/dist/tui/components/EnsemblePanel.d.ts +0 -12
  82. package/dist/tui/components/EnsemblePanel.js +0 -40
  83. package/dist/tui/components/InputBar.d.ts +0 -13
  84. package/dist/tui/components/InputBar.js +0 -58
  85. package/dist/tui/components/ScheduleOverlay.d.ts +0 -13
  86. package/dist/tui/components/ScheduleOverlay.js +0 -113
  87. package/dist/tui/components/TopBar.d.ts +0 -12
  88. package/dist/tui/components/TopBar.js +0 -15
  89. package/dist/tui/core-api.d.ts +0 -26
  90. package/dist/tui/core-api.js +0 -67
  91. package/dist/tui/hooks/useEnsembleDiscovery.d.ts +0 -3
  92. package/dist/tui/hooks/useEnsembleDiscovery.js +0 -30
  93. package/dist/tui/hooks/useMaestroPoller.d.ts +0 -3
  94. package/dist/tui/hooks/useMaestroPoller.js +0 -36
  95. package/dist/tui/hooks/useSendCommand.d.ts +0 -7
  96. package/dist/tui/hooks/useSendCommand.js +0 -29
  97. package/dist/utils/bg-preflight.d.ts +0 -25
  98. package/dist/utils/bg-preflight.js +0 -154
package/package.json CHANGED
@@ -1,173 +1,173 @@
1
- {
2
- "name": "agent-tempo",
3
- "version": "1.2.0",
4
- "description": "Many agents, one tempo. Durable coordination for multi-agent work via Temporal.",
5
- "keywords": [
6
- "mcp",
7
- "claude",
8
- "temporal",
9
- "multi-agent",
10
- "orchestration",
11
- "claude-code"
12
- ],
13
- "homepage": "https://github.com/vinceblank/agent-tempo",
14
- "bugs": {
15
- "url": "https://github.com/vinceblank/agent-tempo/issues"
16
- },
17
- "repository": {
18
- "type": "git",
19
- "url": "https://github.com/vinceblank/agent-tempo.git"
20
- },
21
- "types": "./dist/server.d.ts",
22
- "type": "commonjs",
23
- "main": "dist/server.js",
24
- "exports": {
25
- ".": "./dist/server.js",
26
- "./types": {
27
- "types": "./dist/types.d.ts",
28
- "default": "./dist/types.js"
29
- },
30
- "./config": {
31
- "types": "./dist/config.d.ts",
32
- "default": "./dist/config.js"
33
- },
34
- "./spawn": {
35
- "types": "./dist/spawn.d.ts",
36
- "default": "./dist/spawn.js"
37
- },
38
- "./signals": {
39
- "types": "./dist/workflows/signals.d.ts",
40
- "default": "./dist/workflows/signals.js"
41
- },
42
- "./connection": {
43
- "types": "./dist/connection.d.ts",
44
- "default": "./dist/connection.js"
45
- },
46
- "./palette": {
47
- "types": "./dist/palette/index.d.ts",
48
- "default": "./dist/palette/index.js"
49
- },
50
- "./workflow-bundle": "./workflow-bundle.js",
51
- "./package.json": "./package.json"
52
- },
53
- "bin": {
54
- "agent-tempo": "dist/cli.js",
55
- "agent-tempo-server": "dist/server.js"
56
- },
57
- "scripts": {
58
- "build": "tsc && npm run build:scripts && npm run build:dashboard && node -e \"const{bundleWorkflowCode}=require('@temporalio/worker');const path=require('path');const fs=require('fs');bundleWorkflowCode({workflowsPath:path.resolve('dist/workflows/index.js')}).then(b=>{fs.writeFileSync('workflow-bundle.js',b.code);console.log('Workflow bundle created')})\"",
59
- "build:scripts": "tsc -p scripts/tsconfig.json",
60
- "build:dashboard": "npm --prefix dashboard ci && npm --prefix dashboard run build",
61
- "size-limit": "size-limit",
62
- "prepack": "node scripts/strip-mock-adapter.js",
63
- "verify-tarball": "node scripts/verify-tarball.js",
64
- "prepublishOnly": "npm run build && npm test && npm run verify-tarball",
65
- "dev": "ts-node src/server.ts",
66
- "copilot-bridge": "ts-node src/adapters/copilot/adapter.ts",
67
- "clean:test": "node -e \"require('fs').rmSync('dist-test',{recursive:true,force:true})\"",
68
- "build:test": "npm run clean:test && tsc -p test/tsconfig.json",
69
- "pretest": "npm run build:test",
70
- "test:tui": "vitest run",
71
- "test:conformance": "npm run build:test && mocha --config .mocharc.conformance.yml",
72
- "pretest:shard-1": "npm run build:test && npm run build:scripts",
73
- "test:shard-1": "node dist/scripts/run-shard.js 1",
74
- "pretest:shard-2": "npm run build:test && npm run build:scripts",
75
- "test:shard-2": "node dist/scripts/run-shard.js 2",
76
- "test": "mocha && vitest run",
77
- "lint:surface-drift": "node scripts/check-surface-drift.js",
78
- "lint:no-stale-scaffold": "node scripts/check-no-stale-scaffold.js",
79
- "lint:test-ensemble-literals": "bash scripts/check-test-ensemble-literals.sh",
80
- "lint:skip-reasons": "node scripts/lint-skip-reasons.js",
81
- "lint:lockstep-version": "node -e \"const r=require('./package.json').version,d=require('./dashboard/package.json').version;if(r!==d){console.error('Version drift: root='+r+' dashboard='+d+'. Bump dashboard/package.json#version to match root.');process.exit(1);}console.log('Lockstep OK: '+r);\"",
82
- "lint:lockfile-canonical": "bash scripts/check-lockfile-canonical.sh",
83
- "lint:dashboard-css-sync": "npm run build:scripts && node dist/scripts/check-components-css-sync.js",
84
- "check:all": "npm run lint:test-ensemble-literals && npm run lint:skip-reasons && npm run lint:lockstep-version && npm run lint:lockfile-canonical && npm run lint:surface-drift && npm run lint:no-stale-scaffold && npm run build && npm run lint:dashboard-css-sync && npm test && npm --prefix dashboard run lint && npm --prefix dashboard run test && npm run size-limit && npm run verify-tarball"
85
- },
86
- "optionalDependencies": {
87
- "@github/copilot-sdk": "^0.2.0",
88
- "@anthropic-ai/sdk": "~0.91.1",
89
- "@opencode-ai/sdk": "~1.14.29"
90
- },
91
- "dependencies": {
92
- "@modelcontextprotocol/sdk": "~1.28.0",
93
- "@temporalio/activity": "~1.15.0",
94
- "@temporalio/client": "~1.15.0",
95
- "@temporalio/common": "~1.15.0",
96
- "@temporalio/proto": "~1.15.0",
97
- "@temporalio/worker": "~1.15.0",
98
- "@temporalio/workflow": "~1.15.0",
99
- "croner": "^10.0.1",
100
- "ink": "^6.8.0",
101
- "ink-spinner": "^5.0.0",
102
- "ink-text-input": "^6.0.0",
103
- "p-limit": "^3.1.0",
104
- "qrcode-terminal": "^0.12.0",
105
- "react": "^19.2.4",
106
- "semver": "^7.7.4",
107
- "yaml": "^2.8.3",
108
- "zod": "~3.25.76"
109
- },
110
- "devDependencies": {
111
- "@size-limit/preset-app": "^12.1.0",
112
- "@temporalio/testing": "~1.15.0",
113
- "@types/chai": "^4.3.20",
114
- "@types/mocha": "^10.0.10",
115
- "@types/node": "^20.0.0",
116
- "@types/react": "^19.2.14",
117
- "@types/semver": "^7.7.1",
118
- "chai": "^4.5.0",
119
- "mocha": "^11.7.5",
120
- "size-limit": "^12.1.0",
121
- "ts-morph": "^28.0.0",
122
- "ts-node": "^10.9.0",
123
- "tsx": "^4.21.0",
124
- "typescript": "^5.5.0",
125
- "vitest": "^2.1.9"
126
- },
127
- "typesVersions": {
128
- "*": {
129
- "types": [
130
- "dist/types.d.ts"
131
- ],
132
- "config": [
133
- "dist/config.d.ts"
134
- ],
135
- "spawn": [
136
- "dist/spawn.d.ts"
137
- ],
138
- "signals": [
139
- "dist/workflows/signals.d.ts"
140
- ],
141
- "connection": [
142
- "dist/connection.d.ts"
143
- ],
144
- "palette": [
145
- "dist/palette/index.d.ts"
146
- ]
147
- }
148
- },
149
- "files": [
150
- "dist",
151
- "workflow-bundle.js",
152
- "assets",
153
- "examples",
154
- "packaging",
155
- "scenarios",
156
- "dashboard/dist",
157
- "dashboard/package.json",
158
- "CLAUDE.md",
159
- "README.md"
160
- ],
161
- "engines": {
162
- "node": ">=20"
163
- },
164
- "license": "MIT",
165
- "trustedDependencies": [
166
- "@swc/core",
167
- "protobufjs"
168
- ],
169
- "overrides": {
170
- "rxjs": "^7.8.1"
171
- },
172
- "packageManager": "npm@10.9.2"
173
- }
1
+ {
2
+ "name": "agent-tempo",
3
+ "version": "1.3.1",
4
+ "description": "Many agents, one tempo. Durable coordination for multi-agent work via Temporal.",
5
+ "keywords": [
6
+ "mcp",
7
+ "claude",
8
+ "temporal",
9
+ "multi-agent",
10
+ "orchestration",
11
+ "claude-code"
12
+ ],
13
+ "homepage": "https://github.com/vinceblank/agent-tempo",
14
+ "bugs": {
15
+ "url": "https://github.com/vinceblank/agent-tempo/issues"
16
+ },
17
+ "repository": {
18
+ "type": "git",
19
+ "url": "https://github.com/vinceblank/agent-tempo.git"
20
+ },
21
+ "types": "./dist/server.d.ts",
22
+ "type": "commonjs",
23
+ "main": "dist/server.js",
24
+ "exports": {
25
+ ".": "./dist/server.js",
26
+ "./types": {
27
+ "types": "./dist/types.d.ts",
28
+ "default": "./dist/types.js"
29
+ },
30
+ "./config": {
31
+ "types": "./dist/config.d.ts",
32
+ "default": "./dist/config.js"
33
+ },
34
+ "./spawn": {
35
+ "types": "./dist/spawn.d.ts",
36
+ "default": "./dist/spawn.js"
37
+ },
38
+ "./signals": {
39
+ "types": "./dist/workflows/signals.d.ts",
40
+ "default": "./dist/workflows/signals.js"
41
+ },
42
+ "./connection": {
43
+ "types": "./dist/connection.d.ts",
44
+ "default": "./dist/connection.js"
45
+ },
46
+ "./palette": {
47
+ "types": "./dist/palette/index.d.ts",
48
+ "default": "./dist/palette/index.js"
49
+ },
50
+ "./workflow-bundle": "./workflow-bundle.js",
51
+ "./package.json": "./package.json"
52
+ },
53
+ "bin": {
54
+ "agent-tempo": "dist/cli.js",
55
+ "agent-tempo-server": "dist/server.js"
56
+ },
57
+ "scripts": {
58
+ "build": "tsc && npm run build:scripts && npm run build:dashboard && node -e \"const{bundleWorkflowCode}=require('@temporalio/worker');const path=require('path');const fs=require('fs');bundleWorkflowCode({workflowsPath:path.resolve('dist/workflows/index.js')}).then(b=>{fs.writeFileSync('workflow-bundle.js',b.code);console.log('Workflow bundle created')})\"",
59
+ "build:scripts": "tsc -p scripts/tsconfig.json",
60
+ "build:dashboard": "npm --prefix dashboard ci && npm --prefix dashboard run build",
61
+ "size-limit": "size-limit",
62
+ "prepack": "node scripts/strip-mock-adapter.js",
63
+ "verify-tarball": "node scripts/verify-tarball.js",
64
+ "prepublishOnly": "npm run build && npm test && npm run verify-tarball",
65
+ "dev": "ts-node src/server.ts",
66
+ "copilot-bridge": "ts-node src/adapters/copilot/adapter.ts",
67
+ "clean:test": "node -e \"require('fs').rmSync('dist-test',{recursive:true,force:true})\"",
68
+ "build:test": "npm run clean:test && tsc -p test/tsconfig.json",
69
+ "pretest": "npm run build:test",
70
+ "test:tui": "vitest run",
71
+ "test:conformance": "npm run build:test && mocha --config .mocharc.conformance.yml",
72
+ "pretest:shard-1": "npm run build:test && npm run build:scripts",
73
+ "test:shard-1": "node dist/scripts/run-shard.js 1",
74
+ "pretest:shard-2": "npm run build:test && npm run build:scripts",
75
+ "test:shard-2": "node dist/scripts/run-shard.js 2",
76
+ "test": "mocha && vitest run",
77
+ "lint:surface-drift": "node scripts/check-surface-drift.js",
78
+ "lint:no-stale-scaffold": "node scripts/check-no-stale-scaffold.js",
79
+ "lint:test-ensemble-literals": "bash scripts/check-test-ensemble-literals.sh",
80
+ "lint:skip-reasons": "node scripts/lint-skip-reasons.js",
81
+ "lint:lockstep-version": "node -e \"const r=require('./package.json').version,d=require('./dashboard/package.json').version;if(r!==d){console.error('Version drift: root='+r+' dashboard='+d+'. Bump dashboard/package.json#version to match root.');process.exit(1);}console.log('Lockstep OK: '+r);\"",
82
+ "lint:lockfile-canonical": "bash scripts/check-lockfile-canonical.sh",
83
+ "lint:dashboard-css-sync": "npm run build:scripts && node dist/scripts/check-components-css-sync.js",
84
+ "check:all": "npm run lint:test-ensemble-literals && npm run lint:skip-reasons && npm run lint:lockstep-version && npm run lint:lockfile-canonical && npm run lint:surface-drift && npm run lint:no-stale-scaffold && npm run build && npm run lint:dashboard-css-sync && npm test && npm --prefix dashboard run lint && npm --prefix dashboard run test && npm run size-limit && npm run verify-tarball"
85
+ },
86
+ "optionalDependencies": {
87
+ "@anthropic-ai/sdk": "~0.91.1",
88
+ "@github/copilot-sdk": "1.0.0-beta.6",
89
+ "@opencode-ai/sdk": "~1.14.29"
90
+ },
91
+ "dependencies": {
92
+ "@modelcontextprotocol/sdk": "~1.28.0",
93
+ "@temporalio/activity": "~1.15.0",
94
+ "@temporalio/client": "~1.15.0",
95
+ "@temporalio/common": "~1.15.0",
96
+ "@temporalio/proto": "~1.15.0",
97
+ "@temporalio/worker": "~1.15.0",
98
+ "@temporalio/workflow": "~1.15.0",
99
+ "croner": "^10.0.1",
100
+ "ink": "^6.8.0",
101
+ "ink-spinner": "^5.0.0",
102
+ "ink-text-input": "^6.0.0",
103
+ "p-limit": "^3.1.0",
104
+ "qrcode-terminal": "^0.12.0",
105
+ "react": "^19.2.4",
106
+ "semver": "^7.7.4",
107
+ "yaml": "^2.8.3",
108
+ "zod": "~3.25.76"
109
+ },
110
+ "devDependencies": {
111
+ "@size-limit/preset-app": "^12.1.0",
112
+ "@temporalio/testing": "~1.15.0",
113
+ "@types/chai": "^4.3.20",
114
+ "@types/mocha": "^10.0.10",
115
+ "@types/node": "^20.0.0",
116
+ "@types/react": "^19.2.14",
117
+ "@types/semver": "^7.7.1",
118
+ "chai": "^4.5.0",
119
+ "mocha": "^11.7.5",
120
+ "size-limit": "^12.1.0",
121
+ "ts-morph": "^28.0.0",
122
+ "ts-node": "^10.9.0",
123
+ "tsx": "^4.21.0",
124
+ "typescript": "^5.5.0",
125
+ "vitest": "^2.1.9"
126
+ },
127
+ "typesVersions": {
128
+ "*": {
129
+ "types": [
130
+ "dist/types.d.ts"
131
+ ],
132
+ "config": [
133
+ "dist/config.d.ts"
134
+ ],
135
+ "spawn": [
136
+ "dist/spawn.d.ts"
137
+ ],
138
+ "signals": [
139
+ "dist/workflows/signals.d.ts"
140
+ ],
141
+ "connection": [
142
+ "dist/connection.d.ts"
143
+ ],
144
+ "palette": [
145
+ "dist/palette/index.d.ts"
146
+ ]
147
+ }
148
+ },
149
+ "files": [
150
+ "dist",
151
+ "workflow-bundle.js",
152
+ "assets",
153
+ "examples",
154
+ "packaging",
155
+ "scenarios",
156
+ "dashboard/dist",
157
+ "dashboard/package.json",
158
+ "CLAUDE.md",
159
+ "README.md"
160
+ ],
161
+ "engines": {
162
+ "node": ">=20"
163
+ },
164
+ "license": "MIT",
165
+ "trustedDependencies": [
166
+ "@swc/core",
167
+ "protobufjs"
168
+ ],
169
+ "overrides": {
170
+ "rxjs": "^7.8.1"
171
+ },
172
+ "packageManager": "npm@10.9.2"
173
+ }
@@ -1,46 +1,46 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <!--
3
- agent-tempo daemon — launchd user agent.
4
-
5
- NOTE: macOS launchd integration ships best-effort untested in v0.25.0-beta.1
6
- (PR-E §8 answer 4). Feedback welcome at https://github.com/vinceblank/agent-tempo/issues.
7
-
8
- Installed to ~/Library/LaunchAgents/com.agent.tempo.plist by
9
- `agent-tempo daemon install`. Load with:
10
-
11
- launchctl load ~/Library/LaunchAgents/com.agent.tempo.plist
12
-
13
- User-level only (no sudo). `RunAtLoad` + `KeepAlive` bounce the daemon
14
- if it crashes; `ThrottleInterval` guards against restart loops.
15
- -->
16
- <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
17
- <plist version="1.0">
18
- <dict>
19
- <key>Label</key>
20
- <string>com.agent.tempo</string>
21
-
22
- <key>ProgramArguments</key>
23
- <array>
24
- <string>/usr/bin/env</string>
25
- <string>agent-tempo</string>
26
- <string>daemon</string>
27
- <string>start</string>
28
- <string>--foreground</string>
29
- </array>
30
-
31
- <key>RunAtLoad</key>
32
- <true/>
33
-
34
- <key>KeepAlive</key>
35
- <true/>
36
-
37
- <key>ThrottleInterval</key>
38
- <integer>10</integer>
39
-
40
- <key>StandardOutPath</key>
41
- <string>/tmp/agent-tempo-daemon.stdout.log</string>
42
-
43
- <key>StandardErrorPath</key>
44
- <string>/tmp/agent-tempo-daemon.stderr.log</string>
45
- </dict>
46
- </plist>
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!--
3
+ agent-tempo daemon — launchd user agent.
4
+
5
+ NOTE: macOS launchd integration ships best-effort untested in v0.25.0-beta.1
6
+ (PR-E §8 answer 4). Feedback welcome at https://github.com/vinceblank/agent-tempo/issues.
7
+
8
+ Installed to ~/Library/LaunchAgents/com.agent.tempo.plist by
9
+ `agent-tempo daemon install`. Load with:
10
+
11
+ launchctl load ~/Library/LaunchAgents/com.agent.tempo.plist
12
+
13
+ User-level only (no sudo). `RunAtLoad` + `KeepAlive` bounce the daemon
14
+ if it crashes; `ThrottleInterval` guards against restart loops.
15
+ -->
16
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
17
+ <plist version="1.0">
18
+ <dict>
19
+ <key>Label</key>
20
+ <string>com.agent.tempo</string>
21
+
22
+ <key>ProgramArguments</key>
23
+ <array>
24
+ <string>/usr/bin/env</string>
25
+ <string>agent-tempo</string>
26
+ <string>daemon</string>
27
+ <string>start</string>
28
+ <string>--foreground</string>
29
+ </array>
30
+
31
+ <key>RunAtLoad</key>
32
+ <true/>
33
+
34
+ <key>KeepAlive</key>
35
+ <true/>
36
+
37
+ <key>ThrottleInterval</key>
38
+ <integer>10</integer>
39
+
40
+ <key>StandardOutPath</key>
41
+ <string>/tmp/agent-tempo-daemon.stdout.log</string>
42
+
43
+ <key>StandardErrorPath</key>
44
+ <string>/tmp/agent-tempo-daemon.stderr.log</string>
45
+ </dict>
46
+ </plist>
@@ -1,32 +1,32 @@
1
- # agent-tempo daemon — systemd --user unit
2
- #
3
- # Installed to ~/.config/systemd/user/agent-tempo.service by
4
- # `agent-tempo daemon install`. Enable with:
5
- #
6
- # systemctl --user daemon-reload
7
- # systemctl --user enable --now agent-tempo
8
- #
9
- # User-level only (no sudo). The daemon process claims
10
- # ~/.agent-tempo/daemon.pid; systemd restarts on crash.
11
- #
12
- # Environment variables (Temporal connection overrides) can be added via
13
- # EnvironmentFile or Environment= lines here — by default the daemon reads
14
- # ~/.agent-tempo/config.json or falls back to temporal CLI config.
15
-
16
- [Unit]
17
- Description=agent-tempo daemon (Temporal workers + reconcile loop)
18
- After=network-online.target
19
- Wants=network-online.target
20
-
21
- [Service]
22
- Type=simple
23
- ExecStart=/usr/bin/env agent-tempo daemon start --foreground
24
- ExecStop=/usr/bin/env agent-tempo daemon stop
25
- Restart=on-failure
26
- RestartSec=10s
27
- # Prevent runaway restart loops from a broken config file.
28
- StartLimitIntervalSec=120
29
- StartLimitBurst=5
30
-
31
- [Install]
32
- WantedBy=default.target
1
+ # agent-tempo daemon — systemd --user unit
2
+ #
3
+ # Installed to ~/.config/systemd/user/agent-tempo.service by
4
+ # `agent-tempo daemon install`. Enable with:
5
+ #
6
+ # systemctl --user daemon-reload
7
+ # systemctl --user enable --now agent-tempo
8
+ #
9
+ # User-level only (no sudo). The daemon process claims
10
+ # ~/.agent-tempo/daemon.pid; systemd restarts on crash.
11
+ #
12
+ # Environment variables (Temporal connection overrides) can be added via
13
+ # EnvironmentFile or Environment= lines here — by default the daemon reads
14
+ # ~/.agent-tempo/config.json or falls back to temporal CLI config.
15
+
16
+ [Unit]
17
+ Description=agent-tempo daemon (Temporal workers + reconcile loop)
18
+ After=network-online.target
19
+ Wants=network-online.target
20
+
21
+ [Service]
22
+ Type=simple
23
+ ExecStart=/usr/bin/env agent-tempo daemon start --foreground
24
+ ExecStop=/usr/bin/env agent-tempo daemon stop
25
+ Restart=on-failure
26
+ RestartSec=10s
27
+ # Prevent runaway restart loops from a broken config file.
28
+ StartLimitIntervalSec=120
29
+ StartLimitBurst=5
30
+
31
+ [Install]
32
+ WantedBy=default.target
@@ -1,71 +1,71 @@
1
- # agent-tempo daemon — Windows Task Scheduler install script
2
- #
3
- # Registers a per-user scheduled task that starts the daemon at logon and
4
- # keeps it running. User-level only (current user scope; does not require
5
- # Administrator).
6
- #
7
- # Usage:
8
- # powershell -File install-task.ps1 # install (idempotent)
9
- # powershell -File install-task.ps1 -Uninstall # remove
10
-
11
- param(
12
- [switch]$Uninstall
13
- )
14
-
15
- $TaskName = 'agent-tempo-daemon'
16
- $TaskDescription = 'agent-tempo daemon — Temporal workers + reconcile loop'
17
-
18
- if ($Uninstall) {
19
- $existing = Get-ScheduledTask -TaskName $TaskName -ErrorAction SilentlyContinue
20
- if ($existing) {
21
- Unregister-ScheduledTask -TaskName $TaskName -Confirm:$false
22
- Write-Output "Unregistered scheduled task: $TaskName"
23
- } else {
24
- Write-Output "No scheduled task named $TaskName was registered."
25
- }
26
- exit 0
27
- }
28
-
29
- # Resolve agent-tempo.cmd (the npm-installed shim on PATH).
30
- $claudeTempo = (Get-Command agent-tempo -ErrorAction SilentlyContinue).Source
31
- if (-not $claudeTempo) {
32
- Write-Error "agent-tempo not found on PATH. Install it first (`npm i -g agent-tempo`)."
33
- exit 1
34
- }
35
-
36
- # Replace any prior registration so re-runs are idempotent.
37
- $existing = Get-ScheduledTask -TaskName $TaskName -ErrorAction SilentlyContinue
38
- if ($existing) {
39
- Unregister-ScheduledTask -TaskName $TaskName -Confirm:$false
40
- }
41
-
42
- $action = New-ScheduledTaskAction `
43
- -Execute $claudeTempo `
44
- -Argument 'daemon start --foreground'
45
-
46
- $trigger = New-ScheduledTaskTrigger -AtLogOn -User $env:USERNAME
47
-
48
- $settings = New-ScheduledTaskSettingsSet `
49
- -AllowStartIfOnBatteries `
50
- -DontStopIfGoingOnBatteries `
51
- -StartWhenAvailable `
52
- -RestartCount 3 `
53
- -RestartInterval (New-TimeSpan -Minutes 1)
54
-
55
- $principal = New-ScheduledTaskPrincipal `
56
- -UserId $env:USERNAME `
57
- -LogonType Interactive `
58
- -RunLevel Limited
59
-
60
- Register-ScheduledTask `
61
- -TaskName $TaskName `
62
- -Description $TaskDescription `
63
- -Action $action `
64
- -Trigger $trigger `
65
- -Settings $settings `
66
- -Principal $principal | Out-Null
67
-
68
- Write-Output "Registered scheduled task: $TaskName"
69
- Write-Output " Exec: $claudeTempo daemon start --foreground"
70
- Write-Output " User: $env:USERNAME (Interactive, limited)"
71
- Write-Output " Trigger: at logon"
1
+ # agent-tempo daemon — Windows Task Scheduler install script
2
+ #
3
+ # Registers a per-user scheduled task that starts the daemon at logon and
4
+ # keeps it running. User-level only (current user scope; does not require
5
+ # Administrator).
6
+ #
7
+ # Usage:
8
+ # powershell -File install-task.ps1 # install (idempotent)
9
+ # powershell -File install-task.ps1 -Uninstall # remove
10
+
11
+ param(
12
+ [switch]$Uninstall
13
+ )
14
+
15
+ $TaskName = 'agent-tempo-daemon'
16
+ $TaskDescription = 'agent-tempo daemon — Temporal workers + reconcile loop'
17
+
18
+ if ($Uninstall) {
19
+ $existing = Get-ScheduledTask -TaskName $TaskName -ErrorAction SilentlyContinue
20
+ if ($existing) {
21
+ Unregister-ScheduledTask -TaskName $TaskName -Confirm:$false
22
+ Write-Output "Unregistered scheduled task: $TaskName"
23
+ } else {
24
+ Write-Output "No scheduled task named $TaskName was registered."
25
+ }
26
+ exit 0
27
+ }
28
+
29
+ # Resolve agent-tempo.cmd (the npm-installed shim on PATH).
30
+ $claudeTempo = (Get-Command agent-tempo -ErrorAction SilentlyContinue).Source
31
+ if (-not $claudeTempo) {
32
+ Write-Error "agent-tempo not found on PATH. Install it first (`npm i -g agent-tempo`)."
33
+ exit 1
34
+ }
35
+
36
+ # Replace any prior registration so re-runs are idempotent.
37
+ $existing = Get-ScheduledTask -TaskName $TaskName -ErrorAction SilentlyContinue
38
+ if ($existing) {
39
+ Unregister-ScheduledTask -TaskName $TaskName -Confirm:$false
40
+ }
41
+
42
+ $action = New-ScheduledTaskAction `
43
+ -Execute $claudeTempo `
44
+ -Argument 'daemon start --foreground'
45
+
46
+ $trigger = New-ScheduledTaskTrigger -AtLogOn -User $env:USERNAME
47
+
48
+ $settings = New-ScheduledTaskSettingsSet `
49
+ -AllowStartIfOnBatteries `
50
+ -DontStopIfGoingOnBatteries `
51
+ -StartWhenAvailable `
52
+ -RestartCount 3 `
53
+ -RestartInterval (New-TimeSpan -Minutes 1)
54
+
55
+ $principal = New-ScheduledTaskPrincipal `
56
+ -UserId $env:USERNAME `
57
+ -LogonType Interactive `
58
+ -RunLevel Limited
59
+
60
+ Register-ScheduledTask `
61
+ -TaskName $TaskName `
62
+ -Description $TaskDescription `
63
+ -Action $action `
64
+ -Trigger $trigger `
65
+ -Settings $settings `
66
+ -Principal $principal | Out-Null
67
+
68
+ Write-Output "Registered scheduled task: $TaskName"
69
+ Write-Output " Exec: $claudeTempo daemon start --foreground"
70
+ Write-Output " User: $env:USERNAME (Interactive, limited)"
71
+ Write-Output " Trigger: at logon"