@moorline/core 0.0.2 → 0.0.4

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 (57) hide show
  1. package/dist/core/domain/sessions/runtimeWorkManagementService.d.ts +26 -0
  2. package/dist/core/domain/sessions/runtimeWorkManagementService.js +140 -78
  3. package/dist/core/domain/sessions/runtimeWorkManagementService.js.map +1 -1
  4. package/dist/core/domain/sessions/sessionState.d.ts +4 -0
  5. package/dist/core/domain/sessions/sessionState.js +38 -2
  6. package/dist/core/domain/sessions/sessionState.js.map +1 -1
  7. package/dist/core/extension/capabilities/capabilities.d.ts +1 -1
  8. package/dist/core/extension/capabilities/capabilities.js +3 -1
  9. package/dist/core/extension/capabilities/capabilities.js.map +1 -1
  10. package/dist/core/extension/packages/npmRegistryClient.js +48 -24
  11. package/dist/core/extension/packages/npmRegistryClient.js.map +1 -1
  12. package/dist/core/extension/packages/packageInstaller.js +41 -1
  13. package/dist/core/extension/packages/packageInstaller.js.map +1 -1
  14. package/dist/core/extension/plugins/pluginHost.d.ts +7 -7
  15. package/dist/core/extension/plugins/pluginHost.js +11 -9
  16. package/dist/core/extension/plugins/pluginHost.js.map +1 -1
  17. package/dist/core/runtime/execution/runtimeInteractionService.d.ts +8 -8
  18. package/dist/core/runtime/execution/runtimeInteractionService.js +14 -26
  19. package/dist/core/runtime/execution/runtimeInteractionService.js.map +1 -1
  20. package/dist/core/runtime/execution/runtimePluginContextService.js +7 -1
  21. package/dist/core/runtime/execution/runtimePluginContextService.js.map +1 -1
  22. package/dist/core/runtime/hosting/runtimeHostingService.d.ts +5 -3
  23. package/dist/core/runtime/hosting/runtimeHostingService.js +12 -31
  24. package/dist/core/runtime/hosting/runtimeHostingService.js.map +1 -1
  25. package/dist/core/runtime/hosting/runtimeTransportEffectService.d.ts +22 -0
  26. package/dist/core/runtime/hosting/runtimeTransportEffectService.js +86 -0
  27. package/dist/core/runtime/hosting/runtimeTransportEffectService.js.map +1 -0
  28. package/dist/core/runtime/hosting/runtimeTransportIntentService.d.ts +23 -0
  29. package/dist/core/runtime/hosting/runtimeTransportIntentService.js +144 -0
  30. package/dist/core/runtime/hosting/runtimeTransportIntentService.js.map +1 -0
  31. package/dist/core/runtime/hosting/runtimeTransportSurfaceService.d.ts +2 -3
  32. package/dist/core/runtime/hosting/runtimeTransportSurfaceService.js +8 -56
  33. package/dist/core/runtime/hosting/runtimeTransportSurfaceService.js.map +1 -1
  34. package/dist/core/runtime/lifecycle/runtimeLifecycleService.js +0 -13
  35. package/dist/core/runtime/lifecycle/runtimeLifecycleService.js.map +1 -1
  36. package/dist/core/runtime/moorlineRuntime.d.ts +1 -1
  37. package/dist/core/runtime/moorlineRuntime.js +6 -14
  38. package/dist/core/runtime/moorlineRuntime.js.map +1 -1
  39. package/dist/core/runtime/moorlineRuntimeBuilder.d.ts +4 -2
  40. package/dist/core/runtime/moorlineRuntimeBuilder.js +23 -23
  41. package/dist/core/runtime/moorlineRuntimeBuilder.js.map +1 -1
  42. package/dist/core/system/state/sqlite/transportIntentRepository.d.ts +12 -0
  43. package/dist/core/system/state/sqlite/transportIntentRepository.js +106 -0
  44. package/dist/core/system/state/sqlite/transportIntentRepository.js.map +1 -0
  45. package/dist/core/system/state/sqliteSessionStore.d.ts +6 -0
  46. package/dist/core/system/state/sqliteSessionStore.js +15 -0
  47. package/dist/core/system/state/sqliteSessionStore.js.map +1 -1
  48. package/dist/types/config.d.ts +4 -11
  49. package/dist/types/config.js.map +1 -1
  50. package/dist/types/transport.d.ts +1 -1
  51. package/dist/types/transport.js.map +1 -1
  52. package/package.json +6 -3
  53. package/resources/migrations/018_transport_intents.sql +18 -0
  54. package/resources/policies/default-secure.json +2 -2
  55. package/dist/core/runtime/lifecycle/managedTransportResourceLifecycleService.d.ts +0 -34
  56. package/dist/core/runtime/lifecycle/managedTransportResourceLifecycleService.js +0 -158
  57. package/dist/core/runtime/lifecycle/managedTransportResourceLifecycleService.js.map +0 -1
