remosidian 0.1.13 → 0.1.15

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/CHANGELOG.md CHANGED
@@ -1,5 +1,13 @@
1
1
  # Remosidian CLI 更新日志
2
2
 
3
+ ## 0.1.15
4
+
5
+ - Receive a private assistant inbox with routed messages and conversation notifications.
6
+
7
+ ## 0.1.14
8
+
9
+ - Follow proactive assistant routines with model routing and execution receipts.
10
+
3
11
  ## 0.1.13
4
12
 
5
13
  - Resume paired assistant conversations and cancel stalled replies before continuing.
@@ -16644,6 +16644,8 @@ function isAssistantSummary(value) {
16644
16644
  v.focus.every((goal) => goal &&
16645
16645
  typeof goal.id === 'string' &&
16646
16646
  typeof goal.title === 'string' &&
16647
+ typeof goal.source === 'string' &&
16648
+ ['project', 'theme'].includes(goal.kind) &&
16647
16649
  ['active', 'paused', 'blocked', 'review', 'completed'].includes(goal.status) &&
16648
16650
  Number.isSafeInteger(goal.priority) &&
16649
16651
  typeof goal.summary === 'string' &&
@@ -16658,11 +16660,39 @@ function isAssistantReply(value) {
16658
16660
  v.text.length <= 30000 &&
16659
16661
  Number.isFinite(v.checkedAt) &&
16660
16662
  (v.receiptId === undefined || typeof v.receiptId === 'string') &&
16663
+ (v.runtime === undefined ||
16664
+ (typeof v.runtime === 'object' &&
16665
+ v.runtime !== null &&
16666
+ ['cli', 'pi-durable'].includes(v.runtime.engine) &&
16667
+ typeof v.runtime.provider === 'string' &&
16668
+ v.runtime.provider.length <= 100 &&
16669
+ typeof v.runtime.model === 'string' &&
16670
+ v.runtime.model.length <= 200 &&
16671
+ Number.isFinite(v.runtime.durationMs) &&
16672
+ v.runtime.durationMs >= 0 &&
16673
+ Number.isSafeInteger(v.runtime.inputTokens) &&
16674
+ v.runtime.inputTokens >= 0 &&
16675
+ Number.isSafeInteger(v.runtime.outputTokens) &&
16676
+ v.runtime.outputTokens >= 0)) &&
16677
+ (v.receipt === undefined ||
16678
+ (typeof v.receipt === 'object' &&
16679
+ v.receipt !== null &&
16680
+ typeof v.receipt.id === 'string' &&
16681
+ v.receipt.id.length <= 256 &&
16682
+ typeof v.receipt.action === 'string' &&
16683
+ v.receipt.action.length <= 5000 &&
16684
+ v.receipt.status === 'completed' &&
16685
+ (v.receipt.goalId === undefined || (typeof v.receipt.goalId === 'string' && v.receipt.goalId.length <= 256)) &&
16686
+ (v.receipt.goalSource === undefined || typeof v.receipt.goalSource === 'string') &&
16687
+ (v.receipt.goalKind === undefined || ['project', 'theme'].includes(v.receipt.goalKind)) &&
16688
+ Number.isFinite(v.receipt.createdAt))) &&
16661
16689
  (v.proposal === undefined ||
16662
16690
  (typeof v.proposal === 'object' &&
16663
16691
  v.proposal !== null &&
16664
16692
  typeof v.proposal.id === 'string' &&
16665
- typeof v.proposal.description === 'string')));
16693
+ typeof v.proposal.description === 'string' &&
16694
+ ['L2', 'L3'].includes(v.proposal.risk) &&
16695
+ Number.isFinite(v.proposal.expiresAt))));
16666
16696
  }
16667
16697
  //# sourceMappingURL=assistant.js.map
16668
16698
  ;// CONCATENATED MODULE: ../../packages/remosidian-protocol/dist/assistant-signals.js
