remosidian 0.1.13 → 0.1.14

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,9 @@
1
1
  # Remosidian CLI 更新日志
2
2
 
3
+ ## 0.1.14
4
+
5
+ - Follow proactive assistant routines with model routing and execution receipts.
6
+
3
7
  ## 0.1.13
4
8
 
5
9
  - 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,72 @@ 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
+ Number.isFinite(x.createdAt)) &&
16741
+ [0, 1, 2, 3].includes(v.permissionLevel) &&
16742
+ Number.isFinite(v.shadowUntil) &&
16743
+ typeof v.shadowActive === 'boolean' &&
16744
+ typeof v.meetingPrepEnabled === 'boolean' &&
16745
+ Number.isSafeInteger(v.dailyPlanHour) &&
16746
+ v.dailyPlanHour >= 0 &&
16747
+ v.dailyPlanHour <= 23 &&
16748
+ Number.isSafeInteger(v.dailyReviewHour) &&
16749
+ v.dailyReviewHour >= 0 &&
16750
+ v.dailyReviewHour <= 23 &&
16751
+ Number.isSafeInteger(v.activeGoalLimit) &&
16752
+ v.activeGoalLimit >= 3 &&
16753
+ v.activeGoalLimit <= 5 &&
16754
+ Boolean(v.portfolio &&
16755
+ ['active', 'review', 'blocked', 'stale'].every((key) => Number.isSafeInteger(v.portfolio[key]))) &&
16756
+ Array.isArray(v.approvals) &&
16757
+ v.approvals.length <= 20 &&
16758
+ v.approvals.every((x) => x &&
16759
+ typeof x.id === 'string' &&
16760
+ typeof x.description === 'string' &&
16761
+ ['L2', 'L3'].includes(x.risk) &&
16762
+ typeof x.goalId === 'string' &&
16763
+ Number.isFinite(x.expiresAt)) &&
16764
+ Boolean(v.metrics &&
16765
+ v.metrics.period === 'today' &&
16766
+ Number.isSafeInteger(v.metrics.modelCalls) &&
16767
+ Number.isSafeInteger(v.metrics.inputTokens) &&
16768
+ Number.isSafeInteger(v.metrics.outputTokens) &&
16769
+ (v.metrics.estimatedCostUsd === null || Number.isFinite(v.metrics.estimatedCostUsd)) &&
16770
+ Number.isSafeInteger(v.metrics.completedRuns) &&
16771
+ Number.isSafeInteger(v.metrics.failedRuns) &&
16772
+ Number.isSafeInteger(v.metrics.recoveredErrors) &&
16773
+ Number.isSafeInteger(v.metrics.autoActions) &&
16774
+ Number.isSafeInteger(v.metrics.feedbackCount) &&
16775
+ Number.isSafeInteger(v.metrics.acceptedFeedback) &&
16776
+ Number.isSafeInteger(v.metrics.correctionCount) &&
16777
+ Number.isSafeInteger(v.metrics.ineffectiveCount) &&
16778
+ (v.metrics.suggestionAcceptanceRate === null || Number.isFinite(v.metrics.suggestionAcceptanceRate)) &&
16779
+ Number.isSafeInteger(v.metrics.notificationCount) &&
16780
+ Number.isSafeInteger(v.metrics.unreadNotificationCount) &&
16781
+ (v.metrics.notificationNoiseRate === null || Number.isFinite(v.metrics.notificationNoiseRate)) &&
16782
+ Array.isArray(v.metrics.goalProgress) &&
16783
+ v.metrics.goalProgress.length <= 5 &&
16784
+ v.metrics.goalProgress.every((item) => item && typeof item.goalId === 'string' && typeof item.title === 'string' && Number.isSafeInteger(item.runs))));
16694
16785
  }
16695
16786
  //# sourceMappingURL=assistant-signals.js.map
16696
16787
  ;// CONCATENATED MODULE: ../../packages/lifeos-query-contracts/dist/viewModes.js
@@ -16890,7 +16981,17 @@ const vaultId = { vaultId: isId };
16890
16981
  const pathField = { path: isPath };