@@ -1,158 +0,0 @@
1
- import { randomUUID } from 'node:crypto';
2
- function sameName(left, right) {
3
- return left.trim() === right.trim();
4
- }
5
- export class ManagedTransportResourceLifecycleService {
6
- deps;
7
- constructor(deps) {
8
- this.deps = deps;
9
- }
10
- async handleEvent(event) {
11
- if (event.type !== 'resource.lifecycle') {
12
- return;
13
- }
14
- const surface = this.deps.getSurfaceState();
15
- if (!surface || event.scopeId !== this.deps.config.transport.scopeId) {
16
- return;
17
- }
18
- if (event.resource.kind !== 'conversation' && event.resource.kind !== 'item') {
19
- this.recordTransportActivity({
20
- threadId: null,
21
- sessionId: null,
22
- transportResourceId: event.resource.id,
23
- kind: `transport.resource.${event.action}`,
24
- title: 'Transport lifecycle observed',
25
- detail: `Observed ${event.resource.kind} ${event.resource.name}.`
26
- });
27
- return;
28
- }
29
- await this.deps.queue(`transport:lifecycle:${event.resource.id}`, async () => {
30
- const session = this.deps.sessionRegistry.getByTransportResourceId(event.resource.id);
31
- if (session) {
32
- await this.handleSessionEvent(session, event, surface);
33
- return;
34
- }
35
- if ((event.action === 'created' || event.action === 'updated') && event.resource.parentId === surface.sessionsCategoryId) {
36
- await this.adoptSessionResource(event.resource.id, event.resource.name);
37
- return;
38
- }
39
- });
40
- }
41
- async handleSessionEvent(session, event, surface) {
42
- if (event.action === 'deleted') {
43
- await this.preserveDeletedSession(session);
44
- return;
45
- }
46
- if (!sameName(session.transportResourceName, event.resource.name)) {
47
- const updated = this.deps.sessionRegistry.updateSession({
48
- ...session,
49
- transportResourceName: event.resource.name,
50
- updatedAt: this.deps.now()
51
- });
52
- this.deps.appendAuditEvent('session.resource.renamed', {
53
- sessionId: updated.sessionId,
54
- transportResourceId: updated.transportResourceId,
55
- previousName: session.transportResourceName,
56
- nextName: updated.transportResourceName,
57
- actorId: 'runtime:transport/resource-lifecycle'
58
- });
59
- this.recordTransportActivity({
60
- threadId: updated.threadId,
61
- sessionId: updated.sessionId,
62
- transportResourceId: updated.transportResourceId,
63
- kind: 'transport.session_resource.renamed',
64
- title: 'Session resource renamed from transport',
65
- detail: `${session.transportResourceName} -> ${updated.transportResourceName}`
66
- });
67
- session = updated;
68
- }
69
- if (event.resource.parentId === surface.archiveCategoryId && session.lifecycleStatus !== 'archived') {
70
- await this.deps.workManagement.archiveManagedSession({
71
- actorId: 'runtime:transport/resource-lifecycle',
72
- transportResourceId: session.transportResourceId,
73
- sessionId: session.sessionId
74
- });
75
- this.recordTransportActivity({
76
- threadId: session.threadId,
77
- sessionId: session.sessionId,
78
- transportResourceId: session.transportResourceId,
79
- kind: 'transport.session_resource.archived',
80
- title: 'Session archived from transport move',
81
- detail: `${session.transportResourceName} moved into the managed archive group.`
82
- });
83
- }
84
- }
85
- async adoptSessionResource(transportResourceId, transportResourceName) {
86
- if (this.deps.sessionRegistry.getByTransportResourceId(transportResourceId)) {
87
- return;
88
- }
89
- const session = this.deps.sessionRegistry.create({
90
- scopeId: this.deps.config.transport.scopeId,
91
- transportResourceId,
92
- transportResourceName,
93
- requestedName: transportResourceName,
94
- runtimeMode: this.deps.config.defaults.runtimeMode,
95
- nowIso: this.deps.now(),
96
- providerAutoStartEnabled: this.deps.getProviderAutoStartDefault(),
97
- createdBy: 'runtime:transport/resource-lifecycle'
98
- });
99
- this.deps.appendAuditEvent('session.adopted_from_transport', {
100
- sessionId: session.sessionId,
101
- transportResourceId: session.transportResourceId,
102
- actorId: 'runtime:transport/resource-lifecycle'
103
- });
104
- this.recordTransportActivity({
105
- threadId: session.threadId,
106
- sessionId: session.sessionId,
107
- transportResourceId: session.transportResourceId,
108
- kind: 'transport.session_resource.adopted',
109
- title: 'Session adopted from transport',
110
- detail: `Adopted ${transportResourceName} as managed session ${session.sessionId}.`
111
- });
112
- }
113
- async preserveDeletedSession(session) {
114
- const nowIso = this.deps.now();
115
- this.deps.providerService.stopSession(session.threadId);
116
- this.deps.providerDirectory.delete(session.threadId);
117
- this.deps.rejectTurnWaitersForThread(session.threadId, `Session ${session.sessionId} lost its transport resource.`);
118
- await this.deps.cleanupScopedSidecars('session', session.sessionId, `session ${session.sessionId} lost its transport resource`);
119
- const updated = this.deps.sessionRegistry.updateSession({
120
- ...session,
121
- lifecycleStatus: 'archived',
122
- archivedAt: session.archivedAt ?? nowIso,
123
- providerThreadId: null,
124
- resumeCursor: null,
125
- providerStatus: 'closed',
126
- activeTurnId: null,
127
- lastError: 'Managed transport resource deleted outside Moorline.',
128
- updatedAt: nowIso
129
- });
130
- this.deps.appendAuditEvent('session.resource.deleted_externally', {
131
- sessionId: updated.sessionId,
132
- transportResourceId: updated.transportResourceId,
133
- actorId: 'runtime:transport/resource-lifecycle'
134
- });
135
- this.recordTransportActivity({
136
- threadId: updated.threadId,
137
- sessionId: updated.sessionId,
138
- transportResourceId: updated.transportResourceId,
139
- kind: 'transport.session_resource.deleted',
140
- title: 'Session resource deleted externally',
141
- detail: `Preserved session ${updated.sessionId} after its managed transport resource was deleted.`
142
- });
143
- }
144
- recordTransportActivity(input) {
145
- this.deps.recordRuntimeActivity({
146
- threadId: input.threadId ?? `transport:${input.transportResourceId ?? 'unknown'}`,
147
- sessionId: input.sessionId,
148
- transportResourceId: input.transportResourceId,
149
- sourceEventId: randomUUID(),
150
- kind: input.kind,
151
- severity: 'info',
152
- title: input.title,
153
- detail: input.detail,
154
- createdAt: this.deps.now()
155
- });
156
- }
157
- }
158
- //# sourceMappingURL=managedTransportResourceLifecycleService.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"managedTransportResourceLifecycleService.js","sourceRoot":"","sources":["../../../../../../../src/core/runtime/lifecycle/managedTransportResourceLifecycleService.ts"],"names":[],"mappings":"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"}