@telora/daemon 0.17.31 → 0.17.36

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 (119) hide show
  1. package/build-info.json +4 -3
  2. package/dist/cli/connect.d.ts.map +1 -1
  3. package/dist/cli/connect.js +4 -0
  4. package/dist/cli/connect.js.map +1 -1
  5. package/dist/completion/event.d.ts.map +1 -1
  6. package/dist/completion/event.js +4 -10
  7. package/dist/completion/event.js.map +1 -1
  8. package/dist/completion/team-completion.js +5 -5
  9. package/dist/completion/team-completion.js.map +1 -1
  10. package/dist/config.d.ts.map +1 -1
  11. package/dist/config.js +70 -41
  12. package/dist/config.js.map +1 -1
  13. package/dist/daemon-process.d.ts.map +1 -1
  14. package/dist/daemon-process.js +8 -0
  15. package/dist/daemon-process.js.map +1 -1
  16. package/dist/delivery-lifecycle.js +8 -8
  17. package/dist/delivery-lifecycle.js.map +1 -1
  18. package/dist/directive-executor.js +2 -2
  19. package/dist/directive-executor.js.map +1 -1
  20. package/dist/focus-engine.d.ts.map +1 -1
  21. package/dist/focus-engine.js +8 -10
  22. package/dist/focus-engine.js.map +1 -1
  23. package/dist/focus-phase.js +6 -6
  24. package/dist/focus-phase.js.map +1 -1
  25. package/dist/focus-stage-lifecycle.js +5 -5
  26. package/dist/focus-stage-lifecycle.js.map +1 -1
  27. package/dist/listener-auto-advance.d.ts.map +1 -1
  28. package/dist/listener-auto-advance.js +10 -6
  29. package/dist/listener-auto-advance.js.map +1 -1
  30. package/dist/merge-back-loop.d.ts.map +1 -1
  31. package/dist/merge-back-loop.js +4 -10
  32. package/dist/merge-back-loop.js.map +1 -1
  33. package/dist/prd-controller.d.ts.map +1 -1
  34. package/dist/prd-controller.js +2 -1
  35. package/dist/prd-controller.js.map +1 -1
  36. package/dist/prompt-sections/execution-sections.d.ts.map +1 -1
  37. package/dist/prompt-sections/execution-sections.js +3 -2
  38. package/dist/prompt-sections/execution-sections.js.map +1 -1
  39. package/dist/review-defect-detector.d.ts +4 -1
  40. package/dist/review-defect-detector.d.ts.map +1 -1
  41. package/dist/review-defect-detector.js +6 -8
  42. package/dist/review-defect-detector.js.map +1 -1
  43. package/dist/session-lifecycle.js +2 -2
  44. package/dist/session-lifecycle.js.map +1 -1
  45. package/dist/stage-classifier.d.ts.map +1 -1
  46. package/dist/stage-classifier.js +6 -5
  47. package/dist/stage-classifier.js.map +1 -1
  48. package/dist/state-cascade.d.ts.map +1 -1
  49. package/dist/state-cascade.js +2 -1
  50. package/dist/state-cascade.js.map +1 -1
  51. package/dist/types/index.d.ts +0 -1
  52. package/dist/types/index.d.ts.map +1 -1
  53. package/dist/types/index.js +0 -1
  54. package/dist/types/index.js.map +1 -1
  55. package/dist/unified-engine-lifecycle.d.ts.map +1 -1
  56. package/dist/unified-engine-lifecycle.js +2 -23
  57. package/dist/unified-engine-lifecycle.js.map +1 -1
  58. package/dist/unified-shell-config.d.ts +2 -7
  59. package/dist/unified-shell-config.d.ts.map +1 -1
  60. package/dist/unified-shell-config.js +2 -23
  61. package/dist/unified-shell-config.js.map +1 -1
  62. package/dist/unified-shell-status.d.ts.map +1 -1
  63. package/dist/unified-shell-status.js +2 -4
  64. package/dist/unified-shell-status.js.map +1 -1
  65. package/dist/unified-shell.d.ts.map +1 -1
  66. package/dist/unified-shell.js +0 -12
  67. package/dist/unified-shell.js.map +1 -1
  68. package/dist/version-check.d.ts.map +1 -1
  69. package/dist/version-check.js +6 -4
  70. package/dist/version-check.js.map +1 -1
  71. package/package.json +3 -3
  72. package/dist/pm/adaptive-poller.d.ts +0 -26
  73. package/dist/pm/adaptive-poller.d.ts.map +0 -1
  74. package/dist/pm/adaptive-poller.js +0 -53
  75. package/dist/pm/adaptive-poller.js.map +0 -1
  76. package/dist/pm/cascade-evaluator.d.ts +0 -29
  77. package/dist/pm/cascade-evaluator.d.ts.map +0 -1
  78. package/dist/pm/cascade-evaluator.js +0 -135
  79. package/dist/pm/cascade-evaluator.js.map +0 -1
  80. package/dist/pm/channel-email.d.ts +0 -42
  81. package/dist/pm/channel-email.d.ts.map +0 -1
  82. package/dist/pm/channel-email.js +0 -47
  83. package/dist/pm/channel-email.js.map +0 -1
  84. package/dist/pm/channel-slack.d.ts +0 -40
  85. package/dist/pm/channel-slack.d.ts.map +0 -1
  86. package/dist/pm/channel-slack.js +0 -46
  87. package/dist/pm/channel-slack.js.map +0 -1
  88. package/dist/pm/communication-drafter.d.ts +0 -44
  89. package/dist/pm/communication-drafter.d.ts.map +0 -1
  90. package/dist/pm/communication-drafter.js +0 -84
  91. package/dist/pm/communication-drafter.js.map +0 -1
  92. package/dist/pm/dialog-handler.d.ts +0 -32
  93. package/dist/pm/dialog-handler.d.ts.map +0 -1
  94. package/dist/pm/dialog-handler.js +0 -107
  95. package/dist/pm/dialog-handler.js.map +0 -1
  96. package/dist/pm/mitigation-correlator.d.ts +0 -29
  97. package/dist/pm/mitigation-correlator.d.ts.map +0 -1
  98. package/dist/pm/mitigation-correlator.js +0 -147
  99. package/dist/pm/mitigation-correlator.js.map +0 -1
  100. package/dist/pm/risk-scanner.d.ts +0 -28
  101. package/dist/pm/risk-scanner.d.ts.map +0 -1
  102. package/dist/pm/risk-scanner.js +0 -112
  103. package/dist/pm/risk-scanner.js.map +0 -1
  104. package/dist/pm-engine.d.ts +0 -96
  105. package/dist/pm-engine.d.ts.map +0 -1
  106. package/dist/pm-engine.js +0 -540
  107. package/dist/pm-engine.js.map +0 -1
  108. package/dist/pm-process.d.ts +0 -45
  109. package/dist/pm-process.d.ts.map +0 -1
  110. package/dist/pm-process.js +0 -195
  111. package/dist/pm-process.js.map +0 -1
  112. package/dist/pm-prompt-builder.d.ts +0 -23
  113. package/dist/pm-prompt-builder.d.ts.map +0 -1
  114. package/dist/pm-prompt-builder.js +0 -64
  115. package/dist/pm-prompt-builder.js.map +0 -1
  116. package/dist/types/pm.d.ts +0 -53
  117. package/dist/types/pm.d.ts.map +0 -1
  118. package/dist/types/pm.js +0 -10
  119. package/dist/types/pm.js.map +0 -1