@@ -16686,11 +16716,78 @@ function isAssistantSignals(value) {
16686
16716
  v.notifications.every((x) => x &&
16687
16717
  typeof x.id === 'string' &&
16688
16718
  typeof x.goalId === 'string' &&
16689
- ['started', 'progress', 'decision', 'review', 'blocked', 'failure', 'completed', 'summary'].includes(x.kind) &&
16719
+ ['started', 'progress', 'decision', 'review', 'blocked', 'failure', 'completed', 'summary', 'meeting'].includes(x.kind) &&
16690
16720
  typeof x.title === 'string' &&
16691
16721
  typeof x.body === 'string' &&
16692
16722
  Number.isFinite(x.createdAt) &&
16693
- typeof x.read === 'boolean'));
16723
+ typeof x.read === 'boolean' &&
16724
+ ['urgent', 'normal', 'low'].includes(x.priority) &&
16725
+ (x.proposalId === undefined || typeof x.proposalId === 'string')) &&
16726
+ Array.isArray(v.triage) &&
16727
+ v.triage.length <= 50 &&
16728
+ v.triage.every((x) => x &&
16729
+ typeof x.id === 'string' &&
16730
+ (x.goalId === null || typeof x.goalId === 'string') &&
16731
+ typeof x.source === 'string' &&
16732
+ ['ignore', 'action', 'uncertain'].includes(x.kind) &&
16733
+ Number.isFinite(x.confidence) &&
16734
+ typeof x.summary === 'string' &&
16735
+ typeof x.reason === 'string' &&
16736
+ typeof x.model === 'string' &&
16737
+ ['ignored', 'unassigned', 'pending', 'queued'].includes(x.state) &&
16738
+ (x.matchedBy === undefined || ['model', 'automatic'].includes(x.matchedBy)) &&
16739
+ (x.workflow === undefined || x.workflow === 'meeting-prep') &&
16740
+ (x.feedback === undefined || ['correct', 'incorrect', 'wrong-goal'].includes(x.feedback)) &&
16741
+ (x.replySuggestion === undefined ||
16742
+ (typeof x.replySuggestion === 'string' && x.replySuggestion.length <= 600)) &&
16743
+ typeof x.wouldDo === 'string' &&
16744
+ Number.isFinite(x.createdAt)) &&
16745
+ Boolean(v.shadowReview &&
16746
+ ['observed', 'ignored', 'actionable', 'uncertain', 'linked', 'unassigned', 'reviewed'].every((key) => Number.isSafeInteger(v.shadowReview[key]))) &&
16747
+ [0, 1, 2, 3].includes(v.permissionLevel) &&
16748
+ Number.isFinite(v.shadowUntil) &&
16749
+ typeof v.shadowActive === 'boolean' &&
16750
+ typeof v.meetingPrepEnabled === 'boolean' &&
16751
+ Number.isSafeInteger(v.dailyPlanHour) &&
16752
+ v.dailyPlanHour >= 0 &&
16753
+ v.dailyPlanHour <= 23 &&
16754
+ Number.isSafeInteger(v.dailyReviewHour) &&
16755
+ v.dailyReviewHour >= 0 &&
16756
+ v.dailyReviewHour <= 23 &&
16757
+ Number.isSafeInteger(v.activeGoalLimit) &&
16758
+ v.activeGoalLimit >= 3 &&
16759
+ v.activeGoalLimit <= 5 &&
16760
+ Boolean(v.portfolio &&
16761
+ ['active', 'review', 'blocked', 'stale'].every((key) => Number.isSafeInteger(v.portfolio[key]))) &&
16762
+ Array.isArray(v.approvals) &&
16763
+ v.approvals.length <= 20 &&
16764
+ v.approvals.every((x) => x &&
16765
+ typeof x.id === 'string' &&
16766
+ typeof x.description === 'string' &&
16767
+ ['L2', 'L3'].includes(x.risk) &&
16768
+ typeof x.goalId === 'string' &&
16769
+ Number.isFinite(x.expiresAt)) &&
16770
+ Boolean(v.metrics &&
16771
+ v.metrics.period === 'today' &&
16772
+ Number.isSafeInteger(v.metrics.modelCalls) &&
16773
+ Number.isSafeInteger(v.metrics.inputTokens) &&
16774
+ Number.isSafeInteger(v.metrics.outputTokens) &&
16775
+ (v.metrics.estimatedCostUsd === null || Number.isFinite(v.metrics.estimatedCostUsd)) &&
16776
+ Number.isSafeInteger(v.metrics.completedRuns) &&
16777
+ Number.isSafeInteger(v.metrics.failedRuns) &&
16778
+ Number.isSafeInteger(v.metrics.recoveredErrors) &&
16779
+ Number.isSafeInteger(v.metrics.autoActions) &&
16780
+ Number.isSafeInteger(v.metrics.feedbackCount) &&
16781
+ Number.isSafeInteger(v.metrics.acceptedFeedback) &&
16782
+ Number.isSafeInteger(v.metrics.correctionCount) &&
16783
+ Number.isSafeInteger(v.metrics.ineffectiveCount) &&
16784
+ (v.metrics.suggestionAcceptanceRate === null || Number.isFinite(v.metrics.suggestionAcceptanceRate)) &&
16785
+ Number.isSafeInteger(v.metrics.notificationCount) &&
16786
+ Number.isSafeInteger(v.metrics.unreadNotificationCount) &&
16787
+ (v.metrics.notificationNoiseRate === null || Number.isFinite(v.metrics.notificationNoiseRate)) &&
16788
+ Array.isArray(v.metrics.goalProgress) &&
16789
+ v.metrics.goalProgress.length <= 5 &&
16790
+ v.metrics.goalProgress.every((item) => item && typeof item.goalId === 'string' && typeof item.title === 'string' && Number.isSafeInteger(item.runs))));
16694
16791
  }