16891
16982
  const schemas = {
16892
16983
  'assistant.signals': { required: { ...id, ...vaultId, customerId: isId } },
16893
- 'assistant.inbox.configure': { required: { ...id, ...vaultId, customerId: isId, enabled: request_validation_isBoolean } },
16984
+ 'assistant.inbox.configure': {
16985
+ required: { ...id, ...vaultId, customerId: isId, enabled: request_validation_isBoolean },
16986
+ optional: {
16987
+ permissionLevel: oneOf(0, 1, 2, 3),
16988
+ dailyPlanHour: (value) => Number.isSafeInteger(value) && Number(value) >= 0 && Number(value) <= 23,
16989
+ dailyReviewHour: (value) => Number.isSafeInteger(value) && Number(value) >= 0 && Number(value) <= 23,
16990
+ activeGoalLimit: oneOf(3, 4, 5),
16991
+ shadowHours: oneOf(0, 48),
16992
+ meetingPrepEnabled: request_validation_isBoolean,
16993
+ },
16994
+ },
16894
16995
  'assistant.inbox.receive': {
16895
16996
  required: {
16896
16997
  ...id,
@@ -16903,6 +17004,16 @@ const schemas = {
16903
17004
  },
16904
17005
  },
16905
17006
  'assistant.notice.read': { required: { ...id, ...vaultId, customerId: isId, noticeId: isId } },
17007
+ 'assistant.feedback': {
17008
+ required: {
17009
+ ...id,
17010
+ ...vaultId,
17011
+ customerId: isId,
17012
+ targetType: oneOf('notice', 'proposal'),
17013
+ targetId: isId,
17014
+ action: oneOf('accepted', 'rejected', 'later', 'mute'),
17015
+ },
17016
+ },
16906
17017
  'assistant.push.register': {
16907
17018
  required: { ...id, ...vaultId, customerId: isId, deviceId: isId, token: boundedString(256), enabled: request_validation_isBoolean },
16908
17019
  },
@@ -17041,6 +17152,7 @@ const responseValidators = {
17041
17152
  duplicate: response_validation_isBoolean,
17042
17153
  }),
17043
17154
  'assistant.notice.read': isAssistantSignals,
17155
+ 'assistant.feedback': isAssistantSignals,
17044
17156
  'assistant.push.register': objectWith({ enabled: response_validation_isBoolean }),
17045
17157
  'assistant.configure': isAssistantStatus,
17046
17158
  'assistant.chat': isAssistantReply,
@@ -19059,10 +19171,22 @@ class AssistantPush {
19059
19171
  !feed.notifications.every((n) => typeof n.id === 'string' &&
19060
19172
  Number.isSafeInteger(n.sequence) &&
19061
19173
  n.sequence > device.cursor &&
19062
- ['started', 'progress', 'decision', 'review', 'blocked', 'failure', 'completed', 'summary'].includes(n.kind) &&
19174
+ [
19175
+ 'started',
19176
+ 'progress',
19177
+ 'decision',
19178
+ 'review',
19179
+ 'blocked',
19180
+ 'failure',
19181
+ 'completed',
19182
+ 'summary',
19183
+ 'meeting',
19184
+ ].includes(n.kind) &&
19063
19185
  typeof n.title === 'string' &&
19064
19186
  typeof n.body === 'string' &&
19065
- typeof n.read === 'boolean'))
19187
+ typeof n.read === 'boolean' &&
19188
+ ['urgent', 'normal', 'low'].includes(n.priority) &&
19189
+ (n.proposalId === undefined || typeof n.proposalId === 'string')))
19066
19190
  throw Error('Invalid notice feed');
19067
19191
  for (const notice of feed.notifications) {
19068
19192
  if (!notice.read)
@@ -19073,6 +19197,8 @@ class AssistantPush {
19073
19197
  state: 'queued',
19074
19198
  attempts: 0,
19075
19199
  nextAt: this.now(),
19200
+ priority: notice.priority,
19201
+ ...(notice.proposalId ? { proposalId: notice.proposalId } : {}),
19076
19202
  });
19077
19203
  device.cursor = Math.max(device.cursor, notice.sequence);
19078
19204
  }
