@ghostpaw/questlog 0.7.0 → 0.9.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/index.cjs CHANGED
@@ -3282,6 +3282,17 @@ function useToolNext(tool, message, suggestedInput = {}) {
3282
3282
  };
3283
3283
  }
3284
3284
 
3285
+ // src/tools/quest_resolution_fields.ts
3286
+ function questResolutionFields({
3287
+ outcome,
3288
+ resolvedAt
3289
+ }) {
3290
+ const fields = {};
3291
+ if (outcome != null) fields.outcome = outcome;
3292
+ if (resolvedAt != null) fields.resolvedAt = resolvedAt;
3293
+ return fields;
3294
+ }
3295
+
3285
3296
  // src/tools/tool_ref.ts
3286
3297
  function toQuestRef(quest) {
3287
3298
  return {
@@ -3289,15 +3300,12 @@ function toQuestRef(quest) {
3289
3300
  id: quest.id,
3290
3301
  title: quest.title,
3291
3302
  markerId: "markerId" in quest ? quest.markerId : null,
3292
- state: "state" in quest ? quest.state : deriveQuestState({
3293
- startedAt: quest.startedAt,
3294
- resolvedAt: quest.resolvedAt,
3295
- success: quest.success
3296
- })
3303
+ state: "state" in quest ? quest.state : deriveQuestState(quest)
3297
3304
  };
3298
3305
  }
3299
3306
  function toQuestListItem(quest) {
3300
3307
  return {
3308
+ ...questResolutionFields(quest),
3301
3309
  ...toQuestRef(quest),
3302
3310
  subtitle: quest.objective,
3303
3311
  dueAt: quest.effectiveDueAt,
@@ -3429,55 +3437,56 @@ var captureRumorTool = defineQuestlogTool({
3429
3437
  });
3430
3438
 
3431
3439
  // src/tools/inspect_questlog_item_tool.ts
3440
+ function compactFields(detail, keys) {
3441
+ const compact = {};
3442
+ for (const key of keys) compact[key] = detail[key];
3443
+ return compact;
3444
+ }
3432
3445
  function toQuestCompactDetail(detail) {
3433
3446
  return {
3434
- id: detail.id,
3435
- title: detail.title,
3436
- objective: detail.objective,
3437
- state: detail.state,
3438
- markerId: detail.markerId,
3439
- available: detail.available,
3440
- effectiveDueAt: detail.effectiveDueAt,
3441
- tagNames: detail.tagNames,
3442
- questlineId: detail.questlineId,
3443
- sourceRumorId: detail.sourceRumorId,
3444
- spawnedFromRepeatableId: detail.spawnedFromRepeatableId
3447
+ ...questResolutionFields(detail),
3448
+ ...compactFields(detail, [
3449
+ "id",
3450
+ "title",
3451
+ "objective",
3452
+ "state",
3453
+ "markerId",
3454
+ "available",
3455
+ "effectiveDueAt",
3456
+ "tagNames",
3457
+ "questlineId",
3458
+ "sourceRumorId",
3459
+ "spawnedFromRepeatableId"
3460
+ ])
3445
3461
  };
3446
3462
  }
3447
3463
  function toQuestlineCompactDetail(detail) {
3448
- return {
3449
- id: detail.id,
3450
- title: detail.title,
3451
- description: detail.description,
3452
- dueAt: detail.dueAt,
3453
- archivedAt: detail.archivedAt,
3454
- totalQuests: detail.totalQuests,
3455
- availableQuests: detail.availableQuests,
3456
- overdueQuests: detail.overdueQuests,
3457
- sourceRumorId: detail.sourceRumorId
3458
- };
3464
+ return compactFields(detail, [
3465
+ "id",
3466
+ "title",
3467
+ "description",
3468
+ "dueAt",
3469
+ "archivedAt",
3470
+ "totalQuests",
3471
+ "availableQuests",
3472
+ "overdueQuests",
3473
+ "sourceRumorId"
3474
+ ]);
3459
3475
  }
3460
3476
  function toRepeatableQuestCompactDetail(detail) {
3461
- return {
3462
- id: detail.id,
3463
- title: detail.title,
3464
- objective: detail.objective,
3465
- rrule: detail.rrule,
3466
- anchorAt: detail.anchorAt,
3467
- questlineId: detail.questlineId,
3468
- archivedAt: detail.archivedAt,
3469
- deletedAt: detail.deletedAt
3470
- };
3477
+ return compactFields(detail, [
3478
+ "id",
3479
+ "title",
3480
+ "objective",
3481
+ "rrule",
3482
+ "anchorAt",
3483
+ "questlineId",
3484
+ "archivedAt",
3485
+ "deletedAt"
3486
+ ]);
3471
3487
  }
3472
3488
  function toRumorCompactDetail(detail) {
3473
- return {
3474
- id: detail.id,
3475
- title: detail.title,
3476
- details: detail.details,
3477
- state: detail.state,
3478
- markerId: detail.markerId,
3479
- outputs: detail.outputs
3480
- };
3489
+ return compactFields(detail, ["id", "title", "details", "state", "markerId", "outputs"]);
3481
3490
  }
3482
3491
  function inspectQuestlogItemToolHandler(db, input) {
3483
3492
  const detailLevel = input.detailLevel ?? "compact";
@@ -4743,6 +4752,16 @@ var rewardWorkTool = defineQuestlogTool({
4743
4752
  function runQuestToolHandler(db, input) {
4744
4753
  try {
4745
4754
  const current = getQuestDetail(db, input.questId);
4755
+ if (input.action !== "start" && input.action !== "log_effort") {
4756
+ const outcome = input.outcome;
4757
+ if (typeof outcome !== "string") {
4758
+ return toolNeedsClarification(
4759
+ "missing_required_choice",
4760
+ `What outcome should be recorded for quest \`${current.title}\`?`,
4761
+ ["outcome"]
4762
+ );
4763
+ }
4764
+ }
4746
4765
  switch (input.action) {
4747
4766
  case "start": {
4748
4767
  if (current.resolvedAt != null) {
package/dist/index.d.cts CHANGED
@@ -1005,6 +1005,8 @@ interface ToolEntityRef {
1005
1005
  state?: string | null | undefined;
1006
1006
  }
1007
1007
  interface ToolListItem extends ToolEntityRef {
1008
+ outcome?: string;
1009
+ resolvedAt?: number;
1008
1010
  subtitle?: string | undefined;
1009
1011
  snippet?: string | undefined;
1010
1012
  dueAt?: number | null | undefined;
@@ -1151,6 +1153,8 @@ interface InspectQuestlogItemToolData {
1151
1153
  detailLevel: 'compact' | 'full';
1152
1154
  }
1153
1155
  interface QuestCompactDetail {
1156
+ outcome?: string;
1157
+ resolvedAt?: number;
1154
1158
  id: number;
1155
1159
  title: string;
1156
1160
  objective: string;
package/dist/index.d.ts CHANGED
@@ -1005,6 +1005,8 @@ interface ToolEntityRef {
1005
1005
  state?: string | null | undefined;
1006
1006
  }
1007
1007
  interface ToolListItem extends ToolEntityRef {
1008
+ outcome?: string;
1009
+ resolvedAt?: number;
1008
1010
  subtitle?: string | undefined;
1009
1011
  snippet?: string | undefined;
1010
1012
  dueAt?: number | null | undefined;
@@ -1151,6 +1153,8 @@ interface InspectQuestlogItemToolData {
1151
1153
  detailLevel: 'compact' | 'full';
1152
1154
  }
1153
1155
  interface QuestCompactDetail {
1156
+ outcome?: string;
1157
+ resolvedAt?: number;
1154
1158
  id: number;
1155
1159
  title: string;
1156
1160
  objective: string;
package/dist/index.js CHANGED
@@ -3280,6 +3280,17 @@ function useToolNext(tool, message, suggestedInput = {}) {
3280
3280
  };
3281
3281
  }
3282
3282
 
3283
+ // src/tools/quest_resolution_fields.ts
3284
+ function questResolutionFields({
3285
+ outcome,
3286
+ resolvedAt
3287
+ }) {
3288
+ const fields = {};
3289
+ if (outcome != null) fields.outcome = outcome;
3290
+ if (resolvedAt != null) fields.resolvedAt = resolvedAt;
3291
+ return fields;
3292
+ }
3293
+
3283
3294
  // src/tools/tool_ref.ts
3284
3295
  function toQuestRef(quest) {
3285
3296
  return {
@@ -3287,15 +3298,12 @@ function toQuestRef(quest) {
3287
3298
  id: quest.id,
3288
3299
  title: quest.title,
3289
3300
  markerId: "markerId" in quest ? quest.markerId : null,
3290
- state: "state" in quest ? quest.state : deriveQuestState({
3291
- startedAt: quest.startedAt,
3292
- resolvedAt: quest.resolvedAt,
3293
- success: quest.success
3294
- })
3301
+ state: "state" in quest ? quest.state : deriveQuestState(quest)
3295
3302
  };
3296
3303
  }
3297
3304
  function toQuestListItem(quest) {
3298
3305
  return {
3306
+ ...questResolutionFields(quest),
3299
3307
  ...toQuestRef(quest),
3300
3308
  subtitle: quest.objective,
3301
3309
  dueAt: quest.effectiveDueAt,
@@ -3427,55 +3435,56 @@ var captureRumorTool = defineQuestlogTool({
3427
3435
  });
3428
3436
 
3429
3437
  // src/tools/inspect_questlog_item_tool.ts
3438
+ function compactFields(detail, keys) {
3439
+ const compact = {};
3440
+ for (const key of keys) compact[key] = detail[key];
3441
+ return compact;
3442
+ }
3430
3443
  function toQuestCompactDetail(detail) {
3431
3444
  return {
3432
- id: detail.id,
3433
- title: detail.title,
3434
- objective: detail.objective,
3435
- state: detail.state,
3436
- markerId: detail.markerId,
3437
- available: detail.available,
3438
- effectiveDueAt: detail.effectiveDueAt,
3439
- tagNames: detail.tagNames,
3440
- questlineId: detail.questlineId,
3441
- sourceRumorId: detail.sourceRumorId,
3442
- spawnedFromRepeatableId: detail.spawnedFromRepeatableId
3445
+ ...questResolutionFields(detail),
3446
+ ...compactFields(detail, [
3447
+ "id",
3448
+ "title",
3449
+ "objective",
3450
+ "state",
3451
+ "markerId",
3452
+ "available",
3453
+ "effectiveDueAt",
3454
+ "tagNames",
3455
+ "questlineId",
3456
+ "sourceRumorId",
3457
+ "spawnedFromRepeatableId"
3458
+ ])
3443
3459
  };
3444
3460
  }
3445
3461
  function toQuestlineCompactDetail(detail) {
3446
- return {
3447
- id: detail.id,
3448
- title: detail.title,
3449
- description: detail.description,
3450
- dueAt: detail.dueAt,
3451
- archivedAt: detail.archivedAt,
3452
- totalQuests: detail.totalQuests,
3453
- availableQuests: detail.availableQuests,
3454
- overdueQuests: detail.overdueQuests,
3455
- sourceRumorId: detail.sourceRumorId
3456
- };
3462
+ return compactFields(detail, [
3463
+ "id",
3464
+ "title",
3465
+ "description",
3466
+ "dueAt",
3467
+ "archivedAt",
3468
+ "totalQuests",
3469
+ "availableQuests",
3470
+ "overdueQuests",
3471
+ "sourceRumorId"
3472
+ ]);
3457
3473
  }
3458
3474
  function toRepeatableQuestCompactDetail(detail) {
3459
- return {
3460
- id: detail.id,
3461
- title: detail.title,
3462
- objective: detail.objective,
3463
- rrule: detail.rrule,
3464
- anchorAt: detail.anchorAt,
3465
- questlineId: detail.questlineId,
3466
- archivedAt: detail.archivedAt,
3467
- deletedAt: detail.deletedAt
3468
- };
3475
+ return compactFields(detail, [
3476
+ "id",
3477
+ "title",
3478
+ "objective",
3479
+ "rrule",
3480
+ "anchorAt",
3481
+ "questlineId",
3482
+ "archivedAt",
3483
+ "deletedAt"
3484
+ ]);
3469
3485
  }
3470
3486
  function toRumorCompactDetail(detail) {
3471
- return {
3472
- id: detail.id,
3473
- title: detail.title,
3474
- details: detail.details,
3475
- state: detail.state,
3476
- markerId: detail.markerId,
3477
- outputs: detail.outputs
3478
- };
3487
+ return compactFields(detail, ["id", "title", "details", "state", "markerId", "outputs"]);
3479
3488
  }
3480
3489
  function inspectQuestlogItemToolHandler(db, input) {
3481
3490
  const detailLevel = input.detailLevel ?? "compact";
@@ -4741,6 +4750,16 @@ var rewardWorkTool = defineQuestlogTool({
4741
4750
  function runQuestToolHandler(db, input) {
4742
4751
  try {
4743
4752
  const current = getQuestDetail(db, input.questId);
4753
+ if (input.action !== "start" && input.action !== "log_effort") {
4754
+ const outcome = input.outcome;
4755
+ if (typeof outcome !== "string") {
4756
+ return toolNeedsClarification(
4757
+ "missing_required_choice",
4758
+ `What outcome should be recorded for quest \`${current.title}\`?`,
4759
+ ["outcome"]
4760
+ );
4761
+ }
4762
+ }
4744
4763
  switch (input.action) {
4745
4764
  case "start": {
4746
4765
  if (current.resolvedAt != null) {
@@ -677,7 +677,7 @@ var init_open_questlog_db = __esm({
677
677
  var questlogVersion;
678
678
  var init_version = __esm({
679
679
  "src/version.ts"() {
680
- questlogVersion = "0.7.0";
680
+ questlogVersion = "0.9.0";
681
681
  }
682
682
  });
683
683
 
@@ -1082,6 +1082,21 @@ var init_derive_quest_state = __esm({
1082
1082
  }
1083
1083
  });
1084
1084
 
1085
+ // src/tools/quest_resolution_fields.ts
1086
+ function questResolutionFields({
1087
+ outcome,
1088
+ resolvedAt
1089
+ }) {
1090
+ const fields = {};
1091
+ if (outcome != null) fields.outcome = outcome;
1092
+ if (resolvedAt != null) fields.resolvedAt = resolvedAt;
1093
+ return fields;
1094
+ }
1095
+ var init_quest_resolution_fields = __esm({
1096
+ "src/tools/quest_resolution_fields.ts"() {
1097
+ }
1098
+ });
1099
+
1085
1100
  // src/tools/tool_ref.ts
1086
1101
  function toQuestRef(quest) {
1087
1102
  return {
@@ -1089,15 +1104,12 @@ function toQuestRef(quest) {
1089
1104
  id: quest.id,
1090
1105
  title: quest.title,
1091
1106
  markerId: "markerId" in quest ? quest.markerId : null,
1092
- state: "state" in quest ? quest.state : deriveQuestState({
1093
- startedAt: quest.startedAt,
1094
- resolvedAt: quest.resolvedAt,
1095
- success: quest.success
1096
- })
1107
+ state: "state" in quest ? quest.state : deriveQuestState(quest)
1097
1108
  };
1098
1109
  }
1099
1110
  function toQuestListItem(quest) {
1100
1111
  return {
1112
+ ...questResolutionFields(quest),
1101
1113
  ...toQuestRef(quest),
1102
1114
  subtitle: quest.objective,
1103
1115
  dueAt: quest.effectiveDueAt,
@@ -1175,6 +1187,7 @@ var init_tool_ref = __esm({
1175
1187
  "src/tools/tool_ref.ts"() {
1176
1188
  init_derive_quest_state();
1177
1189
  init_derive_rumor_state();
1190
+ init_quest_resolution_fields();
1178
1191
  }
1179
1192
  });
1180
1193
 
@@ -1710,55 +1723,56 @@ var init_get_rumor_detail = __esm({
1710
1723
  });
1711
1724
 
1712
1725
  // src/tools/inspect_questlog_item_tool.ts
1726
+ function compactFields(detail, keys) {
1727
+ const compact = {};
1728
+ for (const key of keys) compact[key] = detail[key];
1729
+ return compact;
1730
+ }
1713
1731
  function toQuestCompactDetail(detail) {
1714
1732
  return {
1715
- id: detail.id,
1716
- title: detail.title,
1717
- objective: detail.objective,
1718
- state: detail.state,
1719
- markerId: detail.markerId,
1720
- available: detail.available,
1721
- effectiveDueAt: detail.effectiveDueAt,
1722
- tagNames: detail.tagNames,
1723
- questlineId: detail.questlineId,
1724
- sourceRumorId: detail.sourceRumorId,
1725
- spawnedFromRepeatableId: detail.spawnedFromRepeatableId
1733
+ ...questResolutionFields(detail),
1734
+ ...compactFields(detail, [
1735
+ "id",
1736
+ "title",
1737
+ "objective",
1738
+ "state",
1739
+ "markerId",
1740
+ "available",
1741
+ "effectiveDueAt",
1742
+ "tagNames",
1743
+ "questlineId",
1744
+ "sourceRumorId",
1745
+ "spawnedFromRepeatableId"
1746
+ ])
1726
1747
  };
1727
1748
  }
1728
1749
  function toQuestlineCompactDetail(detail) {
1729
- return {
1730
- id: detail.id,
1731
- title: detail.title,
1732
- description: detail.description,
1733
- dueAt: detail.dueAt,
1734
- archivedAt: detail.archivedAt,
1735
- totalQuests: detail.totalQuests,
1736
- availableQuests: detail.availableQuests,
1737
- overdueQuests: detail.overdueQuests,
1738
- sourceRumorId: detail.sourceRumorId
1739
- };
1750
+ return compactFields(detail, [
1751
+ "id",
1752
+ "title",
1753
+ "description",
1754
+ "dueAt",
1755
+ "archivedAt",
1756
+ "totalQuests",
1757
+ "availableQuests",
1758
+ "overdueQuests",
1759
+ "sourceRumorId"
1760
+ ]);
1740
1761
  }
1741
1762
  function toRepeatableQuestCompactDetail(detail) {
1742
- return {
1743
- id: detail.id,
1744
- title: detail.title,
1745
- objective: detail.objective,
1746
- rrule: detail.rrule,
1747
- anchorAt: detail.anchorAt,
1748
- questlineId: detail.questlineId,
1749
- archivedAt: detail.archivedAt,
1750
- deletedAt: detail.deletedAt
1751
- };
1763
+ return compactFields(detail, [
1764
+ "id",
1765
+ "title",
1766
+ "objective",
1767
+ "rrule",
1768
+ "anchorAt",
1769
+ "questlineId",
1770
+ "archivedAt",
1771
+ "deletedAt"
1772
+ ]);
1752
1773
  }
1753
1774
  function toRumorCompactDetail(detail) {
1754
- return {
1755
- id: detail.id,
1756
- title: detail.title,
1757
- details: detail.details,
1758
- state: detail.state,
1759
- markerId: detail.markerId,
1760
- outputs: detail.outputs
1761
- };
1775
+ return compactFields(detail, ["id", "title", "details", "state", "markerId", "outputs"]);
1762
1776
  }
1763
1777
  function inspectQuestlogItemToolHandler(db, input) {
1764
1778
  const detailLevel = input.detailLevel ?? "compact";
@@ -1865,6 +1879,7 @@ var init_inspect_questlog_item_tool = __esm({
1865
1879
  init_get_quest_detail();
1866
1880
  init_get_repeatable_quest_or_throw();
1867
1881
  init_get_rumor_detail();
1882
+ init_quest_resolution_fields();
1868
1883
  init_tool_errors();
1869
1884
  init_tool_metadata();
1870
1885
  init_tool_names();
@@ -4611,6 +4626,16 @@ var init_reward_work_tool = __esm({
4611
4626
  function runQuestToolHandler(db, input) {
4612
4627
  try {
4613
4628
  const current = getQuestDetail(db, input.questId);
4629
+ if (input.action !== "start" && input.action !== "log_effort") {
4630
+ const outcome = input.outcome;
4631
+ if (typeof outcome !== "string") {
4632
+ return toolNeedsClarification(
4633
+ "missing_required_choice",
4634
+ `What outcome should be recorded for quest \`${current.title}\`?`,
4635
+ ["outcome"]
4636
+ );
4637
+ }
4638
+ }
4614
4639
  switch (input.action) {
4615
4640
  case "start": {
4616
4641
  if (current.resolvedAt != null) {
package/dist/mcp.cjs CHANGED
@@ -386,7 +386,7 @@ async function openQuestlogDb(path) {
386
386
  }
387
387
 
388
388
  // src/version.ts
389
- var questlogVersion = "0.7.0";
389
+ var questlogVersion = "0.9.0";
390
390
 
391
391
  // src/surface/questlog_mcp_instructions.ts
392
392
  var questlogMcpInstructions = "Questlog manages local tasks, calendar commitments, and recurring work. Search before creating work, inspect before changing it, and keep uncertain work as rumors. Use unlock prerequisites to sequence work. run_quest refuses blocked starts unless force is true. Review commitments and resolve work with an honest outcome.";
@@ -723,6 +723,17 @@ function deriveQuestState(quest) {
723
723
  return "open";
724
724
  }
725
725
 
726
+ // src/tools/quest_resolution_fields.ts
727
+ function questResolutionFields({
728
+ outcome,
729
+ resolvedAt
730
+ }) {
731
+ const fields = {};
732
+ if (outcome != null) fields.outcome = outcome;
733
+ if (resolvedAt != null) fields.resolvedAt = resolvedAt;
734
+ return fields;
735
+ }
736
+
726
737
  // src/tools/tool_ref.ts
727
738
  function toQuestRef(quest) {
728
739
  return {
@@ -730,15 +741,12 @@ function toQuestRef(quest) {
730
741
  id: quest.id,
731
742
  title: quest.title,
732
743
  markerId: "markerId" in quest ? quest.markerId : null,
733
- state: "state" in quest ? quest.state : deriveQuestState({
734
- startedAt: quest.startedAt,
735
- resolvedAt: quest.resolvedAt,
736
- success: quest.success
737
- })
744
+ state: "state" in quest ? quest.state : deriveQuestState(quest)
738
745
  };
739
746
  }
740
747
  function toQuestListItem(quest) {
741
748
  return {
749
+ ...questResolutionFields(quest),
742
750
  ...toQuestRef(quest),
743
751
  subtitle: quest.objective,
744
752
  dueAt: quest.effectiveDueAt,
@@ -1264,55 +1272,56 @@ function getRumorDetail(db, rumorId) {
1264
1272
  }
1265
1273
 
1266
1274
  // src/tools/inspect_questlog_item_tool.ts
1275
+ function compactFields(detail, keys) {
1276
+ const compact = {};
1277
+ for (const key of keys) compact[key] = detail[key];
1278
+ return compact;
1279
+ }
1267
1280
  function toQuestCompactDetail(detail) {
1268
1281
  return {
1269
- id: detail.id,
1270
- title: detail.title,
1271
- objective: detail.objective,
1272
- state: detail.state,
1273
- markerId: detail.markerId,
1274
- available: detail.available,
1275
- effectiveDueAt: detail.effectiveDueAt,
1276
- tagNames: detail.tagNames,
1277
- questlineId: detail.questlineId,
1278
- sourceRumorId: detail.sourceRumorId,
1279
- spawnedFromRepeatableId: detail.spawnedFromRepeatableId
1282
+ ...questResolutionFields(detail),
1283
+ ...compactFields(detail, [
1284
+ "id",
1285
+ "title",
1286
+ "objective",
1287
+ "state",
1288
+ "markerId",
1289
+ "available",
1290
+ "effectiveDueAt",
1291
+ "tagNames",
1292
+ "questlineId",
1293
+ "sourceRumorId",
1294
+ "spawnedFromRepeatableId"
1295
+ ])
1280
1296
  };
1281
1297
  }
1282
1298
  function toQuestlineCompactDetail(detail) {
1283
- return {
1284
- id: detail.id,
1285
- title: detail.title,
1286
- description: detail.description,
1287
- dueAt: detail.dueAt,
1288
- archivedAt: detail.archivedAt,
1289
- totalQuests: detail.totalQuests,
1290
- availableQuests: detail.availableQuests,
1291
- overdueQuests: detail.overdueQuests,
1292
- sourceRumorId: detail.sourceRumorId
1293
- };
1299
+ return compactFields(detail, [
1300
+ "id",
1301
+ "title",
1302
+ "description",
1303
+ "dueAt",
1304
+ "archivedAt",
1305
+ "totalQuests",
1306
+ "availableQuests",
1307
+ "overdueQuests",
1308
+ "sourceRumorId"
1309
+ ]);
1294
1310
  }
1295
1311
  function toRepeatableQuestCompactDetail(detail) {
1296
- return {
1297
- id: detail.id,
1298
- title: detail.title,
1299
- objective: detail.objective,
1300
- rrule: detail.rrule,
1301
- anchorAt: detail.anchorAt,
1302
- questlineId: detail.questlineId,
1303
- archivedAt: detail.archivedAt,
1304
- deletedAt: detail.deletedAt
1305
- };
1312
+ return compactFields(detail, [
1313
+ "id",
1314
+ "title",
1315
+ "objective",
1316
+ "rrule",
1317
+ "anchorAt",
1318
+ "questlineId",
1319
+ "archivedAt",
1320
+ "deletedAt"
1321
+ ]);
1306
1322
  }
1307
1323
  function toRumorCompactDetail(detail) {
1308
- return {
1309
- id: detail.id,
1310
- title: detail.title,
1311
- details: detail.details,
1312
- state: detail.state,
1313
- markerId: detail.markerId,
1314
- outputs: detail.outputs
1315
- };
1324
+ return compactFields(detail, ["id", "title", "details", "state", "markerId", "outputs"]);
1316
1325
  }
1317
1326
  function inspectQuestlogItemToolHandler(db, input) {
1318
1327
  const detailLevel = input.detailLevel ?? "compact";
@@ -3599,6 +3608,16 @@ var rewardWorkTool = defineQuestlogTool({
3599
3608
  function runQuestToolHandler(db, input) {
3600
3609
  try {
3601
3610
  const current = getQuestDetail(db, input.questId);
3611
+ if (input.action !== "start" && input.action !== "log_effort") {
3612
+ const outcome = input.outcome;
3613
+ if (typeof outcome !== "string") {
3614
+ return toolNeedsClarification(
3615
+ "missing_required_choice",
3616
+ `What outcome should be recorded for quest \`${current.title}\`?`,
3617
+ ["outcome"]
3618
+ );
3619
+ }
3620
+ }
3602
3621
  switch (input.action) {
3603
3622
  case "start": {
3604
3623
  if (current.resolvedAt != null) {