16695
16792
  //# sourceMappingURL=assistant-signals.js.map
16696
16793
  ;// CONCATENATED MODULE: ../../packages/lifeos-query-contracts/dist/viewModes.js
@@ -16890,7 +16987,17 @@ const vaultId = { vaultId: isId };
16890
16987
  const pathField = { path: isPath };
16891
16988
  const schemas = {
16892
16989
  'assistant.signals': { required: { ...id, ...vaultId, customerId: isId } },
16893
- 'assistant.inbox.configure': { required: { ...id, ...vaultId, customerId: isId, enabled: request_validation_isBoolean } },
16990
+ 'assistant.inbox.configure': {
16991
+ required: { ...id, ...vaultId, customerId: isId, enabled: request_validation_isBoolean },
16992
+ optional: {
16993
+ permissionLevel: oneOf(0, 1, 2, 3),
16994
+ dailyPlanHour: (value) => Number.isSafeInteger(value) && Number(value) >= 0 && Number(value) <= 23,
16995
+ dailyReviewHour: (value) => Number.isSafeInteger(value) && Number(value) >= 0 && Number(value) <= 23,
16996
+ activeGoalLimit: oneOf(3, 4, 5),
16997
+ shadowHours: oneOf(0, 48),
16998
+ meetingPrepEnabled: request_validation_isBoolean,
16999
+ },
17000
+ },
16894
17001
  'assistant.inbox.receive': {
16895
17002
  required: {
16896
17003
  ...id,
@@ -16903,6 +17010,16 @@ const schemas = {
16903
17010
  },
16904
17011
  },
16905
17012
  'assistant.notice.read': { required: { ...id, ...vaultId, customerId: isId, noticeId: isId } },
17013
+ 'assistant.feedback': {
17014
+ required: {
17015
+ ...id,
17016
+ ...vaultId,
17017
+ customerId: isId,
17018
+ targetType: oneOf('notice', 'proposal', 'triage'),
17019
+ targetId: isId,
17020
+ action: oneOf('accepted', 'rejected', 'later', 'mute', 'correct', 'incorrect', 'wrong-goal'),
17021
+ },
17022
+ },
16906
17023
  'assistant.push.register': {
16907
17024
  required: { ...id, ...vaultId, customerId: isId, deviceId: isId, token: boundedString(256), enabled: request_validation_isBoolean },
16908
17025
  },
@@ -17041,6 +17158,7 @@ const responseValidators = {
17041
17158
  duplicate: response_validation_isBoolean,
17042
17159
  }),
17043
17160
  'assistant.notice.read': isAssistantSignals,
17161
+ 'assistant.feedback': isAssistantSignals,
17044
17162
  'assistant.push.register': objectWith({ enabled: response_validation_isBoolean }),
17045
17163
  'assistant.configure': isAssistantStatus,
17046
17164
  'assistant.chat': isAssistantReply,
@@ -19059,10 +19177,22 @@ class AssistantPush {
19059
19177
  !feed.notifications.every((n) => typeof n.id === 'string' &&
19060
19178
  Number.isSafeInteger(n.sequence) &&
19061
19179
  n.sequence > device.cursor &&
19062
- ['started', 'progress', 'decision', 'review', 'blocked', 'failure', 'completed', 'summary'].includes(n.kind) &&
19180
+ [
19181
+ 'started',
19182
+ 'progress',
19183
+ 'decision',
19184
+ 'review',
19185
+ 'blocked',
19186
+ 'failure',
19187
+ 'completed',
19188
+ 'summary',
19189
+ 'meeting',
19190
+ ].includes(n.kind) &&
19063
19191
  typeof n.title === 'string' &&
19064
19192
  typeof n.body === 'string' &&
19065
- typeof n.read === 'boolean'))
19193
+ typeof n.read === 'boolean' &&
19194
+ ['urgent', 'normal', 'low'].includes(n.priority) &&
19195
+ (n.proposalId === undefined || typeof n.proposalId === 'string')))
19066
19196
  throw Error('Invalid notice feed');