@@ -19121,11 +19247,14 @@ class AssistantPush {
19121
19247
  body: '打开置顶会话查看详情。',
19122
19248
  sound: 'default',
19123
19249
  channelId: 'personal-assistant',
19250
+ categoryId: ticket.proposalId ? 'personal-agent-approval' : 'personal-agent-update',
19251
+ priority: ticket.priority === 'urgent' ? 'high' : ticket.priority === 'low' ? 'normal' : 'default',
19124
19252
  data: {
19125
19253
  type: 'personal-assistant',
19126
19254
  daemonId: this.options.daemonId,
19127
19255
  vaultId: device.vaultId,
19128
19256
  noticeId: ticket.noticeId,
19257
+ ...(ticket.proposalId ? { proposalId: ticket.proposalId } : {}),
19129
19258
  },
19130
19259
  ttl: 3600,
19131
19260
  });
@@ -30985,16 +31114,29 @@ class RemosidianAssistant {
30985
31114
  throw new VaultRequestError('请先在设置中开启 Personal Agent。', 'forbidden');
30986
31115
  if (req.op === 'assistant.signals' ||
30987
31116
  req.op === 'assistant.inbox.configure' ||
30988
- req.op === 'assistant.notice.read') {
31117
+ req.op === 'assistant.notice.read' ||
31118
+ req.op === 'assistant.feedback') {
30989
31119
  const result = await this.call(vault.root, req.op === 'assistant.signals'
30990
31120
  ? '/api/signals'
30991
31121
  : req.op === 'assistant.notice.read'
30992
31122
  ? '/api/signals/read'
30993
- : '/api/signals/configure', signal, req.op === 'assistant.signals'
31123
+ : req.op === 'assistant.feedback'
31124
+ ? '/api/signals/feedback'
31125
+ : '/api/signals/configure', signal, req.op === 'assistant.signals'
30994
31126
  ? undefined
30995
31127
  : req.op === 'assistant.notice.read'
30996
31128
  ? { noticeId: req.noticeId }
30997
- : { enabled: req.enabled });
31129
+ : req.op === 'assistant.feedback'
31130
+ ? { targetType: req.targetType, targetId: req.targetId, action: req.action }
31131
+ : {
31132
+ enabled: req.enabled,
31133
+ permissionLevel: req.permissionLevel,
31134
+ dailyPlanHour: req.dailyPlanHour,
31135
+ dailyReviewHour: req.dailyReviewHour,
31136
+ activeGoalLimit: req.activeGoalLimit,
31137
+ shadowHours: req.shadowHours,
31138
+ meetingPrepEnabled: req.meetingPrepEnabled,
31139
+ });
30998
31140
  if (!isAssistantSignals(result))
30999
31141
  throw Error('收件箱响应格式无效。');
31000
31142
  return result;
@@ -31050,6 +31192,8 @@ class RemosidianAssistant {
31050
31192
  .map((goal) => ({
31051
31193
  id: goal.id,
31052
31194
  title: goal.title.slice(0, 160),
31195
+ source: goal.source.slice(0, 1000),
31196
+ kind: goal.kind,
31053
31197
  status: goal.status,
31054
31198
  priority: goal.priority,
31055
31199
  summary: goal.summary.slice(0, 500),
@@ -33838,7 +33982,7 @@ function runFileBackedPluginTurn(input, prompt, options, onDelta) {
33838
33982
  }
33839
33983
  //# sourceMappingURL=chat-plugin-runtime.js.map
33840
33984
  ;// CONCATENATED MODULE: ../../packages/remosidian-server/dist/version.js
33841
- const VERSION = '0.1.13';
33985
+ const VERSION = '0.1.14';
33842
33986
  //# sourceMappingURL=version.js.map
33843
33987
  ;// CONCATENATED MODULE: ../../packages/remosidian-server/dist/chat-runtime.js
33844
33988
 
@@ -34754,6 +34898,7 @@ async function handleRemosidianRequest(req, vaultService, chatService, conversat
34754
34898
  case 'assistant.inbox.configure':
34755
34899
  case 'assistant.inbox.receive':
34756
34900
  case 'assistant.notice.read':
34901
+ case 'assistant.feedback':
34757
34902
  case 'assistant.push.register':
34758
34903
  if (!context.assistant)
34759
34904
  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.14",
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",