@north-light/cli 0.3.579 → 0.3.580
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/builtin-memory/internal/storage-tiers.md +2 -2
- package/dist/core/canvas/export-sqlite.js +1 -1
- package/dist/core/canvas/schema-pg/009-bodies.sql +10 -0
- package/dist/core/canvas/schema-version.d.ts +1 -1
- package/dist/core/canvas/schema-version.js +1 -1
- package/dist/core/feed/feed.js +3 -3
- package/dist/core/feed/inbox.js +1 -1
- package/dist/core/feed/reports.js +2 -2
- package/dist/core/graph/access.d.ts +1 -1
- package/dist/core/graph/bodies-boot-copy.d.ts +14 -0
- package/dist/core/graph/bodies-boot-copy.js +1 -0
- package/dist/core/graph/bodies.d.ts +13 -6
- package/dist/core/graph/bodies.js +1 -1
- package/dist/core/graph/documents.js +8 -8
- package/dist/core/graph/objects.js +11 -11
- package/dist/core/graph/package-docs.js +5 -5
- package/dist/core/graph/repo-sync/exchange.js +2 -2
- package/dist/core/graph/repo-sync/ref-format.d.ts +0 -1
- package/dist/core/graph/repo-sync/ref-format.js +2 -2
- package/dist/core/peer/receiver.js +1 -1
- package/dist/core/runtime/roadmap.js +3 -3
- package/dist/core/substrate/delivery/corpus.d.ts +2 -0
- package/dist/core/substrate/delivery/corpus.js +3 -3
- package/dist/core/substrate/delivery/deliver.js +3 -3
- package/dist/core/substrate/delivery/render-boot.js +25 -25
- package/dist/core/substrate/delivery/render-event.d.ts +1 -1
- package/dist/core/substrate/delivery/render-event.js +4 -4
- package/dist/core/substrate/delivery/types.d.ts +2 -2
- package/dist/daemon/api/document-listener.js +4 -4
- package/dist/daemon/api/handlers/docs.js +1 -1
- package/dist/daemon/api/handlers/memory.js +4 -4
- package/dist/daemon/api/handlers/reports.js +4 -4
- package/dist/daemon/boot-migrations.js +1 -1
- package/dist/daemon/review/finish.js +1 -1
- package/dist/migrations/004-canvas-documents/apply.d.ts +2 -4
- package/dist/migrations/004-canvas-documents/apply.js +1 -1
- package/dist/migrations/004-canvas-documents/index.js +2 -2
- package/package.json +2 -2
- package/packages/crouter-identity/package.json +1 -1
- package/runtime.lock.json +13 -13
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
var
|
|
1
|
+
var x=Object.defineProperty;var r=(e,t)=>x(e,"name",{value:t,configurable:!0});import{createHash as T}from"node:crypto";import{withCanvasWrite as g}from"../../../core/canvas/db.js";import{canRead as k}from"../../../core/graph/access.js";import{permits as M}from"../../../core/permissions/evaluator.js";import{get as b}from"../../../core/graph/bodies.js";import{ownerForGrantee as C}from"../../../core/graph/objects.js";import{readerFor as F}from"../../../core/graph/reader.js";import{checkoutsForCwd as H}from"../../../core/graph/repo-sync/repos.js";import{RunError as h}from"../../../core/runs/operations.js";import{mapAsync as j}from"../../../core/async-array.js";import{personId as B}from"../../../core/canvas/person.js";const ut=new Set(["memory.list","memory.get"]),W=1024*1024,w=/^[A-Za-z0-9_-]+(\/[A-Za-z0-9_-]+)*$/,N=["knowledge","preference"],i=r((e,t)=>new h(400,"invalid_request",e,t),"invalid"),O=r(()=>new h(404,"not_found","no memory document by that name"),"notFound");function _(e){const t=e.get("store");if(t===null)throw i("store is required","store");if(t!=="user")throw i('store must be "user"',"store")}r(_,"store");function J(e){const t=e.get("kind");if(t===null)return null;if(!N.includes(t))throw i("kind must be knowledge or preference","kind");return t}r(J,"kindOf");function Y(e){const t=e.get("limit");if(t===null)return 50;if(!/^(0|[1-9]\d*)$/.test(t)||Number(t)<1||Number(t)>100)throw i("limit must be an integer from 1 to 100","limit");return Number(t)}r(Y,"limitOf");function U(e,t){return T("sha256").update(JSON.stringify(["user",e,t])).digest("base64url").slice(0,16)}r(U,"filterHash");function $(e,t){return Buffer.from(JSON.stringify({n:e,f:t}),"utf8").toString("base64url")}r($,"encodeCursor");function z(e,t){if(e===null)return null;try{if(!/^[A-Za-z0-9_-]+$/.test(e))throw new Error("not base64url");const n=JSON.parse(Buffer.from(e,"base64url").toString("utf8"));if(typeof n.n=="string"&&w.test(n.n)&&n.f===t)return n.n}catch{}throw i("cursor is not the next_cursor of a previous page with the same store, path and kind","cursor")}r(z,"decodeCursor");async function R(e){return await C(e,B())}r(R,"personObject");async function v(e,t){return await F(e,t,async n=>await H(e,n))}r(v,"graphReader");async function S(e,t){const n=await e.prepare(`SELECT r.body_hash, r.created_at FROM revisions r WHERE r.document = ?
|
|
2
2
|
AND NOT EXISTS (SELECT 1 FROM revision_parents p WHERE p.parent = r.rev_id) ORDER BY r.number DESC, r.rev_id LIMIT 1`).get(t.id),o=await e.prepare("SELECT created_at, author FROM revisions WHERE document = ? ORDER BY number, created_at LIMIT 1").get(t.id);if(!n||!o)throw O();return{head:n,first:o}}r(S,"revisions");async function A(e,t){const{head:n,first:o}=await S(e,t),a=t.name.lastIndexOf("/");return{name:t.name,folder:a<0?"":t.name.slice(0,a),kind:t.kind,preview:t.preview,summary:t.summary,privacy:t.privacy,revision:t.revision,created_at:o.created_at,updated_at:n.created_at}}r(A,"item");async function G(e,t){return t===null?null:(await e.prepare(`SELECT i.external_id FROM objects a LEFT JOIN nodes n ON n.node_id = a.id
|
|
3
3
|
JOIN identities i ON i.object = CASE WHEN a.type = 'node' THEN n.app ELSE a.id END AND i.scheme = 'app'
|
|
4
|
-
WHERE a.id = ?`).get(t))?.external_id??null}r(G,"granteeOf");function Z(e,t){if(e.length<=t)return e;let n=t;for(;n>0&&(e[n]&192)===128;)n--;return e.subarray(0,n)}r(Z,"utf8Prefix");async function P(e,t){_(t);const n=t.get("path");if(n!==null&&!w.test(n))throw
|
|
4
|
+
WHERE a.id = ?`).get(t))?.external_id??null}r(G,"granteeOf");function Z(e,t){if(e.length<=t)return e;let n=t;for(;n>0&&(e[n]&192)===128;)n--;return e.subarray(0,n)}r(Z,"utf8Prefix");async function P(e,t){_(t);const n=t.get("path");if(n!==null&&!w.test(n))throw i("path must be name segments of letters, digits, `_` or `-` joined by `/`","path");const o=J(t),a=Y(t),d=U(n,o),s=z(t.get("cursor"),d);return await g(async u=>{const l=await v(u,e),c=await R(u),m=n===null?null:`${n}/`,f=o===null?N:[o],y=await M(u,l,"read"),E=await u.prepareUncached(`SELECT o.*, d.summary, d.revision, d.source_path FROM objects o JOIN documents d ON d.object = o.id
|
|
5
5
|
WHERE o.owner = ? AND o.type = 'document' AND o.deleted_at IS NULL AND d.unlisted = 0
|
|
6
6
|
AND o.kind IN (?, ?) AND (?::text IS NULL OR starts_with(o.name, ?::text)) AND (?::text IS NULL OR o.name > ?::text)
|
|
7
7
|
AND ${y.sql}
|
|
8
|
-
ORDER BY o.name LIMIT ?`).all(c.id,f[0],f[f.length-1],m,m,
|
|
9
|
-
WHERE o.owner = ? AND o.type = 'document' AND o.name = ? AND o.deleted_at IS NULL AND o.kind IN ('knowledge', 'preference')`).get(d.id,n);if(!
|
|
8
|
+
ORDER BY o.name LIMIT ?`).all(c.id,f[0],f[f.length-1],m,m,s,s,...y.params,a+1),p=E.slice(0,a),D=E.length>a;return{items:await j(p,async L=>await A(u,L)),next_cursor:D?$(p[p.length-1].name,d):null}})}r(P,"memoryList");async function X(e,t){_(t);const n=t.get("name");if(n===null)throw i("name is required","name");if(!w.test(n))throw i("name must be segments of letters, digits, `_` or `-` joined by `/`","name");return await g(async o=>{const a=await v(o,e),d=await R(o),s=await o.prepare(`SELECT o.*, d.summary, d.revision, d.source_path FROM objects o JOIN documents d ON d.object = o.id
|
|
9
|
+
WHERE o.owner = ? AND o.type = 'document' AND o.name = ? AND o.deleted_at IS NULL AND o.kind IN ('knowledge', 'preference')`).get(d.id,n);if(!s||!await k(o,a,s))throw O();const{head:u,first:l}=await S(o,s),c=Buffer.from(await b(o,u.body_hash),"utf8"),m=Z(c,W);return{...await A(o,s),body:m.toString("utf8"),size:c.length,truncated:m.length<c.length,grantee:await G(o,l.author)}})}r(X,"memoryGet");async function I(e,t,n){if(e==="memory.list")return{status:200,body:await P(t,n)};if(e==="memory.get")return{status:200,body:await X(t,n)};throw new h(404,"not_found","unknown operation")}r(I,"handleMemoryOperation");const ct=[{method:"GET",pattern:"/v1/memory",handler:r(async e=>await I("memory.list",e.principal,e.query),"handler")},{method:"GET",pattern:"/v1/memory/document",handler:r(async e=>await I("memory.get",e.principal,e.query),"handler")}];export{W as MEMORY_BODY_MAX_BYTES,ut as MEMORY_OPERATIONS,I as handleMemoryOperation,X as memoryGet,P as memoryList,ct as memoryRoutes,Z as utf8Prefix};
|
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
var
|
|
1
|
+
var M=Object.defineProperty;var s=(t,e)=>M(t,"name",{value:e,configurable:!0});import{existsSync as P}from"node:fs";import{getNode as d}from"../../../core/canvas/canvas.js";import{liveExecutionForNode as D}from"../../../core/canvas/executions.js";import{markStopSignal as B}from"../../../core/runtime/stop-signals.js";import{emitEvent as j}from"../../../core/events/emit.js";import{push as J,FinalizationError as k,StructuredRequestFinalizationError as z}from"../../../core/feed/feed.js";import{branchIsPushedAtCurrentTip as L,hasOpenManagedWorktree as W,missingWorktreeRecoveryHint as H}from"../../../core/worktree.js";import{autoDropCleanManagedWorktreeAsync as X}from"../../../core/worktree-mutation-async.js";import{withCanvasWrite as G,openDb as K}from"../../../core/canvas/db.js";import{getMany as U}from"../../../core/graph/bodies.js";import{heads as V}from"../../../core/graph/documents.js";import{listObjects as Y,nodeObject as Q}from"../../../core/graph/objects.js";import{readerFor as Z}from"../../../core/graph/reader.js";import{notFound as ee,usage as f}from"../../../core/errors.js";import{InputError as u}from"../../../core/io.js";import{toReportResultDTO as te}from"../map.js";import{validateStructuredResult as re}from"../../../core/runtime/structured-output.js";import{clearSchemaReprompts as ne}from"../../../core/runtime/output-result.js";import{getPendingStructuredRequestForNode as _,getStructuredRequest as S,settleStructuredRequestIn as ie}from"../../../core/canvas/structured-requests.js";import{ApiError as h}from"../../../api/errors.js";import{applySettlementEffects as R}from"../../structured-requests/effects.js";import{nodeEventStreams as x}from"./node-events.js";import{emitRunEvent as E}from"../../../core/runs/events.js";import{mapAsync as oe}from"../../../core/async-array.js";async function g(t){const e=await d(t);if(e===null)throw ee(`unknown node: ${t}`,{received:t});return e}s(g,"requireNode");function ae(t){if(typeof t!="object"||t===null)throw f("a push report requires a JSON body { tier, body }");const e=t.tier,r=t.delivery_tier,i=t.body;if(e!=="update"&&e!=="urgent"&&e!=="final")throw f(`invalid report tier: ${String(e)} (expected update|urgent|final)`);if(r!==void 0&&r!=="deferred"&&r!=="normal"&&r!=="urgent")throw f(`invalid delivery_tier: ${String(r)} (expected deferred|normal|urgent)`);if(e!=="update"&&r!==void 0)throw f("delivery_tier is only valid for update reports");if(typeof i!="string"||i.trim()==="")throw f("a push report requires a non-empty body");return{tier:e,...r===void 0?{}:{delivery_tier:r},body:i}}s(ae,"parsePushBody");async function se(t){const e=t.params.id;await g(e);const r=ae(t.body);if(r.tier==="final"&&await _(e)!==null)throw new u({error:"structured_result_pending",message:"This node owes a structured result \u2014 a plain `push final` would finish it without recording one.",next:'Submit the result with the `submit_result` tool instead (or `crtr push result`); it validates against the pending schema, records it, and pushes the final report for you. If the schema cannot be honestly satisfied, call `submit_result` with `decline` (or `crtr push result --decline "<reason>" --code <token>`) to record the decline and finish the node.'});const i=r.tier==="final"?(await d(e))?.status:void 0,n=r.tier==="final"?await O(e):void 0,o=await b(e,r);r.tier==="final"&&await A(e);const a=r.tier==="final"&&i!==void 0?{from:i,to:(await d(e))?.status??"done"}:void 0,c=te(o,a,n),m=(await q(e)).find(p=>p.id===o.reportId);if(m!==void 0){x.report(e,m);const p=(await d(e))?.run_id;p&&await E(p,e,"node.report.pushed",{body:m.body,kind:m.tier==="final"?"final":"update"})}return{status:200,body:c}}s(se,"handlePush");async function O(t){if(!W(await d(t)))return;const e=await X(t);if(e!==null)return e.worktree_path;if(!await L((await d(t)).managed_worktree))throw new u({error:"open_managed_worktree",message:"This node still owns an open managed worktree that is neither clean and locally landed nor clean with its exact tip on origin \u2014 `push final` cannot finish.",next:await(async()=>{const r=(await d(t))?.managed_worktree;return r!=null&&r.state==="open"&&!P(r.path)?H(r):"Make the recorded worktree clean, including untracked files: commit work to retain and remove or ignore only disposable generated files. With its recorded branch checked out and no rebase in progress, push its current tip to a branch on origin, then rerun `crtr push final`; or run `crtr node worktree close` to land the clean worktree into its recorded local base."})()})}s(O,"guardFinalWorktree");const $=2e3;function de(t){const e=JSON.stringify(t,null,2);return`Structured output submitted.
|
|
2
2
|
|
|
3
3
|
\`\`\`json
|
|
4
4
|
${e.length>$?`${e.slice(0,$)}
|
|
5
5
|
\u2026 (truncated \u2014 the full result is on the structured request)`:e}
|
|
6
6
|
\`\`\`
|
|
7
|
-
`}
|
|
7
|
+
`}s(de,"submitReportBody");function ue(t){return`Structured result declined.
|
|
8
8
|
|
|
9
9
|
Reason: ${t.reason}
|
|
10
10
|
Code: ${t.code}
|
|
11
11
|
Retryable: ${t.retryable?"yes":"no"}
|
|
12
|
-
`}
|
|
12
|
+
`}s(ue,"declineReportBody");const I=1024,N=64;async function ce(t,e){if(typeof t!="object"||t===null)throw f("a result submission requires a JSON body { value } or { decline, code, retryable }");const r=t.request_id;if(typeof r!="string"||r.trim()===""){const o=await _(e);throw new u({error:"request_id_required",message:`a structured result requires request_id${o===null?"":` (pending request: ${o.request_id})`}`,next:"Pass `--request <request-id>` exactly as named in the structured-output instruction."})}const i=Object.hasOwn(t,"value"),n=Object.hasOwn(t,"decline");if(i&&n)throw f("a result submission carries either { value } or { decline, code, retryable }, not both");if(n){const{decline:o,code:a,retryable:c}=t;if(typeof o!="string"||o.trim()==="")throw new u({error:"missing_decline_reason",message:"A decline needs a reason.",next:'Rerun with `--decline "<one sentence on why the schema cannot be honestly satisfied>" --code <token>`.'});if(o.length>I)throw new u({error:"decline_reason_too_long",message:`A decline reason is at most ${I} characters (got ${o.length}).`,next:"Keep the reason to one plain sentence; put any detail in an artifact and name its path."});if(typeof a!="string"||a.trim()===""||/\s/.test(a.trim())||a.trim().length>N)throw new u({error:"invalid_decline_code",message:`A decline needs a code: one whitespace-free token of at most ${N} characters naming the decline class.`,next:"Rerun with `--code <token>` \u2014 the token your requester documented for this case."});if(typeof c!="boolean")throw f("a decline carries `retryable` as a boolean");return{requestId:r.trim(),declined:{reason:o.trim(),code:a.trim(),retryable:c}}}if(!i)throw f("a result submission requires a JSON body { value } or { decline, code, retryable }");return{requestId:r.trim(),value:t.value}}s(ce,"parseSubmitBody");const le=1024*1024;async function fe(t){const e=t.params.id,r=await g(e);await _(e)!==null&&await ne(e);const i=await ce(t.body,e),n=await S(i.requestId);if(n===null||n.node_id!==e)throw new h(404,"structured_request_not_found","the named structured request does not belong to this node");if(n.state!=="pending")throw new h(409,n.state==="expired"?"structured_request_expired":"structured_request_settled",`structured request ${n.request_id} is already ${n.state}`);let o;if("value"in i){if(Buffer.byteLength(JSON.stringify(i.value)??"")>le)throw new u({error:"result_too_large",message:"the submitted result is over 1 MiB serialized; nothing was recorded.",next:"Submit a smaller result \u2014 write bulky content to a file and put its path in the result."});try{o=await re(n.schema,i.value)}catch(l){throw new u({error:"result_schema_mismatch",message:`the submitted result does not match the requested schema: ${l.message}`,next:'Fix the listed fields and submit again; if the schema cannot be honestly satisfied, decline it (`submit_result` with `decline`, or `crtr push result --decline "<reason>" --code <token>`).'})}}const a="declined"in i?ue(i.declined):de(o);if(n.submission==="oneoff"){const l=await G(async C=>await ie(C,n.request_id,"declined"in i?{intended:"declined",declined:i.declined}:{intended:"completed",result:o}));if(!l.changed||l.row===null||l.row.state!=="completed"&&l.row.state!=="declined")throw new h(409,l.row?.state==="expired"?"structured_request_expired":"structured_request_settled",`structured request ${n.request_id} is already ${l.row?.state??"settled"}`);await R(l.row);const y=await b(e,{tier:"update",body:a},void 0,{requestMessageId:n.request_message_id});return await T(e,y.reportId),{status:200,body:{mode:n.submission,report:y.report,notified:[...y.deliveredTo],..."declined"in i?{declined:i.declined}:{}}}}const c=(await d(e))?.status,m=await O(e),p="declined"in i?{kind:"failure",reason:"declined",detailJson:JSON.stringify({schema:"crtr.node-outcome-detail/v1",message:i.declined.reason,declined:i.declined}),structured:{requestId:n.request_id,declined:i.declined,skipEffects:!0}}:{structured:{requestId:n.request_id,value:o,skipEffects:!0}},w=await b(e,{tier:"final",body:a},p);await A(e);const F=await S(n.request_id);await R(F),await T(e,w.reportId);const v=c===void 0?void 0:{from:c,to:(await d(e))?.status??"done"};return{status:200,body:{mode:n.submission,report:w.report,notified:[...w.deliveredTo],..."declined"in i?{declined:i.declined}:{},...v===void 0?{}:{transitioned:v},...m===void 0?{}:{worktree_auto_dropped:!0,worktree_auto_dropped_path:m}}}}s(fe,"handleSubmitResult");async function T(t,e){const r=(await q(t)).find(n=>n.id===e);if(r===void 0)return;x.report(t,r);const i=(await d(t))?.run_id;i&&await E(i,t,"node.report.pushed",{body:r.body,kind:r.tier==="final"?"final":"update"})}s(T,"emitReportEvents");async function A(t){try{const e=await D(t);e!==null&&B(t,"pushedFinal",e.executionId)}catch(e){try{j({event:"daemon.node.final-marker.failed",level:"error",node_id:t,error:e})||process.stderr.write(`final marker failed for ${t}: ${String(e)}
|
|
13
13
|
`)}catch{process.stderr.write(`final marker failed for ${t}: ${String(e)}
|
|
14
|
-
`)}}}
|
|
14
|
+
`)}}}s(A,"markCommittedFinal");async function b(t,e,r,i){try{return await J(t,{kind:e.tier,body:e.body,...e.delivery_tier===void 0?{}:{deliveryTier:e.delivery_tier},...r===void 0?{}:{outcome:r},...i===void 0?{}:{result:i}})}catch(n){throw n instanceof z?new h(409,n.message,n.message==="structured_request_expired"?"the named structured request expired before this submission committed":"the named structured request is already settled"):n instanceof k&&n.code==="already_finalized"?new u({error:"already_finalized",message:"This node already submitted its canonical final result.",next:"Push an update with the new information, then stop."}):n instanceof k&&n.code==="finalization_forbidden"?new u({error:"finalization_forbidden",message:"A canceled or dead node cannot submit a canonical final result.",next:"Do not push final from this node."}):n}}s(b,"pushOrRethrow");async function q(t){const e=await K(),r=await Y(e,await Z(e,{class:"person"},async()=>[]),{type:"document",kind:"report",owner:await Q(e,t)}),i=await oe(r,async o=>({doc:o,head:(await V(e,o))[0]})),n=await U(e,i.flatMap(o=>o.head===void 0?[]:[o.head.body_hash]));return i.map(({doc:o,head:a})=>{const c=o.name.match(/-(update|urgent|final)$/)?.[1]??"update";return{name:o.name,id:o.id,tier:c,body:a===void 0?"":n.get(a.body_hash).trim(),created:o.created_at}}).sort((o,a)=>o.created<a.created?1:o.created>a.created?-1:a.name.localeCompare(o.name))}s(q,"reportsForNode");async function me(t){const e=t.params.id;await g(e);const r=t.query.get("tier"),i=t.query.get("limit"),n=i!==null?Number(i):void 0;let o=await q(e);return r!==null&&(o=o.filter(a=>a.tier===r)),n!==void 0&&Number.isFinite(n)&&n>=0&&(o=o.slice(0,n)),{status:200,body:o}}s(me,"handleList");const Be=[{method:"POST",pattern:"/v1/nodes/:id/reports",ownerOnly:!0,handler:se},{method:"GET",pattern:"/v1/nodes/:id/reports",handler:me},{method:"POST",pattern:"/v1/nodes/:id/result",handler:fe}];export{Be as reportRoutes,q as reportsForNode};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
var
|
|
1
|
+
var i=Object.defineProperty;var r=(e,t)=>i(e,"name",{value:t,configurable:!0});import{migrateLegacyInboxIdentities as a}from"../core/feed/inbox-migrate.js";import{backfillComputedRev as s}from"../core/grants/mirror.js";import{copyBodyFilesToTable as n}from"../core/graph/bodies-boot-copy.js";import{isCloudRole as o}from"../core/canvas/person-state.js";import{emitEvent as c}from"../core/events/emit.js";const h=[{id:"legacy-inbox-identities",description:"normalize pre-cutover inbox entry/operation ids (UUID-spelled or missing) and cursors (ISO-timestamp boundaries) into canonical 32-lowercase-hex identities the strict inbox reader requires.",apply:r(()=>{const e=a();return{changed:e.nodes>0||e.failures>0,summary:{...e}}},"apply")},{id:"grant-computed-rev",description:"mark grant rows a pre-C-D2 build wrote (scopes computed, computed_rev NULL) as computed for their revision, so the terminal grant reads as active before the first directory sync after an upgrade or rollback (NL-550). A cloud role skips it: the directory owns its shared rows.",apply:r(async()=>{if(o())return{changed:!1,summary:{}};try{const e=await s();return{changed:e>0,summary:{rows:e}}}catch(e){return c({level:"warn",event:"daemon.boot_migration.failed",error:e,fields:{migration:"grant-computed-rev"}}),{changed:!1,summary:{}}}},"apply")},{id:"bodies-to-table",description:"copy document text from the old <home>/bodies files into the bodies table (D106). Verifies each file by sha256, skips and reports mismatches, leaves the files for rollback. A cloud role copies nothing.",apply:r(async()=>{if(o())return{changed:!1,summary:{}};const e=await n();return{changed:e.copied>0||e.mismatched.length>0,summary:{...e}}},"apply")}];export{h as BOOT_MIGRATIONS};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
var g=Object.defineProperty;var n=(e,t)=>g(e,"name",{value:t,configurable:!0});import{withCanvasWrite as j}from"../../core/canvas/db.js";import{get as S}from"../../core/graph/bodies.js";import{documentById as q,editDocument as C,heads as $}from"../../core/graph/documents.js";import{readerFor as k}from"../../core/graph/reader.js";import{warmDocumentWatchers as J}from"../api/reader.js";import{checkoutsForCwd as x}from"../../core/graph/repo-sync/repos.js";import{snapshotCommentsLocked as N}from"../../core/review/comments.js";import{readReviewSource as O}from"../../core/review/document.js";import{projectReviewCancellation as T,projectReviewResult as D,buildReviewResult as A}from"../../core/review/project.js";import{signalReviewActivity as p}from"../../core/review/signal.js";import{clearReviewSubmit as E,getReview as W,getReviewByCompanion as B,requestReviewSubmit as F,requireVisibleReview as u}from"../../core/review/store.js";import{ReviewOperationError as w}from"../../core/review/types.js";import{settleHumanRequest as v}from"../human/settle.js";import{retireCompanion as h}from"../companion-retire.js";import{companionHasQueuedWork as H,companionMidTurn as M,companionStillWorking as L}from"./companion.js";import{renderApprovalMessage as P}from"./deliver.js";function f(){return new Date().toISOString()}n(f,"now");function l(e,t){throw new w("review_terminal","review already has a terminal outcome",{state:e.state,requested:t,review:e})}n(l,"terminalConflict");function _(e){if(e.result_json===null)throw new Error(`approved review lacks its immutable result: ${e.review_id}`);return JSON.parse(e.result_json)}n(_,"approvedResult");function y(e){return`${e.review_dir}/result.json`}n(y,"resultPath");function Q(e){return{project:n(async t=>{await D(await u(t.request_id),e)},"project"),retire:n(async(t,o)=>{await h(t,o)},"retire")}}n(Q,"effects");function V(e){return{label:"review approved by the user",disposition:null,body_json:{review_id:e.review_id,result_path:y(e),body:P(e,y(e))}}}n(V,"approvalNotification");function z(e,t,o){const i=o==="dismissed";return{label:i?"review dismissed":"review canceled",disposition:"human-canceled",body_json:{review_id:e.review_id,disposition:o,body:i?`The review of \`${e.document_name??e.file}\` was dismissed without approval.`:`The review of \`${e.document_name??e.file}\` was canceled${t===""?"":` \u2014 ${t}`}.`}}}n(z,"cancellationNotification");async function G(e,t,o){if(t.document_id===null||t.document_base===null)return;const i=n(async d=>await x(e,d),"reposFn"),a=await q(e,t.document_id),s=await k(e,{class:"person"},i),c=await C(e,s,a,{body:o},`edited in review ${t.review_id}`,t.document_base,{},i);if(!("stale"in c))return;const r=await $(e,a);if(!(r.length===1&&S(r[0].body_hash)===o))throw new w("stale_revision",`${t.document_name??a.name} changed since the review began; the reviewed text was not saved`,{review_id:t.review_id,document:t.document_name??a.name,base:t.document_base,heads_key:c.stale.heads_key,revision:c.stale.revision,next:`Read the current revision with \`crtr canvas read ${a.id}\`, then start a new review of it.`})}n(G,"saveReviewedDocument");async function b(e){if(e.state==="canceled")return l(e,"submit");if(e.state==="approved")return{outcome:"already_settled",record:e,result:_(e)};const t=await O(e.file,"submit");e.document_id!==null&&await J(e.document_id);const{result:o,resultJson:i}=await j(async c=>{const r=await u(e.review_id);if(r.state==="canceled")return l(r,"submit");if(r.state==="approved")return{result:_(r),resultJson:r.result_json};const d=await N(c,r.review_id),m=A(r,d,t.sha256,f());return m.changed&&await G(c,r,new TextDecoder("utf-8").decode(t.bytes)),{result:m,resultJson:JSON.stringify(m)}}),a=await v({request_id:e.review_id,outcome:"approved",result_json:i,notification:V({...e,changed:o.changed}),post_commit:Q(o)});a.outcome==="settled"&&p();const s=await u(e.review_id);return a.outcome==="already_settled"&&s.state!=="approved"?l(s,"submit"):{outcome:a.outcome,record:s,result:a.outcome==="settled"?o:_(s)}}n(b,"approveReview");async function le(e){const t=await u(e);return t.state==="canceled"?l(t,"submit"):t.state==="open"&&await L(t.companion_node_id)?(await F(e,f())&&p(),{outcome:"awaiting_companion",record:await u(e)}):b(t)}n(le,"submitReviewApproval");async function K(e,t){const o=await W(e);if(o===null||o.state!=="open"||o.submit_requested_at===null||await H(o.companion_node_id)||!t.atCompanionTurnEnd&&await M(o.companion_node_id))return null;try{return await b(o)}catch(i){throw i instanceof w&&i.code==="stale_revision"&&(await E(e),p()),i}}n(K,"completeRequestedSubmit");async function pe(e){const t=await B(e);return t===null?null:K(t.review_id,{atCompanionTurnEnd:!0})}n(pe,"completeCompanionRequestedSubmit");async function we(e,t={}){const o=await u(e);if(o.state==="approved")return l(o,"cancel");const i=f(),a=t.reason??"",s=t.disposition??"canceled",c=JSON.stringify({schema:"humanloop.cancel/v1",kind:"canceled",canceledAt:i,...a===""?{}:{reason:a},...t.actor===void 0?{}:{actor:t.actor},...s==="dismissed"?{disposition:s}:{}}),r=await v({request_id:e,outcome:s==="dismissed"?"dismissed":"canceled",result_json:c,notification:z(o,a,s),post_commit:{project:n(async m=>{await T(await u(m.request_id),JSON.parse(c))},"project"),retire:n(async(m,R)=>{await h(m,R)},"retire")}});r.outcome==="settled"&&p();const d=await u(e);return r.outcome==="already_settled"&&d.state==="approved"?l(d,"cancel"):{outcome:r.outcome,record:d}}n(we,"cancelReview");export{we as cancelReview,pe as completeCompanionRequestedSubmit,K as completeRequestedSubmit,le as submitReviewApproval};
|
|
1
|
+
var g=Object.defineProperty;var n=(e,t)=>g(e,"name",{value:t,configurable:!0});import{withCanvasWrite as j}from"../../core/canvas/db.js";import{get as S}from"../../core/graph/bodies.js";import{documentById as q,editDocument as C,heads as $}from"../../core/graph/documents.js";import{readerFor as k}from"../../core/graph/reader.js";import{warmDocumentWatchers as J}from"../api/reader.js";import{checkoutsForCwd as x}from"../../core/graph/repo-sync/repos.js";import{snapshotCommentsLocked as N}from"../../core/review/comments.js";import{readReviewSource as O}from"../../core/review/document.js";import{projectReviewCancellation as T,projectReviewResult as D,buildReviewResult as A}from"../../core/review/project.js";import{signalReviewActivity as p}from"../../core/review/signal.js";import{clearReviewSubmit as E,getReview as W,getReviewByCompanion as B,requestReviewSubmit as F,requireVisibleReview as u}from"../../core/review/store.js";import{ReviewOperationError as w}from"../../core/review/types.js";import{settleHumanRequest as v}from"../human/settle.js";import{retireCompanion as h}from"../companion-retire.js";import{companionHasQueuedWork as H,companionMidTurn as M,companionStillWorking as L}from"./companion.js";import{renderApprovalMessage as P}from"./deliver.js";function f(){return new Date().toISOString()}n(f,"now");function l(e,t){throw new w("review_terminal","review already has a terminal outcome",{state:e.state,requested:t,review:e})}n(l,"terminalConflict");function _(e){if(e.result_json===null)throw new Error(`approved review lacks its immutable result: ${e.review_id}`);return JSON.parse(e.result_json)}n(_,"approvedResult");function y(e){return`${e.review_dir}/result.json`}n(y,"resultPath");function Q(e){return{project:n(async t=>{await D(await u(t.request_id),e)},"project"),retire:n(async(t,o)=>{await h(t,o)},"retire")}}n(Q,"effects");function V(e){return{label:"review approved by the user",disposition:null,body_json:{review_id:e.review_id,result_path:y(e),body:P(e,y(e))}}}n(V,"approvalNotification");function z(e,t,o){const i=o==="dismissed";return{label:i?"review dismissed":"review canceled",disposition:"human-canceled",body_json:{review_id:e.review_id,disposition:o,body:i?`The review of \`${e.document_name??e.file}\` was dismissed without approval.`:`The review of \`${e.document_name??e.file}\` was canceled${t===""?"":` \u2014 ${t}`}.`}}}n(z,"cancellationNotification");async function G(e,t,o){if(t.document_id===null||t.document_base===null)return;const i=n(async d=>await x(e,d),"reposFn"),a=await q(e,t.document_id),s=await k(e,{class:"person"},i),c=await C(e,s,a,{body:o},`edited in review ${t.review_id}`,t.document_base,{},i);if(!("stale"in c))return;const r=await $(e,a);if(!(r.length===1&&await S(e,r[0].body_hash)===o))throw new w("stale_revision",`${t.document_name??a.name} changed since the review began; the reviewed text was not saved`,{review_id:t.review_id,document:t.document_name??a.name,base:t.document_base,heads_key:c.stale.heads_key,revision:c.stale.revision,next:`Read the current revision with \`crtr canvas read ${a.id}\`, then start a new review of it.`})}n(G,"saveReviewedDocument");async function b(e){if(e.state==="canceled")return l(e,"submit");if(e.state==="approved")return{outcome:"already_settled",record:e,result:_(e)};const t=await O(e.file,"submit");e.document_id!==null&&await J(e.document_id);const{result:o,resultJson:i}=await j(async c=>{const r=await u(e.review_id);if(r.state==="canceled")return l(r,"submit");if(r.state==="approved")return{result:_(r),resultJson:r.result_json};const d=await N(c,r.review_id),m=A(r,d,t.sha256,f());return m.changed&&await G(c,r,new TextDecoder("utf-8").decode(t.bytes)),{result:m,resultJson:JSON.stringify(m)}}),a=await v({request_id:e.review_id,outcome:"approved",result_json:i,notification:V({...e,changed:o.changed}),post_commit:Q(o)});a.outcome==="settled"&&p();const s=await u(e.review_id);return a.outcome==="already_settled"&&s.state!=="approved"?l(s,"submit"):{outcome:a.outcome,record:s,result:a.outcome==="settled"?o:_(s)}}n(b,"approveReview");async function le(e){const t=await u(e);return t.state==="canceled"?l(t,"submit"):t.state==="open"&&await L(t.companion_node_id)?(await F(e,f())&&p(),{outcome:"awaiting_companion",record:await u(e)}):b(t)}n(le,"submitReviewApproval");async function K(e,t){const o=await W(e);if(o===null||o.state!=="open"||o.submit_requested_at===null||await H(o.companion_node_id)||!t.atCompanionTurnEnd&&await M(o.companion_node_id))return null;try{return await b(o)}catch(i){throw i instanceof w&&i.code==="stale_revision"&&(await E(e),p()),i}}n(K,"completeRequestedSubmit");async function pe(e){const t=await B(e);return t===null?null:K(t.review_id,{atCompanionTurnEnd:!0})}n(pe,"completeCompanionRequestedSubmit");async function we(e,t={}){const o=await u(e);if(o.state==="approved")return l(o,"cancel");const i=f(),a=t.reason??"",s=t.disposition??"canceled",c=JSON.stringify({schema:"humanloop.cancel/v1",kind:"canceled",canceledAt:i,...a===""?{}:{reason:a},...t.actor===void 0?{}:{actor:t.actor},...s==="dismissed"?{disposition:s}:{}}),r=await v({request_id:e,outcome:s==="dismissed"?"dismissed":"canceled",result_json:c,notification:z(o,a,s),post_commit:{project:n(async m=>{await T(await u(m.request_id),JSON.parse(c))},"project"),retire:n(async(m,R)=>{await h(m,R)},"retire")}});r.outcome==="settled"&&p();const d=await u(e);return r.outcome==="already_settled"&&d.state==="approved"?l(d,"cancel"):{outcome:r.outcome,record:d}}n(we,"cancelReview");export{we as cancelReview,pe as completeCompanionRequestedSubmit,K as completeRequestedSubmit,le as submitReviewApproval};
|
|
@@ -4,7 +4,5 @@ import type { CanvasDb } from '../../core/canvas/db.js';
|
|
|
4
4
|
export declare const IMPORT_DONE_KEY = "canvas-import";
|
|
5
5
|
export declare const IMPORT_ID = "004-canvas-documents";
|
|
6
6
|
export declare function readImportRecord(db: CanvasDb): Promise<ImportReport | null>;
|
|
7
|
-
/**
|
|
8
|
-
export declare function
|
|
9
|
-
/** Run inside the caller's write transaction. Throws on any divergence from the plan. */
|
|
10
|
-
export declare function applyPlan(db: CanvasDb, plan: ImportPlan, hashes: ReadonlyMap<string, string>): Promise<void>;
|
|
7
|
+
/** Run inside the caller's write transaction; each revision's text is stored in it. Throws on any divergence from the plan. */
|
|
8
|
+
export declare function applyPlan(db: CanvasDb, plan: ImportPlan): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
var x=Object.defineProperty;var
|
|
1
|
+
var x=Object.defineProperty;var c=(n,a)=>x(n,"name",{value:a,configurable:!0});import{put as N}from"../../core/graph/bodies.js";import{importDocument as O}from"../../core/graph/documents.js";import{linksIn as _}from"../../core/graph/documents.js";import{recordActedOn as M,setLinks as R}from"../../core/graph/edges.js";import{resolveName as $}from"../../core/graph/names.js";import{ensureOwner as y,nodeObject as k,ownerForGrantee as b}from"../../core/graph/objects.js";import{ensureRepo as S}from"../../core/graph/repo-sync/repos.js";import{recordWatch as T}from"../../core/graph/watches.js";import{mapAsync as A}from"../../core/async-array.js";import{personId as K}from"../../core/canvas/person.js";const v="canvas-import",j="004-canvas-documents";async function Y(n){const a=await n.prepareUncached("SELECT value FROM canvas_meta WHERE key = ?").get(v);if(a===void 0)return null;const i=JSON.parse(a.value).report;return{...i,resolutions:i.resolutions??[]}}c(Y,"readImportRecord");async function q(n,a){const i=new Map;for(const e of a.documents)for(const t of e.revisions)i.has(t.body)||i.set(t.body,await N(n,t.body));const l=new Map(a.owners.map(e=>[e.key,e])),u=new Map,w=c(async e=>{const t=u.get(e.key);if(t)return t;let o;switch(e.type){case"person":o=await b(n,K());break;case"app":o=await y(n,"app","app",`app:${e.handle}`,e.handle);break;case"profile":{const p=l.get(e.ownerKey);if(!p)throw new Error(`import: profile ${e.key} names unplanned app ${e.ownerKey}`);o=await y(n,"profile","profile",e.key.slice(8),e.handle,await w(p));break}case"repo":o=await S(n,{scheme:e.scheme,externalId:e.externalId,handleHint:e.handle},e.handle);break;case"node":o=await k(n,e.handle);break}if(e.type!=="node"&&o.name!==e.handle)throw new Error(`import: owner ${e.key} holds handle ${o.name}, planned ${e.handle}`);return u.set(e.key,o),o},"ownerRow"),I={class:"person",person:await w(l.get("person")??{key:"person",type:"person",handle:"user"})},f=new Map,m=c(async e=>{let t=f.get(e);return t||f.set(e,t=await k(n,e)),t},"node"),h=[];for(const e of a.documents){const t=await w(l.get(e.ownerKey)),o=await O(n,{owner:t,name:e.name,kind:e.kind,preview:e.preview,privacy:e.privacy,summary:e.summary,whyItExists:e.whyItExists,unlisted:e.unlisted,rules:e.rules,lintIgnore:e.lintIgnore,extensions:e.extensions,revisions:await A(e.revisions,async r=>({body_hash:i.get(r.body),author:r.authorNodeId===null?null:await m(r.authorNodeId),rationale:r.rationale,created_at:r.createdAt}))}),p=new Set(e.revisions.flatMap(r=>r.authorNodeId===null?[]:[r.authorNodeId]));h.push({doc:o,owner:t,body:e.revisions[e.revisions.length-1].body,authors:p})}for(const{doc:e,owner:t,body:o,authors:p}of h){const r=[];for(const s of _(o)){const g=s.includes("/")?[s]:[`${t.type==="node"?t.id:t.name}/${s}`,s];for(const E of g){const d=await $(n,I,E);if("object"in d){r.push({written_as:s,dst:d.object});break}if("deleted"in d){r.push({written_as:s,dst:d.deleted});break}}}await R(n,e,r);for(const s of p)await M(n,await m(s),e),await T(n,await m(s),e,"write")}await n.prepareUncached("INSERT INTO canvas_meta (key, value) VALUES (?, ?)").run(v,JSON.stringify({id:j,report:a.report}))}c(q,"applyPlan");export{v as IMPORT_DONE_KEY,j as IMPORT_ID,q as applyPlan,Y as readImportRecord};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var R=Object.defineProperty;var c=(r,n)=>R(r,"name",{value:n,configurable:!0});import{existsSync as
|
|
2
|
-
LEFT JOIN identities i ON i.object = o.id WHERE o.type IN ('person','app','repo','profile')`).all();return
|
|
1
|
+
var R=Object.defineProperty;var c=(r,n)=>R(r,"name",{value:n,configurable:!0});import{existsSync as y}from"node:fs";import{join as f}from"node:path";import{openDb as l,withCanvasWrite as u}from"../../core/canvas/db.js";import{nodeAgentDir as E,nodeRecordDir as S,onDiskMigrationMarkerPath as L}from"../../core/canvas/paths.js";import{identifyCheckout as I}from"../../core/graph/repo-sync/identity.js";import{profileSpace as k,userRoot as C}from"../../core/layout.js";import{deleteLegacyProjectCaps as _,listLegacyProjectCaps as j,readLegacyUserSnapshot as O}from"../../core/scoped-state/legacy-profiles.js";import{personIdAsync as b}from"../../core/canvas/person.js";import{userStore as A}from"../../core/scoped-state/paths.js";import{userScopeRoot as w}from"../../core/scope.js";import{LEGACY_LOCAL_PERSON as D}from"../../core/canvas/legacy-person.js";import{applyPlan as P,readImportRecord as h}from"./apply.js";import{readLegacyCorpus as v,readMarkerIds as x}from"./legacy/discover.js";import{planImport as M}from"./plan.js";const N=c(()=>({stores:[],counts:{},rewrites:[],droppedFields:[],skipped:[],resolutions:[]}),"emptyReport");async function T(){const r=w(),n=O(r)?.profiles??[],t=j(r),d=A(r).path,a=n.map(({profileId:e,manifest:i})=>{const s=i.grantee??"app:terminal",m=new Map(t.filter(o=>o.profileId===e).map(o=>[o.path,o.memory]));return{id:e,name:i.name,app:s,memory:k(s,e).dir,projects:i.projects.map(o=>o.path),raw:{projects:i.projects.map(o=>m.has(o.path)?{path:o.path,memory:m.get(o.path)}:{path:o.path})},manifestPath:`${d}#${e}`}}),p=await(await l()).prepareUncached("SELECT node_id, cwd, grantee FROM node_rows ORDER BY created").all(),g=p.map(e=>{const i=e.grantee===D?"app:terminal":e.grantee,s=i?.startsWith("app:")?E(e.node_id,i):null,m=s!==null&&(y(f(s,"context"))||y(f(s,"reports")))?s:S(e.node_id);return{id:e.node_id,dir:m}});return{roots:{userMemory:f(C(),"memory"),profiles:a,nodeCwds:[...new Set(p.map(e=>e.cwd))],nodes:g},stored:n}}c(T,"legacyRoots");async function F(){const{roots:r,stored:n}=await T(),t=v(r),d=await(await l()).prepareUncached(`SELECT o.type, o.name AS handle, i.external_id AS externalId FROM objects o
|
|
2
|
+
LEFT JOIN identities i ON i.object = o.id WHERE o.type IN ('person','app','repo','profile')`).all();return M(t,{roots:r,markerIds:x(L()),repoIdentity:I,existingOwners:d,storedProfiles:n.map(a=>({id:a.profileId,deliveryLimits:{...a.manifest.delivery_limits??{}}}))})}c(F,"plan");async function rr(){return await h(await l())!==null}c(rr,"canvasImportDone");async function er(r){const n=await h(await l());if(n!==null)return{report:r.dryRun?n:N(),blockers:[],dryRun:r.dryRun,pending:!1};const t=await F();if(r.dryRun||t.blockers.length>0)return{report:t.report,blockers:t.blockers,dryRun:r.dryRun,pending:!0};const d=await b();return await u(async a=>{for(const p of t.profileLimits)if((await a.prepare("UPDATE profiles SET delivery_limits_json = ? WHERE id = ? AND person = ?").run(JSON.stringify(p.deliveryLimits),p.profileId,d)).changes!==1)throw new Error(`no stored profile ${p.profileId}`)}),_(w()),await u(async a=>await P(a,t)),{report:t.report,blockers:[],dryRun:!1,pending:!1}}c(er,"runCanvasImport");export{rr as canvasImportDone,er as runCanvasImport};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@north-light/cli",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.580",
|
|
4
4
|
"description": "crtr — agent runtime with memory, plugins, and marketplaces",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -145,7 +145,7 @@
|
|
|
145
145
|
},
|
|
146
146
|
"license": "UNLICENSED",
|
|
147
147
|
"dependencies": {
|
|
148
|
-
"@north-light/identity": "0.3.
|
|
148
|
+
"@north-light/identity": "0.3.580",
|
|
149
149
|
"@earendil-works/chord": "1.1.0",
|
|
150
150
|
"@earendil-works/pi-agent-core": "1.1.0",
|
|
151
151
|
"@earendil-works/pi-ai": "1.1.0",
|
package/runtime.lock.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@north-light/cli",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.580",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "@north-light/cli",
|
|
9
|
-
"version": "0.3.
|
|
9
|
+
"version": "0.3.580",
|
|
10
10
|
"hasInstallScript": true,
|
|
11
11
|
"license": "UNLICENSED",
|
|
12
12
|
"workspaces": [
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
"@milkdown/preset-gfm": "^7.22.3",
|
|
29
29
|
"@milkdown/prose": "^7.22.3",
|
|
30
30
|
"@milkdown/utils": "^7.22.3",
|
|
31
|
-
"@north-light/identity": "0.3.
|
|
31
|
+
"@north-light/identity": "0.3.580",
|
|
32
32
|
"cron-parser": "^5.6.0",
|
|
33
33
|
"esbuild": "^0.27.7",
|
|
34
34
|
"jose": "^6.2.12",
|
|
@@ -11956,17 +11956,17 @@
|
|
|
11956
11956
|
},
|
|
11957
11957
|
"packages/crouter-api": {
|
|
11958
11958
|
"name": "@north-light/api",
|
|
11959
|
-
"version": "0.3.
|
|
11959
|
+
"version": "0.3.580",
|
|
11960
11960
|
"license": "UNLICENSED"
|
|
11961
11961
|
},
|
|
11962
11962
|
"packages/crouter-env-docker": {
|
|
11963
11963
|
"name": "@north-light/env-docker",
|
|
11964
|
-
"version": "0.3.
|
|
11964
|
+
"version": "0.3.580",
|
|
11965
11965
|
"license": "UNLICENSED"
|
|
11966
11966
|
},
|
|
11967
11967
|
"packages/crouter-identity": {
|
|
11968
11968
|
"name": "@north-light/identity",
|
|
11969
|
-
"version": "0.3.
|
|
11969
|
+
"version": "0.3.580",
|
|
11970
11970
|
"license": "UNLICENSED",
|
|
11971
11971
|
"dependencies": {
|
|
11972
11972
|
"jose": "^6.2.1"
|
|
@@ -11974,21 +11974,21 @@
|
|
|
11974
11974
|
},
|
|
11975
11975
|
"packages/crouter-plugin": {
|
|
11976
11976
|
"name": "@north-light/plugin",
|
|
11977
|
-
"version": "0.3.
|
|
11977
|
+
"version": "0.3.580",
|
|
11978
11978
|
"license": "UNLICENSED",
|
|
11979
11979
|
"dependencies": {
|
|
11980
|
-
"@north-light/api": "0.3.
|
|
11981
|
-
"@north-light/identity": "0.3.
|
|
11980
|
+
"@north-light/api": "0.3.580",
|
|
11981
|
+
"@north-light/identity": "0.3.580"
|
|
11982
11982
|
}
|
|
11983
11983
|
},
|
|
11984
11984
|
"packages/crouter-sdk": {
|
|
11985
11985
|
"name": "@north-light/sdk",
|
|
11986
|
-
"version": "0.3.
|
|
11986
|
+
"version": "0.3.580",
|
|
11987
11987
|
"license": "UNLICENSED",
|
|
11988
11988
|
"dependencies": {
|
|
11989
|
-
"@north-light/api": "0.3.
|
|
11990
|
-
"@north-light/identity": "0.3.
|
|
11991
|
-
"@north-light/plugin": "0.3.
|
|
11989
|
+
"@north-light/api": "0.3.580",
|
|
11990
|
+
"@north-light/identity": "0.3.580",
|
|
11991
|
+
"@north-light/plugin": "0.3.580",
|
|
11992
11992
|
"jose": "^6.2.1"
|
|
11993
11993
|
},
|
|
11994
11994
|
"bin": {
|