19067
19197
  for (const notice of feed.notifications) {
19068
19198
  if (!notice.read)
@@ -19073,6 +19203,8 @@ class AssistantPush {
19073
19203
  state: 'queued',
19074
19204
  attempts: 0,
19075
19205
  nextAt: this.now(),
19206
+ priority: notice.priority,
19207
+ ...(notice.proposalId ? { proposalId: notice.proposalId } : {}),
19076
19208
  });
19077
19209
  device.cursor = Math.max(device.cursor, notice.sequence);
19078
19210
  }
@@ -19121,11 +19253,14 @@ class AssistantPush {
19121
19253
  body: '打开置顶会话查看详情。',
19122
19254
  sound: 'default',
19123
19255
  channelId: 'personal-assistant',
19256
+ categoryId: ticket.proposalId ? 'personal-agent-approval' : 'personal-agent-update',
19257
+ priority: ticket.priority === 'urgent' ? 'high' : ticket.priority === 'low' ? 'normal' : 'default',
19124
19258
  data: {
19125
19259
  type: 'personal-assistant',
19126
19260
  daemonId: this.options.daemonId,
19127
19261
  vaultId: device.vaultId,
19128
19262
  noticeId: ticket.noticeId,
19263
+ ...(ticket.proposalId ? { proposalId: ticket.proposalId } : {}),
19129
19264
  },
19130
19265
  ttl: 3600,
19131
19266
  });
@@ -23323,11 +23458,14 @@ const PRIORITY_ORDER = {
23323
23458
  low: 4,
23324
23459
  lowest: 5,
23325
23460
  };
