@intentic/sandbox-contract 1.321.0 → 1.323.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/contracts/agent.contract.d.ts +61 -6
- package/dist/contracts/agent.contract.d.ts.map +1 -1
- package/dist/contracts/agent.contract.js +13 -3
- package/dist/contracts/agent.contract.js.map +1 -1
- package/dist/contracts/agents.contract.d.ts +40 -0
- package/dist/contracts/agents.contract.d.ts.map +1 -1
- package/dist/contracts/loops.contract.d.ts +2 -0
- package/dist/contracts/loops.contract.d.ts.map +1 -1
- package/dist/contracts/needs.contract.d.ts +4 -0
- package/dist/contracts/needs.contract.d.ts.map +1 -1
- package/dist/contracts/privacy.contract.d.ts +187 -0
- package/dist/contracts/privacy.contract.d.ts.map +1 -0
- package/dist/contracts/privacy.contract.js +76 -0
- package/dist/contracts/privacy.contract.js.map +1 -0
- package/dist/contracts/runner.contract.d.ts +29 -18
- package/dist/contracts/runner.contract.d.ts.map +1 -1
- package/dist/contracts/sessions.contract.d.ts +3 -0
- package/dist/contracts/sessions.contract.d.ts.map +1 -1
- package/dist/contracts/system.contract.d.ts +36 -32
- package/dist/contracts/system.contract.d.ts.map +1 -1
- package/dist/contracts/usage.contract.d.ts +1 -0
- package/dist/contracts/usage.contract.d.ts.map +1 -1
- package/dist/contracts/workflows.contract.d.ts +3 -0
- package/dist/contracts/workflows.contract.d.ts.map +1 -1
- package/dist/events/agent-events.d.ts +14 -0
- package/dist/events/agent-events.d.ts.map +1 -1
- package/dist/events/agent-events.js +2 -0
- package/dist/events/agent-events.js.map +1 -1
- package/dist/events/requests.d.ts +3 -0
- package/dist/events/requests.d.ts.map +1 -1
- package/dist/events/requests.js +4 -0
- package/dist/events/requests.js.map +1 -1
- package/dist/events/resume.d.ts +1 -0
- package/dist/events/resume.d.ts.map +1 -1
- package/dist/events/resume.js +7 -1
- package/dist/events/resume.js.map +1 -1
- package/dist/events/sandbox-notice.d.ts +2 -0
- package/dist/events/sandbox-notice.d.ts.map +1 -1
- package/dist/events/sandbox-notice.js +1 -1
- package/dist/events/sandbox-notice.js.map +1 -1
- package/dist/events/system-events.d.ts +4 -0
- package/dist/events/system-events.d.ts.map +1 -1
- package/dist/events/transcript.d.ts +22 -0
- package/dist/events/transcript.d.ts.map +1 -1
- package/dist/events/transcript.js +42 -14
- package/dist/events/transcript.js.map +1 -1
- package/dist/front/generated/browser-wire.d.ts +4 -0
- package/dist/front/generated/browser-wire.d.ts.map +1 -1
- package/dist/index.d.ts +338 -38
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -1
- package/dist/models/agent-runtimes.d.ts +1 -0
- package/dist/models/agent-runtimes.d.ts.map +1 -1
- package/dist/models/agent-runtimes.js +6 -0
- package/dist/models/agent-runtimes.js.map +1 -1
- package/dist/policy/request-status.d.ts.map +1 -1
- package/dist/policy/request-status.js +16 -7
- package/dist/policy/request-status.js.map +1 -1
- package/dist/policy/turned-away.d.ts.map +1 -1
- package/dist/policy/turned-away.js +1 -0
- package/dist/policy/turned-away.js.map +1 -1
- package/dist/protocol/raw-routes.d.ts +12 -0
- package/dist/protocol/raw-routes.d.ts.map +1 -1
- package/dist/protocol/raw-routes.js +3 -0
- package/dist/protocol/raw-routes.js.map +1 -1
- package/dist/schemas/agent.d.ts +97 -0
- package/dist/schemas/agent.d.ts.map +1 -1
- package/dist/schemas/agent.js +20 -2
- package/dist/schemas/agent.js.map +1 -1
- package/dist/schemas/agents.d.ts +6 -0
- package/dist/schemas/agents.d.ts.map +1 -1
- package/dist/schemas/agents.js +1 -1
- package/dist/schemas/agents.js.map +1 -1
- package/dist/schemas/automations.d.ts +2 -0
- package/dist/schemas/automations.d.ts.map +1 -1
- package/dist/schemas/git/git.d.ts.map +1 -1
- package/dist/schemas/git/git.js.map +1 -1
- package/dist/schemas/loops.d.ts +3 -0
- package/dist/schemas/loops.d.ts.map +1 -1
- package/dist/schemas/loops.js +1 -1
- package/dist/schemas/loops.js.map +1 -1
- package/dist/schemas/needs.d.ts +6 -0
- package/dist/schemas/needs.d.ts.map +1 -1
- package/dist/schemas/needs.js +13 -3
- package/dist/schemas/needs.js.map +1 -1
- package/dist/schemas/platform-link.d.ts +50 -0
- package/dist/schemas/platform-link.d.ts.map +1 -0
- package/dist/schemas/platform-link.js +19 -0
- package/dist/schemas/platform-link.js.map +1 -0
- package/dist/schemas/privacy.d.ts +277 -0
- package/dist/schemas/privacy.d.ts.map +1 -0
- package/dist/schemas/privacy.js +127 -0
- package/dist/schemas/privacy.js.map +1 -0
- package/dist/schemas/providers/plan-limits.d.ts +8 -0
- package/dist/schemas/providers/plan-limits.d.ts.map +1 -1
- package/dist/schemas/providers/plan-limits.js +25 -4
- package/dist/schemas/providers/plan-limits.js.map +1 -1
- package/dist/schemas/providers/usage.d.ts +3 -0
- package/dist/schemas/providers/usage.d.ts.map +1 -1
- package/dist/schemas/providers/usage.js +4 -2
- package/dist/schemas/providers/usage.js.map +1 -1
- package/dist/schemas/push.d.ts +1 -0
- package/dist/schemas/push.d.ts.map +1 -1
- package/dist/schemas/push.js +4 -0
- package/dist/schemas/push.js.map +1 -1
- package/dist/schemas/workflows.d.ts +5 -0
- package/dist/schemas/workflows.d.ts.map +1 -1
- package/dist/state/workspace-state.d.ts +17 -1
- package/dist/state/workspace-state.d.ts.map +1 -1
- package/dist/state/workspace-state.js +20 -1
- package/dist/state/workspace-state.js.map +1 -1
- package/package.json +5 -5
- package/src/contracts/agent.contract.ts +16 -3
- package/src/contracts/privacy.contract.ts +95 -0
- package/src/events/agent-events.ts +5 -0
- package/src/events/requests.ts +6 -0
- package/src/events/resume.test.ts +13 -0
- package/src/events/resume.ts +11 -2
- package/src/events/sandbox-notice.ts +1 -1
- package/src/events/transcript.ts +79 -20
- package/src/front/generated/browser-wire.json +27 -0
- package/src/front/generated/browser-wire.ts +1 -1
- package/src/index.ts +5 -0
- package/src/models/agent-catalog.test.ts +1 -0
- package/src/models/agent-runtimes.ts +17 -0
- package/src/models/capability-ledger.test.ts +3 -0
- package/src/policy/request-status.ts +19 -9
- package/src/policy/turned-away.ts +2 -0
- package/src/protocol/raw-routes.ts +9 -0
- package/src/schemas/agent.ts +36 -4
- package/src/schemas/agents.ts +1 -1
- package/src/schemas/automations.ts +4 -4
- package/src/schemas/git/git.ts +1 -0
- package/src/schemas/loops.ts +2 -1
- package/src/schemas/needs.ts +18 -3
- package/src/schemas/platform-link.ts +42 -0
- package/src/schemas/privacy.ts +204 -0
- package/src/schemas/providers/plan-limits.ts +38 -5
- package/src/schemas/providers/usage.ts +10 -2
- package/src/schemas/push.ts +7 -0
- package/src/state/workspace-state.test.ts +8 -2
- package/src/state/workspace-state.ts +32 -2
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { ChildRunSchema } from "../../events/requests.js";
|
|
3
3
|
import { TRANSLATOR_PROVIDERS, type TranslatorProvider } from "../../models/provider-specs.js";
|
|
4
|
-
import { AgentHarnessSchema, AgentProviderSchema, EditorContextSchema } from "../agent.js";
|
|
4
|
+
import { AgentHarnessSchema, AgentProviderSchema, ConversationIdSchema, EditorContextSchema } from "../agent.js";
|
|
5
5
|
import { MENTION_LIMIT } from "../../text/mentions.js";
|
|
6
6
|
// Headroom is one shape shared by every provider, not a Claude idea others imitate: a native account and a routed
|
|
7
7
|
// subscription differ in who holds the credential, never in what a reading is. Every surface that draws a percentage
|
|
@@ -32,7 +32,9 @@ export const UsageUnreadSchema = z.object({
|
|
|
32
32
|
since: z.number().describe("When re-reading this account first failed, in milliseconds. It has failed on every attempt since."),
|
|
33
33
|
reason: z
|
|
34
34
|
.string()
|
|
35
|
-
.describe(
|
|
35
|
+
.describe(
|
|
36
|
+
'Why, in the provider\'s own words where it gave some ("Verify your account to continue."). Short enough to print; never a pasted response body.',
|
|
37
|
+
),
|
|
36
38
|
});
|
|
37
39
|
export type UsageUnread = z.infer<typeof UsageUnreadSchema>;
|
|
38
40
|
// Every window kept, not just the binding one, since which pool binds changes between turns. Utilization only climbs
|
|
@@ -202,18 +204,27 @@ export const AgentReplySchema = z.discriminatedUnion("kind", [
|
|
|
202
204
|
.record(z.string(), z.array(z.string()))
|
|
203
205
|
.optional()
|
|
204
206
|
.describe("What you chose, keyed by the question, with the chosen labels or your own words."),
|
|
207
|
+
attachments: z
|
|
208
|
+
.record(z.string(), z.array(z.string()))
|
|
209
|
+
.optional()
|
|
210
|
+
.describe(
|
|
211
|
+
"Files that go with your own-words answer, keyed by the question, as workspace-relative paths of files already uploaded (a screenshot, a mock-up).",
|
|
212
|
+
),
|
|
205
213
|
cancelled: z
|
|
206
214
|
.boolean()
|
|
207
215
|
.optional()
|
|
208
216
|
.describe("Dismissing it instead, which tells the agent to carry on using sensible defaults rather than leaving it waiting."),
|
|
209
217
|
}),
|
|
210
|
-
// "always" may be narrowed further by the SDK's own suggestions.
|
|
218
|
+
// "always" may be narrowed further by the SDK's own suggestions. "everything" is the conversation-wide yes the card's
|
|
219
|
+
// Allow menu offers: this call, and every later request in the conversation a person could have allowed once.
|
|
211
220
|
z.object({
|
|
212
221
|
kind: z.literal("permission").describe("Answering a request to use a tool."),
|
|
213
222
|
requestId: z.string().min(1).describe("Which card you are answering."),
|
|
214
223
|
decision: z
|
|
215
|
-
.enum(["once", "always", "deny"])
|
|
216
|
-
.describe(
|
|
224
|
+
.enum(["once", "always", "everything", "deny"])
|
|
225
|
+
.describe(
|
|
226
|
+
"Once allows this call alone; always allows what the request's always-label names (a tool, a rule, a secret) for the rest of the conversation; everything allows this call and every later request in this conversation that an allow-once could settle, until it is taken back on Grants; no blocks it. A request that always asks (alwaysAsks) reads everything as once.",
|
|
227
|
+
),
|
|
217
228
|
feedback: z.string().optional().describe("Why not, which goes back to the model as the reason."),
|
|
218
229
|
// Whole, not a patch: effort or an account named for one model means nothing on another.
|
|
219
230
|
child: ChildRunSchema.optional().describe(
|
|
@@ -401,6 +412,28 @@ export const QueueResumeSchema = z.object({
|
|
|
401
412
|
),
|
|
402
413
|
});
|
|
403
414
|
export type QueueResume = z.infer<typeof QueueResumeSchema>;
|
|
415
|
+
// Re-times what a conversation's queue holds: the same messages, booked for another instant or for after another
|
|
416
|
+
// conversation's work lands. One of the two, never both, since a hold waits on exactly one thing.
|
|
417
|
+
export const QueueScheduleSchema = z
|
|
418
|
+
.object({
|
|
419
|
+
conversationId: z.string().min(1).describe("Whose queue."),
|
|
420
|
+
sendAt: z
|
|
421
|
+
.number()
|
|
422
|
+
.int()
|
|
423
|
+
.positive()
|
|
424
|
+
.optional()
|
|
425
|
+
.describe("Send what waits at this instant (epoch milliseconds) instead. At most a month ahead; an instant already past sends it now."),
|
|
426
|
+
sendAfter: ConversationIdSchema.optional().describe(
|
|
427
|
+
"Send what waits once that conversation has finished and all of its work has landed in the workspace, instead. Sent now when it has nothing running and nothing left to land.",
|
|
428
|
+
),
|
|
429
|
+
})
|
|
430
|
+
.refine((input) => (input.sendAt === undefined) !== (input.sendAfter === undefined), {
|
|
431
|
+
message: "name exactly one of sendAt and sendAfter",
|
|
432
|
+
})
|
|
433
|
+
.refine((input) => input.sendAfter !== input.conversationId, {
|
|
434
|
+
message: "a conversation cannot wait for its own work to land",
|
|
435
|
+
});
|
|
436
|
+
export type QueueSchedule = z.infer<typeof QueueScheduleSchema>;
|
|
404
437
|
// Moves a conversation to another account of the provider it runs on: the one command that changes who pays, so the
|
|
405
438
|
// account a conversation runs on is always the daemon's record and never a window's guess.
|
|
406
439
|
export const SwitchAccountSchema = z.object({
|
|
@@ -42,11 +42,16 @@ export const UsageTurnSchema = z.object({
|
|
|
42
42
|
turns: z
|
|
43
43
|
.number()
|
|
44
44
|
.describe("The provider's own count for the request, since one exchange can be several under the hood. One when it reported none."),
|
|
45
|
-
inputTokens: z.number().describe("
|
|
45
|
+
inputTokens: z.number().describe("Uncached input tokens, excluding cache reads and cache writes."),
|
|
46
46
|
outputTokens: z.number().describe("Tokens received."),
|
|
47
47
|
cacheReadTokens: z.number().describe("Tokens served from cache, which cost less."),
|
|
48
48
|
cacheCreationTokens: z.number().describe("Tokens written to cache, which cost more up front and less afterwards."),
|
|
49
49
|
costUsd: z.number().describe("What it cost, in dollars."),
|
|
50
|
+
// Whether `costUsd` was reported by the vendor (true or absent) or is zero only because the vendor does not price
|
|
51
|
+
// its calls (false). Old rows before this field was added carry no marker, which readers treat as known: they
|
|
52
|
+
// already recorded a real number. Runtimes like Codex and Cursor report tokens but no cost, so their turns land
|
|
53
|
+
// with `costUsd: 0, costKnown: false` rather than silently claiming they were free.
|
|
54
|
+
costKnown: z.boolean().optional().describe("False when the vendor did not report a cost and the recorded zero is a placeholder, not a price. Absent or true means the cost is real."),
|
|
50
55
|
durationMs: z.number().describe("How long it took, in milliseconds."),
|
|
51
56
|
// Arm of the search-teaching experiment; stable per conversation. Absent means unmeasured.
|
|
52
57
|
iqSearchArm: z.boolean().optional(),
|
|
@@ -126,11 +131,14 @@ export const UsageRollupRowSchema = z.object({
|
|
|
126
131
|
harness: z.string().describe("Which agentic loop."),
|
|
127
132
|
conversationId: z.string().optional().describe("Which conversation."),
|
|
128
133
|
turns: z.number().describe("Turns in this group."),
|
|
129
|
-
inputTokens: z.number().describe("
|
|
134
|
+
inputTokens: z.number().describe("Uncached input tokens, excluding cache reads and cache writes."),
|
|
130
135
|
outputTokens: z.number().describe("Tokens received."),
|
|
131
136
|
cacheReadTokens: z.number().describe("Tokens served from cache."),
|
|
132
137
|
cacheCreationTokens: z.number().describe("Tokens written to cache."),
|
|
133
138
|
costUsd: z.number().describe("What the group cost, in dollars."),
|
|
139
|
+
// True when every turn in the group reported its cost; false when at least one did not, making `costUsd` a
|
|
140
|
+
// lower bound rather than the true total. Absent on rollups from before this field existed.
|
|
141
|
+
costKnown: z.boolean().optional().describe("False when the cost includes unpriced turns and is a lower bound rather than the true total."),
|
|
134
142
|
durationMs: z.number().describe("Time spent, in milliseconds."),
|
|
135
143
|
});
|
|
136
144
|
export type UsageRollupRow = z.infer<typeof UsageRollupRowSchema>;
|
package/src/schemas/push.ts
CHANGED
|
@@ -52,6 +52,13 @@ export const PushNotificationSchema = z.object({
|
|
|
52
52
|
.describe(
|
|
53
53
|
"Keep it on screen until it is dismissed. Used when the agent is waiting for you, where one that fades away is a question that went unanswered in silence.",
|
|
54
54
|
),
|
|
55
|
+
// Optional so an older service worker or relay, which ignores it, still shows the replacement under the same tag.
|
|
56
|
+
silent: z
|
|
57
|
+
.boolean()
|
|
58
|
+
.optional()
|
|
59
|
+
.describe(
|
|
60
|
+
"Arrive without sound or vibration. Used for the replacement that says an ask stopped waiting: it takes the waiting one's place under the same tag, and is news nobody has to act on.",
|
|
61
|
+
),
|
|
55
62
|
});
|
|
56
63
|
export type PushNotification = z.infer<typeof PushNotificationSchema>;
|
|
57
64
|
export const PushConfigSchema = z.object({
|
|
@@ -29,7 +29,7 @@ const AUTOMATIONS: readonly FileContribution[] = [
|
|
|
29
29
|
|
|
30
30
|
describe(`staleQueryKeys`, () => {
|
|
31
31
|
it(`maps a manifest write to the queries it makes stale`, () => {
|
|
32
|
-
expect(staleQueryKeys([`.intentic/config/capabilities.json`], [])).toEqual([`capabilities`, `environment`, `panels`, `manifests`]);
|
|
32
|
+
expect(staleQueryKeys([`.intentic/config/capabilities.json`], [])).toEqual([`capabilities`, `extensions`, `environment`, `panels`, `manifests`]);
|
|
33
33
|
});
|
|
34
34
|
|
|
35
35
|
it(`refreshes the unreadable-manifest notice for the four files a person hand-edits`, () => {
|
|
@@ -72,6 +72,7 @@ describe(`staleQueryKeys`, () => {
|
|
|
72
72
|
// A capability add recomposes the overlay, so both paths claim environment; one entry, not two.
|
|
73
73
|
expect(staleQueryKeys([`.intentic/config/capabilities.json`, `.intentic/config/environment.Dockerfile`], [])).toEqual([
|
|
74
74
|
`capabilities`,
|
|
75
|
+
`extensions`,
|
|
75
76
|
`environment`,
|
|
76
77
|
`panels`,
|
|
77
78
|
`manifests`,
|
|
@@ -160,7 +161,9 @@ describe(`WORKSPACE_STATE_FILES`, () => {
|
|
|
160
161
|
for (const file of WORKSPACE_STATE_FILES.filter((entry) => entry.invalidates.length > 0)) {
|
|
161
162
|
const isFamilyPrefix = file.path.endsWith(`.`);
|
|
162
163
|
// .md is the safety policy: the one state file a model reads as prose rather than a parser reading JSON.
|
|
163
|
-
|
|
164
|
+
// .toon is the field-notes brief, read by rank into every turn.
|
|
165
|
+
const isFile =
|
|
166
|
+
file.path.endsWith(`.json`) || file.path.endsWith(`.Dockerfile`) || file.path.endsWith(`.md`) || file.path.endsWith(`.toon`);
|
|
164
167
|
expect(isFile || isFamilyPrefix || file.path.endsWith(`/`), file.path).toBe(true);
|
|
165
168
|
}
|
|
166
169
|
});
|
|
@@ -348,6 +351,9 @@ describe(`VERSIONED_STATE_PATHS`, () => {
|
|
|
348
351
|
`${STATE_DIR}/config/extension-settings.json`,
|
|
349
352
|
// Per-extension update posture (notify/agent/auto): a standing decision on what may run unattended.
|
|
350
353
|
`${STATE_DIR}/config/extension-update-policy.json`,
|
|
354
|
+
// The field-notes brief every turn opens with. Tracked so the automation that rewrites it, which always
|
|
355
|
+
// runs isolated, can land its rewrite at all; and a new revision is worth a reviewable diff.
|
|
356
|
+
`${STATE_DIR}/config/field-notes.toon`,
|
|
351
357
|
// Which commands count as heavy, and how many may run at once; a shared-box decision worth a `git log`
|
|
352
358
|
// line.
|
|
353
359
|
`${STATE_DIR}/config/heavy-commands.json`,
|
|
@@ -42,10 +42,12 @@ const STATE_FILES = [
|
|
|
42
42
|
// Holds no credential: values are vaulted (capabilities-store.ts's withSecretVault) and read back rehydrated; the
|
|
43
43
|
// vaulted keys are the complement of what `echo` exposes (capabilities/credentials/secret-fields.ts). `carry` because
|
|
44
44
|
// composeEnvironment reads Dockerfile fragments from here; `versioned` because connecting a capability is a
|
|
45
|
-
// consequential change worth reviewing.
|
|
45
|
+
// consequential change worth reviewing. `extensions` because an installed extension is a capability entry: the
|
|
46
|
+
// daemon writes this file once the checkout is in place, so an install an agent or another tab made reaches an open
|
|
47
|
+
// Extensions view without a reload.
|
|
46
48
|
{
|
|
47
49
|
path: ".intentic/config/capabilities.json",
|
|
48
|
-
invalidates: ["capabilities", "environment", "panels", "manifests"],
|
|
50
|
+
invalidates: ["capabilities", "extensions", "environment", "panels", "manifests"],
|
|
49
51
|
portability: "carry",
|
|
50
52
|
versioned: true,
|
|
51
53
|
},
|
|
@@ -107,6 +109,14 @@ const STATE_FILES = [
|
|
|
107
109
|
portability: "derived",
|
|
108
110
|
note: "The target starts its own record of what it decided.",
|
|
109
111
|
},
|
|
112
|
+
// What the privacy shield's gateway did with each model request: kinds and counts, never a value. `derived`: evidence
|
|
113
|
+
// about this machine, self-trimming, not carried.
|
|
114
|
+
{
|
|
115
|
+
path: ".intentic/local/privacy-log.json",
|
|
116
|
+
invalidates: ["privacy-log"],
|
|
117
|
+
portability: "derived",
|
|
118
|
+
note: "The target starts its own record of what its shield did.",
|
|
119
|
+
},
|
|
110
120
|
// Apps the daemon starts on every boot (scaffold/autostart.ts). `carry`: an exported workspace should start the
|
|
111
121
|
// same things. Invalidates nothing: the browser reads what's running off `/panels`, not this file.
|
|
112
122
|
{
|
|
@@ -120,6 +130,17 @@ const STATE_FILES = [
|
|
|
120
130
|
// Bash command. `carry`: a property of the workspace, not the machine. `versioned`: raising the limit is a decision
|
|
121
131
|
// worth a diff.
|
|
122
132
|
{ path: ".intentic/config/heavy-commands.json", invalidates: ["settings"], portability: "carry", versioned: true },
|
|
133
|
+
// The field-notes brief composed into every turn (agent-context field-notes.ts), rewritten by the monthly
|
|
134
|
+
// `field-notes` automation. `versioned` is load-bearing, not just reviewability: automation wakes always run
|
|
135
|
+
// isolated, and an unversioned path is excluded from the root repo, so the rewrite would never leave its worktree.
|
|
136
|
+
// Feeds the agent-settings row (`settings.fieldNotes`).
|
|
137
|
+
{
|
|
138
|
+
path: ".intentic/config/field-notes.toon",
|
|
139
|
+
invalidates: ["settings"],
|
|
140
|
+
portability: "carry",
|
|
141
|
+
versioned: true,
|
|
142
|
+
outsideWriter: "the field-notes automation's agent turn (the daemon only reads it, through FIELD_NOTES_FILE)",
|
|
143
|
+
},
|
|
123
144
|
// Last-fired stamps for the rule table. `derived`: records what happened on this machine, not carried.
|
|
124
145
|
{
|
|
125
146
|
path: ".intentic/local/rule-firings.json",
|
|
@@ -163,6 +184,15 @@ const STATE_FILES = [
|
|
|
163
184
|
why: "Declared by the intentic.automations extension's contributes.files, `automations` is its query key, not core's.",
|
|
164
185
|
portability: "carry",
|
|
165
186
|
},
|
|
187
|
+
// How far the scheduler has accounted for each schedule's clock, so a boot fires the moments it slept through
|
|
188
|
+
// (automations/schedule-coverage.ts). `carry`: it travels with the automations it measures, or a restored sandbox
|
|
189
|
+
// would read every one as never armed.
|
|
190
|
+
{
|
|
191
|
+
path: ".intentic/records/automation-schedule.json",
|
|
192
|
+
invalidates: [],
|
|
193
|
+
why: "Scheduler bookkeeping nothing in the browser renders: what a catch-up fire produces reaches the run ledger, which carries the automations key.",
|
|
194
|
+
portability: "carry",
|
|
195
|
+
},
|
|
166
196
|
{
|
|
167
197
|
path: ".intentic/records/approvals/",
|
|
168
198
|
invalidates: [],
|