@paigy/harness 0.3.33 → 0.3.34

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 (3) hide show
  1. package/dist/cli.js +37 -77
  2. package/dist/main.js +36 -76
  3. package/package.json +1 -1
package/dist/cli.js CHANGED
@@ -24243,7 +24243,7 @@ ${block2}`;
24243
24243
  }
24244
24244
  return text.slice(0, start) + updated + text.slice(end);
24245
24245
  }
24246
- var import_undici, require2, CODEX_ENV, BACKEND_URL, NETWORK_MSG, PROXY_ENV, agent, INSTANCE_ID, WORKSPACE_ID, envSession, lineage, CLIENT, ignoreOverride, defaultOptions, getDefaultOptions, getRefs, getRelativePath, parseCatchDef, integerDateParser, isJsonSchema7AllOfType, emojiRegex2, zodPatterns, ALPHA_NUMERIC, primitiveMappings, asAnyOf, parseOptionalDef, parsePipelineDef, parseReadonlyDef, selectParser, get$ref, addMeta, zodToJsonSchema, OPTIONS_MIN, OPTIONS_MAX, OptionSchema, OptionInputSchema, NIGHT, AskInputSchema, StartContactSchema, ContactSchema, CONTACT_SCHEMA, CONTACT_DESCRIPTION, CreateGoalSchema, CreateGoalToolSchema, CREATE_GOAL_DESCRIPTION, UpdateGoalSchema, UpdateGoalToolSchema, ClaimGoalSchema, GetGoalSchema, GET_GOAL_DESCRIPTION, UPDATE_GOAL_DESCRIPTION, CLAIM_GOAL_DESCRIPTION, CHECK_REPLIES_DESCRIPTION, CheckRepliesSchema, AGENT_TOOLS, AGENT_TOOL_NAMES, id, key, participant, SourceSchema, ResultRefSchema, NodeRefSchema, DependencySchema, goalState, existingGoalChanges, GoalChangeSchema, BrainGoalChangeSchema, option, QuestionChangeSchema, lessonScope, LessonChangeSchema, BrainNextSchema, messageBase, BrainMessageSchema, BrainSearchSchema, BrainResultSchema, str, strs, CompactResultSchema, COMPACT_RESULT_JSON_SCHEMA, LIVE_MS, WORKING_MS, ContextSchema, ParticipantSchema, TransformSchema, VisualSchema, NotifyLevelSchema, SelectShapeSchema, ReceiptEventSchema, AttentionSchema, NotifyRequestFields, NotifyRequestSchema, NotifyStatusSchema, AgentStateSchema, TurnSchema, UserAnswerSchema, IntentSchema, RideAlongSchema, AwaitItemSchema, VoiceKeySchema, AgendaTurnSchema, CLAIM_STALE_MS, InboxItemSchema, APNS_TOKEN_RE, PushTokenSchema, MissedCallSchema, clock, QUIET, BrokerTuningSchema, UserSettingsSchema, HistoryWorkSchema, HistoryEntrySchema, HistoryPageSchema, ACTIVITY_LINES, ACTIVITY_LINE_MAX, AgentActivitySchema, ConnectionSummarySchema, LedgerItemSchema, AgentLedgerSchema, ReassignResultSchema, MoveRingSchema, MoveSchema, QueueQuestionSchema, QueueReplySchema, QueueItemSchema, QueueDeltaSchema, COLD_AFTER_MS, NoteSourceSchema, NoteStatusSchema, NoteRepeatSchema, DecisionSchema, NoteSchema, TriageItemSchema, TriageAssignmentSchema, TriageStatusSchema, SubmitTriageSchema, TriageProposalSchema, AcceptTriageSchema, AcceptTriageResultSchema, DeliveryModeSchema, WAKE_EVENT, wakeChannel, RegisterDeliverySchema, OAuthStartSchema, DeliveryConfigSchema, HostDecisionSchema, WakeNudgeSchema, PairingStatusSchema, DeviceCodeSchema, DeviceInfoSchema, DeviceTokenSchema, SupportRequestSchema, NotificationFeedbackKindSchema, SlimOptionSchema, QuestionRowSchema, WorkStateSchema, WorkRowSchema, ComputerRowSchema, AgentRowSchema, SnapshotSchema, CallRecapSchema, TOKEN_PATH, KEY_PATH, sleep, UnpairedError, RevokedError, ApiError, tokenOverride, authToken, AWAIT_WINDOW_MS, asked, NOT_SENT, DEMOTED, HEARTBEAT_MS, RETRY_MS, JOIN, JOIN_TIMEOUT_MS, lines;
24246
+ var import_undici, require2, CODEX_ENV, BACKEND_URL, NETWORK_MSG, PROXY_ENV, agent, INSTANCE_ID, WORKSPACE_ID, envSession, lineage, CLIENT, ignoreOverride, defaultOptions, getDefaultOptions, getRefs, getRelativePath, parseCatchDef, integerDateParser, isJsonSchema7AllOfType, emojiRegex2, zodPatterns, ALPHA_NUMERIC, primitiveMappings, asAnyOf, parseOptionalDef, parsePipelineDef, parseReadonlyDef, selectParser, get$ref, addMeta, zodToJsonSchema, OPTIONS_MIN, OPTIONS_MAX, OptionSchema, OptionInputSchema, NIGHT, AskInputSchema, StartContactSchema, ContactSchema, CONTACT_SCHEMA, CONTACT_DESCRIPTION, CreateGoalSchema, CreateGoalToolSchema, CREATE_GOAL_DESCRIPTION, UpdateGoalSchema, UpdateGoalToolSchema, ClaimGoalSchema, GetGoalSchema, GET_GOAL_DESCRIPTION, UPDATE_GOAL_DESCRIPTION, CLAIM_GOAL_DESCRIPTION, CHECK_REPLIES_DESCRIPTION, CheckRepliesSchema, AGENT_TOOLS, AGENT_TOOL_NAMES, id, key, participant, SourceSchema, ResultRefSchema, NodeRefSchema, DependencySchema, goalState, existingGoalChanges, GoalChangeSchema, BrainGoalChangeSchema, option, QuestionChangeSchema, lessonScope, LessonChangeSchema, BrainNextSchema, messageBase, BrainMessageSchema, BrainSearchSchema, BrainResultSchema, str, strs, CompactResultSchema, COMPACT_RESULT_JSON_SCHEMA, LIVE_MS, WORKING_MS, ContextSchema, ParticipantSchema, TransformSchema, VisualSchema, NotifyLevelSchema, SelectShapeSchema, ReceiptEventSchema, AttentionSchema, NotifyRequestFields, NotifyRequestSchema, NotifyStatusSchema, AgentStateSchema, TurnSchema, UserAnswerSchema, IntentSchema, RideAlongSchema, AwaitItemSchema, VoiceKeySchema, AgendaTurnSchema, CLAIM_STALE_MS, InboxItemSchema, APNS_TOKEN_RE, PushTokenSchema, MissedCallSchema, clock, QUIET, BrokerTuningSchema, UserSettingsSchema, HistoryWorkSchema, HistoryEntrySchema, HistoryPageSchema, ACTIVITY_LINES, ACTIVITY_LINE_MAX, AgentActivitySchema, ConnectionSummarySchema, LedgerItemSchema, AgentLedgerSchema, ReassignResultSchema, LessonStateSchema, LessonViewSchema, QueueQuestionSchema, QueueReplySchema, QueueItemSchema, QueueDeltaSchema, COLD_AFTER_MS, NoteSourceSchema, NoteStatusSchema, NoteRepeatSchema, DecisionSchema, NoteSchema, TriageItemSchema, TriageAssignmentSchema, TriageStatusSchema, SubmitTriageSchema, TriageProposalSchema, AcceptTriageSchema, AcceptTriageResultSchema, DeliveryModeSchema, WAKE_EVENT, wakeChannel, RegisterDeliverySchema, OAuthStartSchema, DeliveryConfigSchema, HostDecisionSchema, WakeNudgeSchema, PairingStatusSchema, DeviceCodeSchema, DeviceInfoSchema, DeviceTokenSchema, SupportRequestSchema, NotificationFeedbackKindSchema, SlimOptionSchema, QuestionRowSchema, WorkStateSchema, WorkRowSchema, ComputerRowSchema, AgentRowSchema, SnapshotSchema, CallRecapSchema, TOKEN_PATH, KEY_PATH, sleep, UnpairedError, RevokedError, ApiError, tokenOverride, authToken, AWAIT_WINDOW_MS, asked, NOT_SENT, DEMOTED, HEARTBEAT_MS, RETRY_MS, JOIN, JOIN_TIMEOUT_MS, lines;
24247
24247
  var init_dist = __esm({
24248
24248
  "../../packages/sdk/dist/index.js"() {
24249
24249
  "use strict";
@@ -24669,7 +24669,7 @@ var init_dist = __esm({
24669
24669
  'How the options are answered: "many" makes a checklist (they may want several, e.g. independent fixes), "one" (the default) a pick (choosing one rules out the others). Send "many" whenever more than one option could be wanted at once. The person can always answer in their own words as well. Ignored without options.'
24670
24670
  ),
24671
24671
  answers: external_exports.string().trim().regex(/^[0-9a-fA-F-]{8,36}$/).optional().describe(
24672
- "Your reply answers a question the person asked you: the id the conversation shows for it (8 characters or whole). Their question closes with this reply as its answer, and any decision of yours it was holding back goes back to them. Needs parentId: the Goal the question is on. The reply is sent to them as it is; to also ask something new, send that as its own ask."
24672
+ "Your reply answers a question the person asked you: the id the conversation shows for it (8 characters or whole). Their question closes with this reply as its answer, and any decision of yours it was holding back goes back to them. parentId is optional here: the question's own Goal is used. The reply is sent to them as it is; to also ask something new, send that as its own ask."
24673
24673
  )
24674
24674
  }).strict();
24675
24675
  StartContactSchema = external_exports.object({
@@ -24756,10 +24756,7 @@ var init_dist = __esm({
24756
24756
  id = external_exports.string().uuid();
24757
24757
  key = external_exports.string().min(1).max(40);
24758
24758
  participant = external_exports.string().regex(/^(human|agent):.+$/, "a participant ID such as agent:<uuid>");
24759
- SourceSchema = external_exports.object({
24760
- entryId: id,
24761
- span: external_exports.object({ start: external_exports.number().int().min(0), end: external_exports.number().int().min(1) }).strict().refine((s) => s.end > s.start, "a span ends after it starts").optional()
24762
- }).strict();
24759
+ SourceSchema = external_exports.object({ entryId: id }).strict();
24763
24760
  ResultRefSchema = external_exports.union([external_exports.object({ id }).strict(), external_exports.object({ local: key }).strict()]);
24764
24761
  NodeRefSchema = external_exports.object({ type: external_exports.enum(["goal", "question"]), id }).strict();
24765
24762
  DependencySchema = external_exports.object({
@@ -24851,7 +24848,7 @@ var init_dist = __esm({
24851
24848
  external_exports.object({ ...messageBase, to: external_exports.object({ kind: external_exports.literal("user") }).strict() }).strict(),
24852
24849
  external_exports.object({
24853
24850
  ...messageBase,
24854
- to: external_exports.object({ kind: external_exports.literal("session"), sessionId: id }).strict(),
24851
+ to: external_exports.object({ kind: external_exports.literal("agent"), agentId: external_exports.string().regex(/^agent:(?!paigy$)\S+$/) }).strict(),
24855
24852
  call: external_exports.object({ callId: id, listen: external_exports.literal(true) }).strict().optional()
24856
24853
  }).strict()
24857
24854
  ]);
@@ -24881,7 +24878,7 @@ var init_dist = __esm({
24881
24878
  CompactResultSchema = external_exports.object({
24882
24879
  next: external_exports.object({ say: strs, then: external_exports.enum(["listen", "hold", "end", "none"]), waitFor: strs, reason: str, instructions: strs }).strict(),
24883
24880
  messages: external_exports.array(external_exports.object({ key: str, to: str, text: str, about: strs, entries: strs, owed: strs, inviteToCall: external_exports.boolean() }).strict()),
24884
- entries: external_exports.array(external_exports.object({ key: str, from: str, start: external_exports.number().int(), end: external_exports.number().int(), on: strs }).strict()),
24881
+ entries: external_exports.array(external_exports.object({ key: str, from: str, on: strs }).strict()),
24885
24882
  answers: external_exports.array(external_exports.object({ question: str, entries: strs, summary: str, picked: strs }).strict()),
24886
24883
  changes: external_exports.array(external_exports.object({
24887
24884
  key: str,
@@ -25629,39 +25626,22 @@ var init_dist = __esm({
25629
25626
  moved: external_exports.object({ asks: external_exports.number(), answered: external_exports.number(), requests: external_exports.number(), goals: external_exports.number(), callbacks: external_exports.number() }),
25630
25627
  parentId: external_exports.string().nullable()
25631
25628
  });
25632
- MoveRingSchema = external_exports.enum(["home", "travels", "retired", "quarantined"]);
25633
- MoveSchema = external_exports.object({
25629
+ LessonStateSchema = external_exports.enum(["active", "proposed", "retired"]);
25630
+ LessonViewSchema = external_exports.object({
25634
25631
  id: external_exports.string(),
25635
- /** The reusable question, as distill normalized it. */
25636
- question: external_exports.string(),
25637
- /** The operative ruling. Editable by the user (PATCH) — which resets the ledger. */
25638
- answer: external_exports.string(),
25639
- /** The user's stated reason, when they gave one. Null = inherently narrow: the judge is
25640
- * told so, and the ruling only derives essentially the same question in the same scope. */
25641
- rationale: external_exports.string().nullable(),
25642
- /** Where the ruling lives: a repo/workspace, or 'global'. */
25643
- scope: external_exports.string(),
25644
- ring: MoveRingSchema,
25645
- /** True = the user pinned it with `always` (travel granted by hand, not by evidence). */
25632
+ text: external_exports.string(),
25633
+ state: LessonStateSchema,
25634
+ /** The Goal it is scoped to; null = the whole account. */
25635
+ scopeGoalId: external_exports.string().nullable(),
25636
+ goalTitle: external_exports.string().nullable(),
25637
+ version: external_exports.number(),
25646
25638
  pinned: external_exports.boolean(),
25647
- /** True = a pin the user placed was BROKEN by later counter-evidence. Surfaced so the
25648
- * break is visible instead of a pin silently disappearing. */
25649
- pinBroken: external_exports.boolean(),
25650
- /** When the ruling was distilled. */
25651
- learnedAt: external_exports.string(),
25652
- /** Last time it answered an ask. Null = never fired. */
25653
- lastUsedAt: external_exports.string().nullable(),
25654
- /** How many asks it has answered. Instrumentation — deliberately NOT an input to the
25655
- * evidence curve: firing says the question keeps arising, not that the ruling is right. */
25656
- usedCount: external_exports.number(),
25657
- /** Ledger: outcomes that said it held up. Saturating — the tenth is worth almost nothing. */
25658
- confirms: external_exports.number(),
25659
- /** Ledger: contradictions, in signal units (a full override = 1, weaker signals less).
25660
- * Linear and priced above the entire confirmation budget, so any full counter wins. */
25661
- counters: external_exports.number(),
25662
- /** The agent that asked the question this move came from, when known. Null for a move
25663
- * distilled from a clarify ruling (those carry no agent) or one whose source rows are gone. */
25664
- learnedFrom: external_exports.object({ id: external_exports.string(), name: external_exports.string() }).nullable()
25639
+ /** When the person last wrote its text themselves. */
25640
+ editedAt: external_exports.string().nullable(),
25641
+ createdAt: external_exports.string(),
25642
+ updatedAt: external_exports.string(),
25643
+ /** The Entries it came from, oldest first; `words` is null when an Entry has none to show (sealed). */
25644
+ sources: external_exports.array(external_exports.object({ entryId: external_exports.string(), words: external_exports.string().nullable(), at: external_exports.string() }))
25665
25645
  });
25666
25646
  QueueQuestionSchema = external_exports.object({
25667
25647
  /** The decision need's id — what an answer is accepted against. */
@@ -33278,7 +33258,7 @@ var AskInputSchema2 = external_exports.object({
33278
33258
  'How the options are answered: "many" makes a checklist (they may want several, e.g. independent fixes), "one" (the default) a pick (choosing one rules out the others). Send "many" whenever more than one option could be wanted at once. The person can always answer in their own words as well. Ignored without options.'
33279
33259
  ),
33280
33260
  answers: external_exports.string().trim().regex(/^[0-9a-fA-F-]{8,36}$/).optional().describe(
33281
- "Your reply answers a question the person asked you: the id the conversation shows for it (8 characters or whole). Their question closes with this reply as its answer, and any decision of yours it was holding back goes back to them. Needs parentId: the Goal the question is on. The reply is sent to them as it is; to also ask something new, send that as its own ask."
33261
+ "Your reply answers a question the person asked you: the id the conversation shows for it (8 characters or whole). Their question closes with this reply as its answer, and any decision of yours it was holding back goes back to them. parentId is optional here: the question's own Goal is used. The reply is sent to them as it is; to also ask something new, send that as its own ask."
33282
33262
  )
33283
33263
  }).strict();
33284
33264
  var StartContactSchema2 = external_exports.object({
@@ -33365,10 +33345,7 @@ var AGENT_TOOL_NAMES2 = AGENT_TOOLS2.map((t) => t.name);
33365
33345
  var id2 = external_exports.string().uuid();
33366
33346
  var key2 = external_exports.string().min(1).max(40);
33367
33347
  var participant2 = external_exports.string().regex(/^(human|agent):.+$/, "a participant ID such as agent:<uuid>");
33368
- var SourceSchema2 = external_exports.object({
33369
- entryId: id2,
33370
- span: external_exports.object({ start: external_exports.number().int().min(0), end: external_exports.number().int().min(1) }).strict().refine((s) => s.end > s.start, "a span ends after it starts").optional()
33371
- }).strict();
33348
+ var SourceSchema2 = external_exports.object({ entryId: id2 }).strict();
33372
33349
  var ResultRefSchema2 = external_exports.union([external_exports.object({ id: id2 }).strict(), external_exports.object({ local: key2 }).strict()]);
33373
33350
  var NodeRefSchema2 = external_exports.object({ type: external_exports.enum(["goal", "question"]), id: id2 }).strict();
33374
33351
  var DependencySchema2 = external_exports.object({
@@ -33460,7 +33437,7 @@ var BrainMessageSchema2 = external_exports.union([
33460
33437
  external_exports.object({ ...messageBase2, to: external_exports.object({ kind: external_exports.literal("user") }).strict() }).strict(),
33461
33438
  external_exports.object({
33462
33439
  ...messageBase2,
33463
- to: external_exports.object({ kind: external_exports.literal("session"), sessionId: id2 }).strict(),
33440
+ to: external_exports.object({ kind: external_exports.literal("agent"), agentId: external_exports.string().regex(/^agent:(?!paigy$)\S+$/) }).strict(),
33464
33441
  call: external_exports.object({ callId: id2, listen: external_exports.literal(true) }).strict().optional()
33465
33442
  }).strict()
33466
33443
  ]);
@@ -33490,7 +33467,7 @@ var strs2 = external_exports.array(external_exports.string());
33490
33467
  var CompactResultSchema2 = external_exports.object({
33491
33468
  next: external_exports.object({ say: strs2, then: external_exports.enum(["listen", "hold", "end", "none"]), waitFor: strs2, reason: str2, instructions: strs2 }).strict(),
33492
33469
  messages: external_exports.array(external_exports.object({ key: str2, to: str2, text: str2, about: strs2, entries: strs2, owed: strs2, inviteToCall: external_exports.boolean() }).strict()),
33493
- entries: external_exports.array(external_exports.object({ key: str2, from: str2, start: external_exports.number().int(), end: external_exports.number().int(), on: strs2 }).strict()),
33470
+ entries: external_exports.array(external_exports.object({ key: str2, from: str2, on: strs2 }).strict()),
33494
33471
  answers: external_exports.array(external_exports.object({ question: str2, entries: strs2, summary: str2, picked: strs2 }).strict()),
33495
33472
  changes: external_exports.array(external_exports.object({
33496
33473
  key: str2,
@@ -34255,39 +34232,22 @@ var ReassignResultSchema2 = external_exports.object({
34255
34232
  moved: external_exports.object({ asks: external_exports.number(), answered: external_exports.number(), requests: external_exports.number(), goals: external_exports.number(), callbacks: external_exports.number() }),
34256
34233
  parentId: external_exports.string().nullable()
34257
34234
  });
34258
- var MoveRingSchema2 = external_exports.enum(["home", "travels", "retired", "quarantined"]);
34259
- var MoveSchema2 = external_exports.object({
34235
+ var LessonStateSchema2 = external_exports.enum(["active", "proposed", "retired"]);
34236
+ var LessonViewSchema2 = external_exports.object({
34260
34237
  id: external_exports.string(),
34261
- /** The reusable question, as distill normalized it. */
34262
- question: external_exports.string(),
34263
- /** The operative ruling. Editable by the user (PATCH) — which resets the ledger. */
34264
- answer: external_exports.string(),
34265
- /** The user's stated reason, when they gave one. Null = inherently narrow: the judge is
34266
- * told so, and the ruling only derives essentially the same question in the same scope. */
34267
- rationale: external_exports.string().nullable(),
34268
- /** Where the ruling lives: a repo/workspace, or 'global'. */
34269
- scope: external_exports.string(),
34270
- ring: MoveRingSchema2,
34271
- /** True = the user pinned it with `always` (travel granted by hand, not by evidence). */
34238
+ text: external_exports.string(),
34239
+ state: LessonStateSchema2,
34240
+ /** The Goal it is scoped to; null = the whole account. */
34241
+ scopeGoalId: external_exports.string().nullable(),
34242
+ goalTitle: external_exports.string().nullable(),
34243
+ version: external_exports.number(),
34272
34244
  pinned: external_exports.boolean(),
34273
- /** True = a pin the user placed was BROKEN by later counter-evidence. Surfaced so the
34274
- * break is visible instead of a pin silently disappearing. */
34275
- pinBroken: external_exports.boolean(),
34276
- /** When the ruling was distilled. */
34277
- learnedAt: external_exports.string(),
34278
- /** Last time it answered an ask. Null = never fired. */
34279
- lastUsedAt: external_exports.string().nullable(),
34280
- /** How many asks it has answered. Instrumentation — deliberately NOT an input to the
34281
- * evidence curve: firing says the question keeps arising, not that the ruling is right. */
34282
- usedCount: external_exports.number(),
34283
- /** Ledger: outcomes that said it held up. Saturating — the tenth is worth almost nothing. */
34284
- confirms: external_exports.number(),
34285
- /** Ledger: contradictions, in signal units (a full override = 1, weaker signals less).
34286
- * Linear and priced above the entire confirmation budget, so any full counter wins. */
34287
- counters: external_exports.number(),
34288
- /** The agent that asked the question this move came from, when known. Null for a move
34289
- * distilled from a clarify ruling (those carry no agent) or one whose source rows are gone. */
34290
- learnedFrom: external_exports.object({ id: external_exports.string(), name: external_exports.string() }).nullable()
34245
+ /** When the person last wrote its text themselves. */
34246
+ editedAt: external_exports.string().nullable(),
34247
+ createdAt: external_exports.string(),
34248
+ updatedAt: external_exports.string(),
34249
+ /** The Entries it came from, oldest first; `words` is null when an Entry has none to show (sealed). */
34250
+ sources: external_exports.array(external_exports.object({ entryId: external_exports.string(), words: external_exports.string().nullable(), at: external_exports.string() }))
34291
34251
  });
34292
34252
  var QueueQuestionSchema2 = external_exports.object({
34293
34253
  /** The decision need's id — what an answer is accepted against. */
package/dist/main.js CHANGED
@@ -9987,7 +9987,7 @@ var AskInputSchema = external_exports.object({
9987
9987
  'How the options are answered: "many" makes a checklist (they may want several, e.g. independent fixes), "one" (the default) a pick (choosing one rules out the others). Send "many" whenever more than one option could be wanted at once. The person can always answer in their own words as well. Ignored without options.'
9988
9988
  ),
9989
9989
  answers: external_exports.string().trim().regex(/^[0-9a-fA-F-]{8,36}$/).optional().describe(
9990
- "Your reply answers a question the person asked you: the id the conversation shows for it (8 characters or whole). Their question closes with this reply as its answer, and any decision of yours it was holding back goes back to them. Needs parentId: the Goal the question is on. The reply is sent to them as it is; to also ask something new, send that as its own ask."
9990
+ "Your reply answers a question the person asked you: the id the conversation shows for it (8 characters or whole). Their question closes with this reply as its answer, and any decision of yours it was holding back goes back to them. parentId is optional here: the question's own Goal is used. The reply is sent to them as it is; to also ask something new, send that as its own ask."
9991
9991
  )
9992
9992
  }).strict();
9993
9993
  var StartContactSchema = external_exports.object({
@@ -10074,10 +10074,7 @@ var AGENT_TOOL_NAMES = AGENT_TOOLS.map((t) => t.name);
10074
10074
  var id = external_exports.string().uuid();
10075
10075
  var key = external_exports.string().min(1).max(40);
10076
10076
  var participant = external_exports.string().regex(/^(human|agent):.+$/, "a participant ID such as agent:<uuid>");
10077
- var SourceSchema = external_exports.object({
10078
- entryId: id,
10079
- span: external_exports.object({ start: external_exports.number().int().min(0), end: external_exports.number().int().min(1) }).strict().refine((s) => s.end > s.start, "a span ends after it starts").optional()
10080
- }).strict();
10077
+ var SourceSchema = external_exports.object({ entryId: id }).strict();
10081
10078
  var ResultRefSchema = external_exports.union([external_exports.object({ id }).strict(), external_exports.object({ local: key }).strict()]);
10082
10079
  var NodeRefSchema = external_exports.object({ type: external_exports.enum(["goal", "question"]), id }).strict();
10083
10080
  var DependencySchema = external_exports.object({
@@ -10169,7 +10166,7 @@ var BrainMessageSchema = external_exports.union([
10169
10166
  external_exports.object({ ...messageBase, to: external_exports.object({ kind: external_exports.literal("user") }).strict() }).strict(),
10170
10167
  external_exports.object({
10171
10168
  ...messageBase,
10172
- to: external_exports.object({ kind: external_exports.literal("session"), sessionId: id }).strict(),
10169
+ to: external_exports.object({ kind: external_exports.literal("agent"), agentId: external_exports.string().regex(/^agent:(?!paigy$)\S+$/) }).strict(),
10173
10170
  call: external_exports.object({ callId: id, listen: external_exports.literal(true) }).strict().optional()
10174
10171
  }).strict()
10175
10172
  ]);
@@ -10199,7 +10196,7 @@ var strs = external_exports.array(external_exports.string());
10199
10196
  var CompactResultSchema = external_exports.object({
10200
10197
  next: external_exports.object({ say: strs, then: external_exports.enum(["listen", "hold", "end", "none"]), waitFor: strs, reason: str, instructions: strs }).strict(),
10201
10198
  messages: external_exports.array(external_exports.object({ key: str, to: str, text: str, about: strs, entries: strs, owed: strs, inviteToCall: external_exports.boolean() }).strict()),
10202
- entries: external_exports.array(external_exports.object({ key: str, from: str, start: external_exports.number().int(), end: external_exports.number().int(), on: strs }).strict()),
10199
+ entries: external_exports.array(external_exports.object({ key: str, from: str, on: strs }).strict()),
10203
10200
  answers: external_exports.array(external_exports.object({ question: str, entries: strs, summary: str, picked: strs }).strict()),
10204
10201
  changes: external_exports.array(external_exports.object({
10205
10202
  key: str,
@@ -10947,39 +10944,22 @@ var ReassignResultSchema = external_exports.object({
10947
10944
  moved: external_exports.object({ asks: external_exports.number(), answered: external_exports.number(), requests: external_exports.number(), goals: external_exports.number(), callbacks: external_exports.number() }),
10948
10945
  parentId: external_exports.string().nullable()
10949
10946
  });
10950
- var MoveRingSchema = external_exports.enum(["home", "travels", "retired", "quarantined"]);
10951
- var MoveSchema = external_exports.object({
10947
+ var LessonStateSchema = external_exports.enum(["active", "proposed", "retired"]);
10948
+ var LessonViewSchema = external_exports.object({
10952
10949
  id: external_exports.string(),
10953
- /** The reusable question, as distill normalized it. */
10954
- question: external_exports.string(),
10955
- /** The operative ruling. Editable by the user (PATCH) — which resets the ledger. */
10956
- answer: external_exports.string(),
10957
- /** The user's stated reason, when they gave one. Null = inherently narrow: the judge is
10958
- * told so, and the ruling only derives essentially the same question in the same scope. */
10959
- rationale: external_exports.string().nullable(),
10960
- /** Where the ruling lives: a repo/workspace, or 'global'. */
10961
- scope: external_exports.string(),
10962
- ring: MoveRingSchema,
10963
- /** True = the user pinned it with `always` (travel granted by hand, not by evidence). */
10950
+ text: external_exports.string(),
10951
+ state: LessonStateSchema,
10952
+ /** The Goal it is scoped to; null = the whole account. */
10953
+ scopeGoalId: external_exports.string().nullable(),
10954
+ goalTitle: external_exports.string().nullable(),
10955
+ version: external_exports.number(),
10964
10956
  pinned: external_exports.boolean(),
10965
- /** True = a pin the user placed was BROKEN by later counter-evidence. Surfaced so the
10966
- * break is visible instead of a pin silently disappearing. */
10967
- pinBroken: external_exports.boolean(),
10968
- /** When the ruling was distilled. */
10969
- learnedAt: external_exports.string(),
10970
- /** Last time it answered an ask. Null = never fired. */
10971
- lastUsedAt: external_exports.string().nullable(),
10972
- /** How many asks it has answered. Instrumentation — deliberately NOT an input to the
10973
- * evidence curve: firing says the question keeps arising, not that the ruling is right. */
10974
- usedCount: external_exports.number(),
10975
- /** Ledger: outcomes that said it held up. Saturating — the tenth is worth almost nothing. */
10976
- confirms: external_exports.number(),
10977
- /** Ledger: contradictions, in signal units (a full override = 1, weaker signals less).
10978
- * Linear and priced above the entire confirmation budget, so any full counter wins. */
10979
- counters: external_exports.number(),
10980
- /** The agent that asked the question this move came from, when known. Null for a move
10981
- * distilled from a clarify ruling (those carry no agent) or one whose source rows are gone. */
10982
- learnedFrom: external_exports.object({ id: external_exports.string(), name: external_exports.string() }).nullable()
10957
+ /** When the person last wrote its text themselves. */
10958
+ editedAt: external_exports.string().nullable(),
10959
+ createdAt: external_exports.string(),
10960
+ updatedAt: external_exports.string(),
10961
+ /** The Entries it came from, oldest first; `words` is null when an Entry has none to show (sealed). */
10962
+ sources: external_exports.array(external_exports.object({ entryId: external_exports.string(), words: external_exports.string().nullable(), at: external_exports.string() }))
10983
10963
  });
10984
10964
  var QueueQuestionSchema = external_exports.object({
10985
10965
  /** The decision need's id — what an answer is accepted against. */
@@ -14329,7 +14309,7 @@ var AskInputSchema2 = external_exports.object({
14329
14309
  'How the options are answered: "many" makes a checklist (they may want several, e.g. independent fixes), "one" (the default) a pick (choosing one rules out the others). Send "many" whenever more than one option could be wanted at once. The person can always answer in their own words as well. Ignored without options.'
14330
14310
  ),
14331
14311
  answers: external_exports.string().trim().regex(/^[0-9a-fA-F-]{8,36}$/).optional().describe(
14332
- "Your reply answers a question the person asked you: the id the conversation shows for it (8 characters or whole). Their question closes with this reply as its answer, and any decision of yours it was holding back goes back to them. Needs parentId: the Goal the question is on. The reply is sent to them as it is; to also ask something new, send that as its own ask."
14312
+ "Your reply answers a question the person asked you: the id the conversation shows for it (8 characters or whole). Their question closes with this reply as its answer, and any decision of yours it was holding back goes back to them. parentId is optional here: the question's own Goal is used. The reply is sent to them as it is; to also ask something new, send that as its own ask."
14333
14313
  )
14334
14314
  }).strict();
14335
14315
  var StartContactSchema2 = external_exports.object({
@@ -14416,10 +14396,7 @@ var AGENT_TOOL_NAMES2 = AGENT_TOOLS2.map((t) => t.name);
14416
14396
  var id2 = external_exports.string().uuid();
14417
14397
  var key2 = external_exports.string().min(1).max(40);
14418
14398
  var participant2 = external_exports.string().regex(/^(human|agent):.+$/, "a participant ID such as agent:<uuid>");
14419
- var SourceSchema2 = external_exports.object({
14420
- entryId: id2,
14421
- span: external_exports.object({ start: external_exports.number().int().min(0), end: external_exports.number().int().min(1) }).strict().refine((s) => s.end > s.start, "a span ends after it starts").optional()
14422
- }).strict();
14399
+ var SourceSchema2 = external_exports.object({ entryId: id2 }).strict();
14423
14400
  var ResultRefSchema2 = external_exports.union([external_exports.object({ id: id2 }).strict(), external_exports.object({ local: key2 }).strict()]);
14424
14401
  var NodeRefSchema2 = external_exports.object({ type: external_exports.enum(["goal", "question"]), id: id2 }).strict();
14425
14402
  var DependencySchema2 = external_exports.object({
@@ -14511,7 +14488,7 @@ var BrainMessageSchema2 = external_exports.union([
14511
14488
  external_exports.object({ ...messageBase2, to: external_exports.object({ kind: external_exports.literal("user") }).strict() }).strict(),
14512
14489
  external_exports.object({
14513
14490
  ...messageBase2,
14514
- to: external_exports.object({ kind: external_exports.literal("session"), sessionId: id2 }).strict(),
14491
+ to: external_exports.object({ kind: external_exports.literal("agent"), agentId: external_exports.string().regex(/^agent:(?!paigy$)\S+$/) }).strict(),
14515
14492
  call: external_exports.object({ callId: id2, listen: external_exports.literal(true) }).strict().optional()
14516
14493
  }).strict()
14517
14494
  ]);
@@ -14541,7 +14518,7 @@ var strs2 = external_exports.array(external_exports.string());
14541
14518
  var CompactResultSchema2 = external_exports.object({
14542
14519
  next: external_exports.object({ say: strs2, then: external_exports.enum(["listen", "hold", "end", "none"]), waitFor: strs2, reason: str2, instructions: strs2 }).strict(),
14543
14520
  messages: external_exports.array(external_exports.object({ key: str2, to: str2, text: str2, about: strs2, entries: strs2, owed: strs2, inviteToCall: external_exports.boolean() }).strict()),
14544
- entries: external_exports.array(external_exports.object({ key: str2, from: str2, start: external_exports.number().int(), end: external_exports.number().int(), on: strs2 }).strict()),
14521
+ entries: external_exports.array(external_exports.object({ key: str2, from: str2, on: strs2 }).strict()),
14545
14522
  answers: external_exports.array(external_exports.object({ question: str2, entries: strs2, summary: str2, picked: strs2 }).strict()),
14546
14523
  changes: external_exports.array(external_exports.object({
14547
14524
  key: str2,
@@ -15306,39 +15283,22 @@ var ReassignResultSchema2 = external_exports.object({
15306
15283
  moved: external_exports.object({ asks: external_exports.number(), answered: external_exports.number(), requests: external_exports.number(), goals: external_exports.number(), callbacks: external_exports.number() }),
15307
15284
  parentId: external_exports.string().nullable()
15308
15285
  });
15309
- var MoveRingSchema2 = external_exports.enum(["home", "travels", "retired", "quarantined"]);
15310
- var MoveSchema2 = external_exports.object({
15286
+ var LessonStateSchema2 = external_exports.enum(["active", "proposed", "retired"]);
15287
+ var LessonViewSchema2 = external_exports.object({
15311
15288
  id: external_exports.string(),
15312
- /** The reusable question, as distill normalized it. */
15313
- question: external_exports.string(),
15314
- /** The operative ruling. Editable by the user (PATCH) — which resets the ledger. */
15315
- answer: external_exports.string(),
15316
- /** The user's stated reason, when they gave one. Null = inherently narrow: the judge is
15317
- * told so, and the ruling only derives essentially the same question in the same scope. */
15318
- rationale: external_exports.string().nullable(),
15319
- /** Where the ruling lives: a repo/workspace, or 'global'. */
15320
- scope: external_exports.string(),
15321
- ring: MoveRingSchema2,
15322
- /** True = the user pinned it with `always` (travel granted by hand, not by evidence). */
15289
+ text: external_exports.string(),
15290
+ state: LessonStateSchema2,
15291
+ /** The Goal it is scoped to; null = the whole account. */
15292
+ scopeGoalId: external_exports.string().nullable(),
15293
+ goalTitle: external_exports.string().nullable(),
15294
+ version: external_exports.number(),
15323
15295
  pinned: external_exports.boolean(),
15324
- /** True = a pin the user placed was BROKEN by later counter-evidence. Surfaced so the
15325
- * break is visible instead of a pin silently disappearing. */
15326
- pinBroken: external_exports.boolean(),
15327
- /** When the ruling was distilled. */
15328
- learnedAt: external_exports.string(),
15329
- /** Last time it answered an ask. Null = never fired. */
15330
- lastUsedAt: external_exports.string().nullable(),
15331
- /** How many asks it has answered. Instrumentation — deliberately NOT an input to the
15332
- * evidence curve: firing says the question keeps arising, not that the ruling is right. */
15333
- usedCount: external_exports.number(),
15334
- /** Ledger: outcomes that said it held up. Saturating — the tenth is worth almost nothing. */
15335
- confirms: external_exports.number(),
15336
- /** Ledger: contradictions, in signal units (a full override = 1, weaker signals less).
15337
- * Linear and priced above the entire confirmation budget, so any full counter wins. */
15338
- counters: external_exports.number(),
15339
- /** The agent that asked the question this move came from, when known. Null for a move
15340
- * distilled from a clarify ruling (those carry no agent) or one whose source rows are gone. */
15341
- learnedFrom: external_exports.object({ id: external_exports.string(), name: external_exports.string() }).nullable()
15296
+ /** When the person last wrote its text themselves. */
15297
+ editedAt: external_exports.string().nullable(),
15298
+ createdAt: external_exports.string(),
15299
+ updatedAt: external_exports.string(),
15300
+ /** The Entries it came from, oldest first; `words` is null when an Entry has none to show (sealed). */
15301
+ sources: external_exports.array(external_exports.object({ entryId: external_exports.string(), words: external_exports.string().nullable(), at: external_exports.string() }))
15342
15302
  });
15343
15303
  var QueueQuestionSchema2 = external_exports.object({
15344
15304
  /** The decision need's id — what an answer is accepted against. */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@paigy/harness",
3
- "version": "0.3.33",
3
+ "version": "0.3.34",
4
4
  "description": "Run Claude Code / Codex on this machine, bridged to Paigy — launchable from your phone.",
5
5
  "license": "MIT",
6
6
  "type": "module",