23461
+ function comparePlanningPriority(left, right) {
23462
+ return PRIORITY_ORDER[task_getPlanningPriority(left)] - PRIORITY_ORDER[task_getPlanningPriority(right)];
23463
+ }
23326
23464
  function comparePlanningTasks(left, right) {
23327
23465
  const leftDate = getPlanningAnchorDate(left) ?? '9999-12-31';
23328
23466
  const rightDate = getPlanningAnchorDate(right) ?? '9999-12-31';
23329
23467
  return (leftDate.localeCompare(rightDate) ||
23330
- PRIORITY_ORDER[task_getPlanningPriority(left)] - PRIORITY_ORDER[task_getPlanningPriority(right)] ||
23468
+ comparePlanningPriority(left, right) ||
23331
23469
  left.title.localeCompare(right.title) ||
23332
23470
  left.file.localeCompare(right.file) ||
23333
23471
  left.line - right.line);
@@ -23341,8 +23479,7 @@ function task_sortPlanningTasks(tasks, sortBy = 'planning-date') {
23341
23479
  if (sortBy === 'source') {
23342
23480
  return sorted.sort((left, right) => left.file.localeCompare(right.file) || left.line - right.line || left.title.localeCompare(right.title));
23343
23481
  }
23344
- return sorted.sort((left, right) => PRIORITY_ORDER[task_getPlanningPriority(left)] - PRIORITY_ORDER[task_getPlanningPriority(right)] ||
23345
- comparePlanningTasks(left, right));
23482
+ return sorted.sort((left, right) => comparePlanningPriority(left, right) || comparePlanningTasks(left, right));
23346
23483
  }
23347
23484
 
23348
23485
  ;// CONCATENATED MODULE: ../../packages/task-core/dist/collections.js
@@ -30985,16 +31122,29 @@ class RemosidianAssistant {
30985
31122
  throw new VaultRequestError('请先在设置中开启 Personal Agent。', 'forbidden');
30986
31123
  if (req.op === 'assistant.signals' ||
30987
31124
  req.op === 'assistant.inbox.configure' ||
30988
- req.op === 'assistant.notice.read') {
31125
+ req.op === 'assistant.notice.read' ||
31126
+ req.op === 'assistant.feedback') {
30989
31127
  const result = await this.call(vault.root, req.op === 'assistant.signals'
30990
31128
  ? '/api/signals'
30991
31129
  : req.op === 'assistant.notice.read'
30992
31130
  ? '/api/signals/read'
30993
- : '/api/signals/configure', signal, req.op === 'assistant.signals'
31131
+ : req.op === 'assistant.feedback'
31132
+ ? '/api/signals/feedback'
31133
+ : '/api/signals/configure', signal, req.op === 'assistant.signals'
30994
31134
  ? undefined
30995
31135
  : req.op === 'assistant.notice.read'
30996
31136
  ? { noticeId: req.noticeId }
30997
- : { enabled: req.enabled });
31137
+ : req.op === 'assistant.feedback'
31138
+ ? { targetType: req.targetType, targetId: req.targetId, action: req.action }
31139
+ : {
31140
+ enabled: req.enabled,
31141
+ permissionLevel: req.permissionLevel,
31142
+ dailyPlanHour: req.dailyPlanHour,
31143
+ dailyReviewHour: req.dailyReviewHour,
31144
+ activeGoalLimit: req.activeGoalLimit,
31145
+ shadowHours: req.shadowHours,
31146
+ meetingPrepEnabled: req.meetingPrepEnabled,
31147
+ });
30998
31148
  if (!isAssistantSignals(result))
30999
31149
  throw Error('收件箱响应格式无效。');
31000
31150
  return result;
@@ -31050,6 +31200,8 @@ class RemosidianAssistant {
31050
31200
  .map((goal) => ({
31051
31201
  id: goal.id,
31052
31202
  title: goal.title.slice(0, 160),
31203
+ source: goal.source.slice(0, 1000),
31204
+ kind: goal.kind,
31053
31205
  status: goal.status,
31054
31206
  priority: goal.priority,
31055
31207
  summary: goal.summary.slice(0, 500),
@@ -33838,7 +33990,7 @@ function runFileBackedPluginTurn(input, prompt, options, onDelta) {
33838
33990
  }
33839
33991
  //# sourceMappingURL=chat-plugin-runtime.js.map
33840
33992
  ;// CONCATENATED MODULE: ../../packages/remosidian-server/dist/version.js
33841
- const VERSION = '0.1.13';
33993
+ const VERSION = '0.1.15';
33842
33994
  //# sourceMappingURL=version.js.map
33843
33995
  ;// CONCATENATED MODULE: ../../packages/remosidian-server/dist/chat-runtime.js
33844
33996
 
@@ -34754,6 +34906,7 @@ async function handleRemosidianRequest(req, vaultService, chatService, conversat
34754
34906
  case 'assistant.inbox.configure':
34755
34907
  case 'assistant.inbox.receive':
34756
34908
  case 'assistant.notice.read':
34909
+ case 'assistant.feedback':
34757
34910
  case 'assistant.push.register':
34758
34911
  if (!context.assistant)
34759
34912
  return invalidResponse(req.id, '此服务器尚未支持 Personal Agent,请更新电脑端。');
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "remosidian",
3
- "version": "0.1.13",
3
+ "version": "0.1.15",
4
4
  "description": "Run Remosidian — remote, read/write access to your Obsidian vault from any device",
5
5
  "license": "MIT",
6
6
  "homepage": "https://lifeos.vip",