@@ -1,195 +0,0 @@
1
- /**
2
- * PM process state and lifecycle management.
3
- *
4
- * Manages the spawning, monitoring, and termination of PM Claude Code
5
- * processes. Each product gets one PM process that runs /loop for its
6
- * PM cycle.
7
- */
8
- import { spawn } from 'node:child_process';
9
- import { buildStreamJsonArgs, stripClaudeCodeEnvVars, sendMessage, } from '@telora/daemon-core';
10
- import { DEFAULT_PM_PROCESS_CONFIG } from './types/pm.js';
11
- import { buildPMPrompt } from './pm-prompt-builder.js';
12
- import { callApi } from './queries/shared.js';
13
- // ---------------------------------------------------------------------------
14
- // Active processes
15
- // ---------------------------------------------------------------------------
16
- /** Map of productId -> PMProcessState for active PM processes. */
17
- const activeProcesses = new Map();
18
- // ---------------------------------------------------------------------------
19
- // Spawn
20
- // ---------------------------------------------------------------------------
21
- /**
22
- * Spawn a PM Claude Code process for a product.
23
- *
24
- * The process runs in the product's repo directory with the PM CLAUDE.md
25
- * as context, and is given a /loop command to run the PM cycle periodically.
26
- */
27
- export async function spawnPMProcess(config, productId, repoPath, governor, pmConfig = DEFAULT_PM_PROCESS_CONFIG, existingSessionId) {
28
- // Acquire governor slot
29
- await governor.acquireSlot('pm');
30
- // Use existing session if provided (from poll), otherwise create one
31
- let pmSessionId;
32
- if (existingSessionId) {
33
- pmSessionId = existingSessionId;
34
- }
35
- else {
36
- try {
37
- const result = await callApi('pm_session_create', {
38
- productId,
39
- });
40
- pmSessionId = result?.session?.id ?? `pm-${productId}`;
41
- }
42
- catch {
43
- pmSessionId = `pm-${productId}`;
44
- }
45
- }
46
- // Fetch product info
47
- let productName = productId;
48
- try {
49
- const productResult = await callApi('product_get', {
50
- productId,
51
- });
52
- productName = productResult?.name ?? productId;
53
- }
54
- catch {
55
- // Use productId as fallback name
56
- }
57
- // Build initial prompt
58
- const initialPrompt = await buildPMPrompt(repoPath, { id: productId, name: productName }, pmConfig.loopIntervalMinutes);
59
- // Build CLI args
60
- const args = buildStreamJsonArgs();
61
- // Build environment (strip inherited Claude Code vars)
62
- const spawnEnv = stripClaudeCodeEnvVars(process.env, {
63
- preserve: ['CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS'],
64
- });
65
- // Spawn Claude Code process in the product repo
66
- const proc = spawn(config.claudeCodePath, args, {
67
- cwd: repoPath,
68
- env: spawnEnv,
69
- stdio: ['pipe', 'pipe', 'pipe'],
70
- });
71
- const state = {
72
- productId,
73
- proc,
74
- pmSessionId,
75
- phase: 'starting',
76
- restartCount: 0,
77
- lastRestartAt: null,
78
- stdin: proc.stdin,
79
- spawnedAt: new Date(),
80
- };
81
- activeProcesses.set(productId, state);
82
- // Send initial prompt
83
- sendMessage(proc.stdin, initialPrompt);
84
- state.phase = 'running';
85
- // Log stdout (simple line-by-line)
86
- proc.stdout.on('data', (data) => {
87
- const lines = data.toString().split('\n').filter(Boolean);
88
- for (const line of lines) {
89
- try {
90
- const event = JSON.parse(line);
91
- // Capture Claude session ID from init event
92
- if (event.type === 'system' && event.sessionId) {
93
- state.claudeSessionId = event.sessionId;
94
- }
95
- }
96
- catch {
97
- // Non-JSON output -- log as-is
98
- }
99
- }
100
- });
101
- proc.stderr.on('data', (data) => {
102
- console.log(`[PM] stderr (${productId}): ${data.toString().trim()}`);
103
- });
104
- // Handle process exit
105
- proc.on('close', (code) => {
106
- console.log(`[PM] Process exited for product ${productId} (code: ${code})`);
107
- state.phase = 'crashed';
108
- governor.releaseSlot('pm');
109
- activeProcesses.delete(productId);
110
- });
111
- proc.on('error', (err) => {
112
- console.log(`[PM] Process error for product ${productId}: ${err.message}`);
113
- state.phase = 'crashed';
114
- governor.releaseSlot('pm');
115
- activeProcesses.delete(productId);
116
- });
117
- console.log(`[PM] Spawned process for product ${productId} (pid: ${proc.pid})`);
118
- return state;
119
- }
120
- // ---------------------------------------------------------------------------
121
- // Terminate
122
- // ---------------------------------------------------------------------------
123
- /**
124
- * Gracefully terminate a PM process for a product.
125
- */
126
- export function terminatePMProcess(productId) {
127
- const state = activeProcesses.get(productId);
128
- if (!state)
129
- return false;
130
- state.phase = 'stopping';
131
- // Try graceful shutdown: close stdin, then SIGTERM
132
- try {
133
- state.stdin.end();
134
- }
135
- catch {
136
- // Already closed
137
- }
138
- setTimeout(() => {
139
- if (state.proc.exitCode === null) {
140
- state.proc.kill('SIGTERM');
141
- }
142
- }, 5000);
143
- setTimeout(() => {
144
- if (state.proc.exitCode === null) {
145
- state.proc.kill('SIGKILL');
146
- }
147
- }, 15000);
148
- return true;
149
- }
150
- /**
151
- * Terminate all active PM processes.
152
- */
153
- export function terminateAllPMProcesses() {
154
- for (const productId of activeProcesses.keys()) {
155
- terminatePMProcess(productId);
156
- }
157
- }
158
- // ---------------------------------------------------------------------------
159
- // Query
160
- // ---------------------------------------------------------------------------
161
- /**
162
- * Get the active PM process for a product, or undefined if none.
163
- */
164
- export function getPMProcess(productId) {
165
- return activeProcesses.get(productId);
166
- }
167
- /**
168
- * Get all active PM processes.
169
- */
170
- export function getActivePMProcesses() {
171
- return activeProcesses;
172
- }
173
- /**
174
- * Check if a PM process is running for a product.
175
- */
176
- export function isPMProcessRunning(productId) {
177
- const state = activeProcesses.get(productId);
178
- return state !== undefined && state.phase === 'running';
179
- }
180
- // ---------------------------------------------------------------------------
181
- // Backoff
182
- // ---------------------------------------------------------------------------
183
- /**
184
- * Calculate exponential backoff delay for PM process restart.
185
- *
186
- * Backoff schedule: 1m, 2m, 4m, 8m, 16m, 30m (capped)
187
- * Returns delay in milliseconds.
188
- */
189
- export function calculateRestartDelay(restartCount) {
190
- const baseMs = 60_000; // 1 minute
191
- const maxMs = 30 * 60_000; // 30 minutes
192
- const delay = Math.min(baseMs * Math.pow(2, restartCount), maxMs);
193
- return delay;
194
- }
195
- //# sourceMappingURL=pm-process.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"pm-process.js","sourceRoot":"","sources":["../src/pm-process.ts"],"names":[],"mappings":"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"}
@@ -1,23 +0,0 @@
1
- /**
2
- * PM prompt builder -- builds the initial prompt for a PM Claude Code process.
3
- *
4
- * Reads pm/CLAUDE.md from the product repo, fetches product details and PM
5
- * session state, and composes the initial prompt that boots the PM agent
6
- * with /loop at the configured interval.
7
- */
8
- interface ProductInfo {
9
- id: string;
10
- name: string;
11
- }
12
- /**
13
- * Build the initial prompt for a PM Claude Code process.
14
- *
15
- * The prompt includes:
16
- * 1. pm/CLAUDE.md contents (the PM agent's system instructions)
17
- * 2. Product context (name, ID)
18
- * 3. PM session state (last assessment, pending items)
19
- * 4. /loop instruction at the configured interval
20
- */
21
- export declare function buildPMPrompt(repoPath: string, product: ProductInfo, loopIntervalMinutes: number): Promise<string>;
22
- export {};
23
- //# sourceMappingURL=pm-prompt-builder.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"pm-prompt-builder.d.ts","sourceRoot":"","sources":["../src/pm-prompt-builder.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAUH,UAAU,WAAW;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CACd;AAYD;;;;;;;;GAQG;AACH,wBAAsB,aAAa,CACjC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,WAAW,EACpB,mBAAmB,EAAE,MAAM,GAC1B,OAAO,CAAC,MAAM,CAAC,CA+CjB"}
@@ -1,64 +0,0 @@
1
- /**
2
- * PM prompt builder -- builds the initial prompt for a PM Claude Code process.
3
- *
4
- * Reads pm/CLAUDE.md from the product repo, fetches product details and PM
5
- * session state, and composes the initial prompt that boots the PM agent
6
- * with /loop at the configured interval.
7
- */
8
- import { readFile } from 'node:fs/promises';
9
- import { join } from 'node:path';
10
- import { callApi } from './queries/shared.js';
11
- // ---------------------------------------------------------------------------
12
- // Builder
13
- // ---------------------------------------------------------------------------
14
- /**
15
- * Build the initial prompt for a PM Claude Code process.
16
- *
17
- * The prompt includes:
18
- * 1. pm/CLAUDE.md contents (the PM agent's system instructions)
19
- * 2. Product context (name, ID)
20
- * 3. PM session state (last assessment, pending items)
21
- * 4. /loop instruction at the configured interval
22
- */
23
- export async function buildPMPrompt(repoPath, product, loopIntervalMinutes) {
24
- const parts = [];
25
- // 1. Read pm/CLAUDE.md from the product repo
26
- const pmClaudeMdPath = join(repoPath, 'pm', 'CLAUDE.md');
27
- let pmInstructions = '';
28
- try {
29
- pmInstructions = await readFile(pmClaudeMdPath, 'utf-8');
30
- }
31
- catch {
32
- // If pm/CLAUDE.md doesn't exist, use a minimal fallback
33
- pmInstructions = '# PM Agent\n\nYou are a PM agent. Run your cycle to check inbox, review action plan, and generate reports.';
34
- }
35
- parts.push(pmInstructions);
36
- // 2. Product context
37
- parts.push(`\n## Product\n\n- **Name**: ${product.name}\n- **ID**: ${product.id}`);
38
- // 3. PM session state
39
- let sessionState = null;
40
- try {
41
- const sessionResult = await callApi('pm_session_get', {
42
- productId: product.id,
43
- });
44
- sessionState = sessionResult?.session ?? null;
45
- }
46
- catch {
47
- // Session may not exist yet -- PM will create it during first cycle
48
- }
49
- if (sessionState) {
50
- parts.push('\n## Session State\n');
51
- if (sessionState.lastCycleAt) {
52
- parts.push(`- **Last cycle**: ${sessionState.lastCycleAt}`);
53
- }
54
- if (sessionState.lastAssessment) {
55
- parts.push(`- **Last assessment**: ${JSON.stringify(sessionState.lastAssessment, null, 2)}`);
56
- }
57
- }
58
- // 4. /loop instruction
59
- parts.push(`\n## Instructions\n\n` +
60
- `Run the PM cycle now, then continue running it on a loop.\n\n` +
61
- `/loop ${loopIntervalMinutes}m /pm-cycle`);
62
- return parts.join('\n');
63
- }
64
- //# sourceMappingURL=pm-prompt-builder.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"pm-prompt-builder.js","sourceRoot":"","sources":["../src/pm-prompt-builder.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAiB9C,8EAA8E;AAC9E,UAAU;AACV,8EAA8E;AAE9E;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,QAAgB,EAChB,OAAoB,EACpB,mBAA2B;IAE3B,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,6CAA6C;IAC7C,MAAM,cAAc,GAAG,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;IACzD,IAAI,cAAc,GAAG,EAAE,CAAC;IACxB,IAAI,CAAC;QACH,cAAc,GAAG,MAAM,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;IAC3D,CAAC;IAAC,MAAM,CAAC;QACP,wDAAwD;QACxD,cAAc,GAAG,4GAA4G,CAAC;IAChI,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAE3B,qBAAqB;IACrB,KAAK,CAAC,IAAI,CAAC,+BAA+B,OAAO,CAAC,IAAI,eAAe,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;IAEnF,sBAAsB;IACtB,IAAI,YAAY,GAA0B,IAAI,CAAC;IAC/C,IAAI,CAAC;QACH,MAAM,aAAa,GAAG,MAAM,OAAO,CAAC,gBAAgB,EAAE;YACpD,SAAS,EAAE,OAAO,CAAC,EAAE;SACtB,CAAiC,CAAC;QACnC,YAAY,GAAG,aAAa,EAAE,OAAO,IAAI,IAAI,CAAC;IAChD,CAAC;IAAC,MAAM,CAAC;QACP,oEAAoE;IACtE,CAAC;IAED,IAAI,YAAY,EAAE,CAAC;QACjB,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QACnC,IAAI,YAAY,CAAC,WAAW,EAAE,CAAC;YAC7B,KAAK,CAAC,IAAI,CAAC,qBAAqB,YAAY,CAAC,WAAW,EAAE,CAAC,CAAC;QAC9D,CAAC;QACD,IAAI,YAAY,CAAC,cAAc,EAAE,CAAC;YAChC,KAAK,CAAC,IAAI,CAAC,0BAA0B,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;QAC/F,CAAC;IACH,CAAC;IAED,uBAAuB;IACvB,KAAK,CAAC,IAAI,CACR,uBAAuB;QACvB,+DAA+D;QAC/D,SAAS,mBAAmB,aAAa,CAC1C,CAAC;IAEF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
@@ -1,53 +0,0 @@
1
- /**
2
- * PM process supervision types.
3
- */
4
- import type { ChildProcess } from 'node:child_process';
5
- import type { Writable } from 'node:stream';
6
- /**
7
- * State of a supervised PM Claude Code process.
8
- */
9
- export interface PMProcessState {
10
- /** Product this PM process manages. */
11
- productId: string;
12
- /** Spawned child process handle. */
13
- proc: ChildProcess;
14
- /** PM session ID from the database. */
15
- pmSessionId: string;
16
- /** Claude Code session ID (set after stream init event). */
17
- claudeSessionId?: string;
18
- /** Current phase of the PM process. */
19
- phase: 'starting' | 'running' | 'stopping' | 'crashed';
20
- /** Number of times this process has been restarted. */
21
- restartCount: number;
22
- /** Timestamp of last restart (for backoff calculation). */
23
- lastRestartAt: Date | null;
24
- /** Stdin writable for sending messages. */
25
- stdin: Writable;
26
- /** Timestamp when this process was spawned (for maxSessionAge checks). */
27
- spawnedAt: Date;
28
- }
29
- /**
30
- * PM-specific configuration fields (resolved from daemon.json engines.pm section).
31
- *
32
- * Fields resolve with priority: env var > daemon.json engines.pm > default.
33
- * - loopIntervalMinutes: TELORA_PM_LOOP_INTERVAL (in minutes)
34
- * - maxRestarts: TELORA_PM_MAX_RESTARTS
35
- * - maxSessionAgeMs: TELORA_PM_MAX_SESSION_AGE (in minutes, converted to ms)
36
- */
37
- export interface PMProcessConfig {
38
- /** Interval for the /loop command in minutes. Default: 240 (4 hours). */
39
- loopIntervalMinutes: number;
40
- /** Maximum restart attempts before giving up. Default: 5. */
41
- maxRestarts: number;
42
- /** Whether process supervision is enabled. Default: true. */
43
- processEnabled: boolean;
44
- /**
45
- * Maximum age (ms) of a PM session before a health restart is triggered.
46
- * When a running PM process exceeds this age, the engine terminates and
47
- * respawns it to keep the session fresh. Default: 86400000 (24 hours).
48
- * Set to 0 to disable age-based restarts.
49
- */
50
- maxSessionAgeMs: number;
51
- }
52
- export declare const DEFAULT_PM_PROCESS_CONFIG: PMProcessConfig;
53
- //# sourceMappingURL=pm.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"pm.d.ts","sourceRoot":"","sources":["../../src/types/pm.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE5C;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,uCAAuC;IACvC,SAAS,EAAE,MAAM,CAAC;IAElB,oCAAoC;IACpC,IAAI,EAAE,YAAY,CAAC;IAEnB,uCAAuC;IACvC,WAAW,EAAE,MAAM,CAAC;IAEpB,4DAA4D;IAC5D,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB,uCAAuC;IACvC,KAAK,EAAE,UAAU,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,CAAC;IAEvD,uDAAuD;IACvD,YAAY,EAAE,MAAM,CAAC;IAErB,2DAA2D;IAC3D,aAAa,EAAE,IAAI,GAAG,IAAI,CAAC;IAE3B,2CAA2C;IAC3C,KAAK,EAAE,QAAQ,CAAC;IAEhB,0EAA0E;IAC1E,SAAS,EAAE,IAAI,CAAC;CACjB;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,eAAe;IAC9B,yEAAyE;IACzE,mBAAmB,EAAE,MAAM,CAAC;IAE5B,6DAA6D;IAC7D,WAAW,EAAE,MAAM,CAAC;IAEpB,6DAA6D;IAC7D,cAAc,EAAE,OAAO,CAAC;IAExB;;;;;OAKG;IACH,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,eAAO,MAAM,yBAAyB,EAAE,eAKvC,CAAC"}
package/dist/types/pm.js DELETED
@@ -1,10 +0,0 @@
1
- /**
2
- * PM process supervision types.
3
- */
4
- export const DEFAULT_PM_PROCESS_CONFIG = {
5
- loopIntervalMinutes: 240,
6
- maxRestarts: 5,
7
- processEnabled: true,
8
- maxSessionAgeMs: 24 * 60 * 60 * 1000, // 24 hours
9
- };
10
- //# sourceMappingURL=pm.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"pm.js","sourceRoot":"","sources":["../../src/types/pm.ts"],"names":[],"mappings":"AAAA;;GAEG;AAgEH,MAAM,CAAC,MAAM,yBAAyB,GAAoB;IACxD,mBAAmB,EAAE,GAAG;IACxB,WAAW,EAAE,CAAC;IACd,cAAc,EAAE,IAAI;IACpB,eAAe,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,WAAW;CAClD,CAAC"}